恶魔之轮 10.0 版本
2025-02-09 12:17:05
发布于:浙江
import socket
import threading
import time
import random
import string
# 存储用户信息,格式:{用户ID: [用户名, 密码, 分数, 关注列表, 粉丝列表]}
users = {}
# 存储在线玩家的连接
online_players = {}
# 存储等待匹配的玩家
waiting_players = []
def generate_id():
return ''.join(random.choices(string.digits, k=10))
def save_users():
"""保存用户信息到文件"""
with open('users.txt', 'w') as f:
for user_id, info in users.items():
follow_list_str = '|'.join(info[3])
follower_list_str = '|'.join(info[4])
f.write(f"{user_id},{info[0]},{info[1]},{info[2]},{follow_list_str},{follower_list_str}\n")
def load_users():
global users
users = {}
try:
with open('users.txt', 'r') as f:
for line in f:
parts = line.strip().split(',')
user_id = parts[0]
username = parts[1]
password = parts[2]
score = int(parts[3])
follow_list = parts[4].split('|') if parts[4] else []
follower_list = parts[5].split('|') if parts[5] else []
users[user_id] = [username, password, score, follow_list, follower_list]
except FileNotFoundError:
pass
# 语言字典
LANGUAGES = {
'zh': {
'register_login_prompt': "1. 注册\n2. 登录\n请选择操作(输入数字):",
'username_exists': "该用户名已被使用,请选择其他用户名。",
'register_success': "注册成功!您的ID为: ",
'id_not_found': "该ID不存在,请先注册。",
'password_error': "密码错误,请重新输入。",
'login_success': "登录成功!",
'join_chat': " 加入了聊天!",
'leave_chat': " 离开了聊天!",
'matching': "正在为您匹配对手,请稍候...",
'matched': "已为您匹配到对手: ",
'welcome': "欢迎来到恶魔之轮游戏聊天区!",
'invalid_input': "输入无效,请重新输入!",
'game_start': "游戏开始!",
'round_start': "第 %d 轮开始!",
'player_turn': "%s 的回合,请选择操作:",
'shoot': "1. 射击",
'use_item': "2. 使用道具",
'skip_round': "3. 跳过本轮",
'shoot_real': "%s 射出实弹,%s 受到 %d 点伤害!",
'shoot_empty': "%s 射出空弹,未造成伤害!",
'item_used': "%s 使用 %s,%s",
'player_wins': "%s 获胜!",
'get_gold': "%s 获得了 %d 枚金币,当前共有 %d 枚金币。",
'shop_prompt': "商店道具及价格:",
'shop_item': "%s:%d 枚金币",
'buy_item': "请输入要购买的道具名称(输入 '不买' 退出):",
'not_enough_gold': "金币不足,无法购买!",
'item_bought': "%s 购买了 %s,剩余金币:%d。",
'demon_action': "恶魔行动,随机攻击玩家!",
'minigame_start': "%s 小游戏开始!",
'minigame_result': "%s 小游戏结果:%s",
'no_bullets': "没有子弹了,无法射击!"
},
'en': {
'register_login_prompt': "1. Register\n2. Login\nPlease select an operation (enter a number): ",
'username_exists': "This username is already in use. Please choose another one.",
'register_success': "Registration successful! Your ID is: ",
'id_not_found': "This ID does not exist. Please register first.",
'password_error': "Incorrect password. Please try again.",
'login_success': "Login successful!",
'join_chat': " joined the chat!",
'leave_chat': " left the chat!",
'matching': "Matching an opponent for you. Please wait...",
'matched': "You've been matched with: ",
'welcome': "Welcome to the Demon's Wheel game chat area!",
'invalid_input': "Invalid input. Please try again!",
'game_start': "Game starts!",
'round_start': "Round %d starts!",
'player_turn': "%s's turn. Please choose an action:",
'shoot': "1. Shoot",
'use_item': "2. Use item",
'skip_round': "3. Skip this round",
'shoot_real': "%s shoots a real bullet. %s takes %d damage!",
'shoot_empty': "%s shoots an empty bullet. No damage!",
'item_used': "%s uses %s. %s",
'player_wins': "%s wins!",
'get_gold': "%s gets %d gold coins. Now has %d gold coins in total.",
'shop_prompt': "Shop items and prices:",
'shop_item': "%s: %d gold coins",
'buy_item': "Please enter the name of the item to buy (enter 'No buy' to exit): ",
'not_enough_gold': "Not enough gold coins to buy!",
'item_bought': "%s buys %s. Remaining gold coins: %d.",
'demon_action': "The demon acts and randomly attacks a player!",
'minigame_start': "%s minigame starts!",
'minigame_result': "%s minigame result: %s",
'no_bullets': "No bullets left. Cannot shoot!"
}
}
def handle_client(client_socket, client_address):
try:
# 选择语言
client_socket.send("1. 中文\n2. English\n请选择语言 (Enter 1 or 2): ".encode())
lang_choice = client_socket.recv(1024).decode().strip()
lang = 'zh' if lang_choice == '1' else 'en'
# 登录或注册
while True:
client_socket.send(LANGUAGES[lang]['register_login_prompt'].encode())
choice = client_socket.recv(1024).decode().strip()
if choice == '1':
client_socket.send("请输入要注册的用户名: ".encode() if lang == 'zh' else "Please enter a username to register: ".encode())
username = client_socket.recv(1024).decode().strip()
if any(info[0] == username for info in users.values()):
client_socket.send(LANGUAGES[lang]['username_exists'].encode())
continue
client_socket.send("请输入密码: ".encode() if lang == 'zh' else "Please enter a password: ".encode())
password = client_socket.recv(1024).decode().strip()
user_id = generate_id()
users[user_id] = [username, password, 0, [], []]
save_users()
client_socket.send((LANGUAGES[lang]['register_success'] + user_id).encode())
break
elif choice == '2':
client_socket.send("请输入您的ID: ".encode() if lang == 'zh' else "Please enter your ID: ".encode())
user_id = client_socket.recv(1024).decode().strip()
if user_id not in users:
client_socket.send(LANGUAGES[lang]['id_not_found'].encode())
continue
client_socket.send("请输入密码: ".encode() if lang == 'zh' else "Please enter your password: ".encode())
password = client_socket.recv(1024).decode().strip()
if password == users[user_id][1]:
client_socket.send(LANGUAGES[lang]['login_success'].encode())
break
else:
client_socket.send(LANGUAGES[lang]['password_error'].encode())
# 加入在线玩家列表
online_players[user_id] = client_socket
username = users[user_id][0]
broadcast(f"{username}{LANGUAGES[lang]['join_chat']}", lang)
client_socket.send(LANGUAGES[lang]['welcome'].encode())
while True:
message = client_socket.recv(1024).decode()
if not message:
break
if message == '!match':
waiting_players.append(user_id)
client_socket.send(LANGUAGES[lang]['matching'].encode())
match_players(lang)
else:
broadcast(f"{username}: {message}", lang)
except Exception as e:
print(f"Error handling client {client_address}: {e}")
finally:
if user_id in online_players:
del online_players[user_id]
username = users[user_id][0]
broadcast(f"{username}{LANGUAGES[lang]['leave_chat']}", lang)
client_socket.close()
def broadcast(message, lang):
for user_id, socket in online_players.items():
try:
socket.send(message.encode())
except Exception as e:
print(f"Error sending message to {user_id}: {e}")
def match_players(lang):
if len(waiting_players) >= 2:
player1_id = waiting_players.pop(0)
player2_id = waiting_players.pop(0)
player1_socket = online_players[player1_id]
player2_socket = online_players[player2_id]
player1_name = users[player1_id][0]
player2_name = users[player2_id][0]
player1_socket.send((LANGUAGES[lang]['matched'] + player2_name).encode())
player2_socket.send((LANGUAGES[lang]['matched'] + player1_name).encode())
start_game(player1_socket, player2_socket, player1_id, player2_id, lang)
def start_game(player1_socket, player2_socket, player1_id, player2_id, lang):
player1 = {"name": users[player1_id][0], "health": 5, "items": get_random_items(), "coins": 0, "buffed": False, "handcuffed": False, "robot_active": False}
player2 = {"name": users[player2_id][0], "health": 5, "items": get_random_items(), "coins": 0, "buffed": False, "handcuffed": False, "robot_active": False}
real_count, empty_count = generate_bullets()
round_num = 0
player1_socket.send(LANGUAGES[lang]['game_start'].encode())
player2_socket.send(LANGUAGES[lang]['game_start'].encode())
while player1["health"] > 0 and player2["health"] > 0:
round_num += 1
player1_socket.send((LANGUAGES[lang]['round_start'] % round_num).encode())
player2_socket.send((LANGUAGES[lang]['round_start'] % round_num).encode())
for player in [player1, player2]:
opponent = player2 if player is player1 else player1
socket = player1_socket if player is player1 else player2_socket
if player.get("handcuffed", False):
socket.send((LANGUAGES[lang]['item_used'] % (player["name"], "手铐", "跳过本轮。")).encode())
player["handcuffed"] = False
continue
get_gold(player)
socket.send((LANGUAGES[lang]['get_gold'] % (player["name"], player["coins"], player["coins"])).encode())
buy_item(player, socket, lang)
while True:
socket.send((LANGUAGES[lang]['player_turn'] % player["name"]).encode())
socket.send(LANGUAGES[lang]['shoot'].encode())
socket.send(LANGUAGES[lang]['use_item'].encode())
socket.send(LANGUAGES[lang]['skip_round'].encode())
action_choice = socket.recv(1024).decode().strip()
if action_choice == '1':
real_count, empty_count = shoot(player, opponent, real_count, empty_count, socket, lang)
break
elif action_choice == '2':
real_count, empty_count = use_item(player, [opponent], real_count, empty_count, player1, player2, socket, lang)
elif action_choice == '3':
socket.send((LANGUAGES[lang]['item_used'] % (player["name"], "跳过", "本轮。")).encode())
break
else:
socket.send(LANGUAGES[lang]['invalid_input'].encode())
if real_count + empty_count == 0:
demon = {"name": "恶魔"}
for _ in range(5):
real_count, empty_count = demon_action(demon, [player1, player2], real_count, empty_count, player1_socket, player2_socket, lang)
if player1["health"] <= 0 or player2["health"] <= 0:
break
add_random_items(player1)
add_random_items(player2)
if round_num in [3, 4]:
game_choice = random.choice(["恶魔大战", "菜鸟互啄", "双枪设计", "趣味躲靶"])
if game_choice == "恶魔大战":
demon_war(player1, player2, player1_socket, player2_socket, lang)
elif game_choice == "菜鸟互啄":
rookie_pecking(player1, player2, player1_socket, player2_socket, lang)
elif game_choice == "双枪设计":
real_count, empty_count = dual_***_shooting(player1, player2, real_count, empty_count, player1_socket, player2_socket, lang)
elif game_choice == "趣味躲靶":
fun_evasion(player1, player2, player1_socket, player2_socket, lang)
if player1["health"] <= 0:
player1_socket.send((LANGUAGES[lang]['player_wins'] % player2["name"]).encode())
player2_socket.send((LANGUAGES[lang]['player_wins'] % player2["name"]).encode())
users[player2_id][2] += 1
elif player2["health"] <= 0:
player1_socket.send((LANGUAGES[lang]['player_wins'] % player1["name"]).encode())
player2_socket.send((LANGUAGES[lang]['player_wins'] % player1["name"]).encode())
users[player1_id][2] += 1
save_users()
def get_random_items():
"""随机获取3种不同道具"""
all_items = ["小烟", "放大镜", "扳手", "小刀"]
return random.sample(all_items, 3)
def add_random_items(player):
"""每轮结束后为玩家随机添加2种道具"""
all_items = ["小烟", "放大镜", "扳手", "小刀"]
player["items"].extend(random.choices(all_items, k=2))
def generate_bullets():
"""随机生成实弹和空弹数量,总和为10"""
real_count = random.randint(1, 9)
empty_count = 10 - real_count
return real_count, empty_count
def shoot(shooter, target, real_count, empty_count, socket, lang):
if real_count + empty_count == 0:
socket.send(LANGUAGES[lang]['no_bullets'].encode())
return real_count, empty_count
if random.random() < real_count / (real_count + empty_count):
damage = 1
if shooter.get("buffed", False):
damage = int(damage * 1.1)
if target.get("shield", False):
damage = int(damage * 0.5)
target["health"] = max(0, target["health"] - damage)
socket.send((LANGUAGES[lang]['shoot_real'] % (shooter["name"], target["name"], damage)).encode())
real_count -= 1
else:
socket.send((LANGUAGES[lang]['shoot_empty'] % shooter["name"]).encode())
empty_count -= 1
return real_count, empty_count
def use_item(player, opponents, real_count, empty_count, player1, player2, socket, lang):
items = player["items"]
if not items:
socket.send((LANGUAGES[lang]['item_used'] % (player["name"], "无道具", "无法使用。")).encode())
return real_count, empty_count
socket.send("你拥有的道具:".encode() if lang == 'zh' else "Your items:".encode())
for i, item in enumerate(items, start=1):
socket.send((f"{i}. {item}".encode()))
while True:
try:
choice = int(socket.recv(1024).decode().strip())
if choice == 0:
break
elif 1 <= choice <= len(items):
item = items.pop(choice - 1)
break
else:
socket.send(LANGUAGES[lang]['invalid_input'].encode())
except ValueError:
socket.send(LANGUAGES[lang]['invalid_input'].encode())
if item == "小烟":
player["health"] = min(player["health"] + 1, 5)
socket.send((LANGUAGES[lang]['item_used'] % (player["name"], "小烟", f"恢复1点血量,当前血量:{player['health']}。")).encode())
elif item == "放大镜":
next_is_real = random.random() < real_count / (real_count + empty_count)
bullet_type = "实弹" if next_is_real else "空弹"
socket.send((LANGUAGES[lang]['next_bullet'] % bullet_type).encode())
elif item == "扳手":
socket.send(LANGUAGES[lang]['choose_target'].encode())
valid_opponents = [opp for opp in opponents if opp["health"] > 0]
for i, opp in enumerate(valid_opponents, start=1):
socket.send(f"{i}. {opp['name']}".encode())
while True:
try:
target_choice = int(socket.recv(1024).decode().strip())
if 1 <= target_choice <= len(valid_opponents):
target = valid_opponents[target_choice - 1]
break
else:
socket.send(LANGUAGES[lang]['invalid_input'].encode())
except ValueError:
socket.send(LANGUAGES[lang]['invalid_input'].encode())
target["health"] = max(0, target["health"] - 1)
socket.send((LANGUAGES[lang]['item_used'] % (player["name"], "扳手", f"{target['name']} 受到1点伤害!")).encode())
elif item == "小刀":
socket.send(LANGUAGES[lang]['choose_target'].encode())
valid_opponents = [opp for opp in opponents if opp["health"] > 0]
for i, opp in enumerate(valid_opponents, start=1):
socket.send(f"{i}. {opp['name']}".encode())
while True:
try:
target_choice = int(socket.recv(1024).decode().strip())
if 1 <= target_choice <= len(valid_opponents):
target = valid_opponents[target_choice - 1]
break
else:
socket.send(LANGUAGES[lang]['invalid_input'].encode())
except ValueError:
socket.send(LANGUAGES[lang]['invalid_input'].encode())
damage = 2
if target.get("shield", False):
damage = int(damage * 0.5)
target["health"] = max(0, target["health"] - damage)
socket.send((LANGUAGES[lang]['item_used'] % (player["name"], "小刀", f"{target['name']} 受到{damage}点伤害!")).encode())
return real_count, empty_count
def get_gold(player):
gold = random.randint(1, 3)
player["coins"] += gold
return gold
def buy_item(player, socket, lang):
shop_items = {
"手雷": 3,
"盾牌": 2,
"剑": 2,
"伤害药水": 3,
"手铐": 2,
"机器人": 3
}
socket.send(LANGUAGES[lang]['shop_prompt'].encode())
for item, price in shop_items.items():
socket.send((LANGUAGES[lang]['shop_item'] % (item, price)).encode())
while True:
socket.send(LANGUAGES[lang]['buy_item'].encode())
item_choice = socket.recv(1024).decode().strip()
if item_choice == '不买' if lang == 'zh' else 'No buy':
break
if item_choice in shop_items:
price = shop_items[item_choice]
if player["coins"] >= price:
player["coins"] -= price
player["items"].append(item_choice)
socket.send((LANGUAGES[lang]['item_bought'] % (player["name"], item_choice, player["coins"])).encode())
else:
socket.send(LANGUAGES[lang]['not_enough_gold'].encode())
else:
socket.send(LANGUAGES[lang]['invalid_input'].encode())
def demon_action(demon, players, real_count, empty_count, player1_socket, player2_socket, lang):
socket = player1_socket if random.random() < 0.5 else player2_socket
target = next(p for p in players if online_players[users.index([p["name"], None, None, None, None])] == socket)
if real_count + empty_count == 0:
return real_count, empty_count
if random.random() < real_count / (real_count + empty_count):
damage = 1
if target.get("shield", False):
damage = int(damage * 0.5)
target["health"] = max(0, target["health"] - damage)
socket.send((LANGUAGES[lang]['shoot_real'] % (demon["name"], target["name"], damage)).encode())
real_count -= 1
else:
socket.send((LANGUAGES[lang]['shoot_empty'] % demon["name"]).encode())
empty_count -= 1
return real_count, empty_count
def demon_war(player1, player2, player1_socket, player2_socket, lang):
player1_socket.send((LANGUAGES[lang]['minigame_start'] % "恶魔大战").encode())
player2_socket.send((LANGUAGES[lang]['minigame_start'] % "恶魔大战").encode())
# 简单示例,这里可以设计更复杂的恶魔大战逻辑
winner = player1 if random.random() < 0.5 else player2
loser = player2 if winner is player1 else player1
loser["health"] = max(0, loser["health"] - 2)
result_msg = f"{winner['name']} 在恶魔大战中获胜,{loser['name']} 受到2点伤害!"
player1_socket.send((LANGUAGES[lang]['minigame_result'] % ("恶魔大战", result_msg)).encode())
player2_socket.send((LANGUAGES[lang]['minigame_result'] % ("恶魔大战", result_msg)).encode())
def rookie_pecking(player1, player2, player1_socket, player2_socket, lang):
player1_socket.send((LANGUAGES[lang]['minigame_start'] % "菜鸟互啄").encode())
player2_socket.send((LANGUAGES[lang]['minigame_start'] % "菜鸟互啄").encode())
player1_socket.send(LANGUAGES[lang]['defend'].encode())
player1_socket.send(LANGUAGES[lang]['peck'].encode())
player2_socket.send(LANGUAGES[lang]['defend'].encode())
player2_socket.send(LANGUAGES[lang]['peck'].encode())
while True:
action1 = player1_socket.recv(1024).decode().strip()
action2 = player2_socket.recv(1024).decode().strip()
if action1 in ['1', '2'] and action2 in ['1', '2']:
break
else:
if action1 not in ['1', '2']:
player1_socket.send(LANGUAGES[lang]['invalid_input'].encode())
if action2 not in ['1', '2']:
player2_socket.send(LANGUAGES[lang]['invalid_input'].encode())
if action1 == '1' and action2 == '2':
player2["health"] = max(0, player2["health"] - 2)
result_msg = f"{player1['name']} 使用防御盾,{player2['name']} 进行啄啄,{player2['name']} 反伤2点!"
elif action1 == '2' and action2 == '1':
player1["health"] = max(0, player1["health"] - 2)
result_msg = f"{player2['name']} 使用防御盾,{player1['name']} 进行啄啄,{player1['name']} 反伤2点!"
elif action1 == '2' and action2 == '2':
player1["health"] = max(0, player1["health"] - 2)
player2["health"] = max(0, player2["health"] - 2)
result_msg = f"{player1['name']} 和 {player2['name']} 都进行啄啄,双方各受到2点伤害!"
else:
result_msg = f"{player1['name']} 和 {player2['name']} 都使用防御盾,无事发生!"
player1_socket.send((LANGUAGES[lang]['minigame_result'] % ("菜鸟互啄", result_msg)).encode())
player2_socket.send((LANGUAGES[lang]['minigame_result'] % ("菜鸟互啄", result_msg)).encode())
def dual_***_shooting(player1, player2, real_count, empty_count, player1_socket, player2_socket, lang):
player1_socket.send((LANGUAGES[lang]['minigame_start'] % "双枪设计").encode())
player2_socket.send((LANGUAGES[lang]['minigame_start'] % "双枪设计").encode())
for _ in range(2):
real_count, empty_count = shoot(player1, player2, real_count, empty_count, player1_socket, lang)
real_count, empty_count = shoot(player2, player1, real_count, empty_count, player2_socket, lang)
return real_count, empty_count
def fun_evasion(player1, player2, player1_socket, player2_socket, lang):
player1_socket.send((LANGUAGES[lang]['minigame_start'] % "趣味躲靶").encode())
player2_socket.send((LANGUAGES[lang]['minigame_start'] % "趣味躲靶").encode())
directions = ["上", "下", "左", "右"]
demon_direction = random.choice(directions)
player1_socket.send(LANGUAGES[lang]['choose_direction'].encode())
player2_socket.send(LANGUAGES[lang]['choose_direction'].encode())
while True:
evasion1 = player1_socket.recv(1024).decode().strip()
evasion2 = player2_socket.recv(1024).decode().strip()
if evasion1 in directions and evasion2 in directions:
break
else:
if evasion1 not in directions:
player1_socket.send(LANGUAGES[lang]['invalid_input'].encode())
if evasion2 not in directions:
player2_socket.send(LANGUAGES[lang]['invalid_input'].encode())
player1_socket.send((LANGUAGES[lang]['demon_shot'] % demon_direction).encode())
player2_socket.send((LANGUAGES[lang]['demon_shot'] % demon_direction).encode())
if evasion1 == demon_direction:
player1["health"] = max(0, player1["health"] - 2)
player1_socket.send((LANGUAGES[lang]['hit'] % player1["name"]).encode())
else:
player1_socket.send((LANGUAGES[lang]['evaded'] % player1["name"]).encode())
if evasion2 == demon_direction:
player2["health"] = max(0, player2["health"] - 2)
player2_socket.send((LANGUAGES[lang]['hit'] % player2["name"]).encode())
else:
player2_socket.send((LANGUAGES[lang]['evaded'] % player2["name"]).encode())
return
def main():
load_users()
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('0.0.0.0', 8888))
server.listen(5)
print("Server is listening on port 8888...")
while True:
client_socket, client_address = server.accept()
print(f"Accepted connection from {client_address}")
client_handler = threading.Thread(target=handle_client, args=(client_socket, client_address))
client_handler.start()
if __name__ == "__main__":
main()
全部评论 10
编译错误: /code/judger/test/1896512233299742720/Main3.py:260:50: invalid syntax
real_count, empty_count = dual_***_shooting(player1, player2, real_count, empty_count, player1_socket, player2_socket, lang)
^2025-03-03 来自 浙江
2把dual_***_shooting改成dual_gan_shooting!
2025-03-20 来自 浙江
1为什么Ln:260 Col:50 会报错?(我不会Python
2025-02-09 来自 天津
1把这个函数的名称改成dual_gan_shooting
2025-02-10 来自 浙江
0运行后会出现这个
正常吗?然后怎么搞?2025-02-10 来自 天津
0是的,这个是说明正在等待,说明服务器启动成功了
2025-02-10 来自 浙江
0
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 2, in main
File "<stdin>", line 11, in load_users
IndexError: list index out of range2025-03-20 来自 广东
0SyntaxError: multiple statements found while compiling a single statement
???2025-03-08 来自 广东
0SyntaxError: multiple statements found while compiling a single statement
2025-03-08 来自 广东
0Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 2, in main
File "<stdin>", line 15, in load_users
NameError: global name 'FileNotFoundError' is not defined2025-03-05 来自 广东
0@𝒹𝓇𝑒𝒶𝓂
2025-03-05 来自 广东
0
2025-02-25 来自 上海
0编译错误: /code/judger/test/1890730390367547392/Main3.py:3:1: 'time' imported but unused
/code/judger/test/1890730390367547392/Main3.py:180:18: import 'socket' from line 1 shadowed by loop variable2025-02-15 来自 浙江
0d
2025-02-15 来自 浙江
0
编译错误: /code/judger/test/1890330548285779968/Main3.py:260:50: invalid syntax
real_count, empty_count = dual_***_shooting(player1, player2, real_count, empty_count, player1_socket, player2_socket, lang)2025-02-14 来自 浙江
0
有帮助,赞一个