|
|
import turtleimport randomimport time# 设置窗口wn = turtle.Screen()wn.title("枪战游戏")wn.bgcolor("black")wn.setup(width=800, height=600)wn.tracer(0)# 玩家1player1 = turtle.Turtle()player1.color("blue")player1.shape("square")player1.penup()player1.goto(-350, 0)player1.setheading(90)player1.speed(0)player1.lifes = 3 # 玩家1的生命值player1.shielded = False # 玩家1的盾牌状态player1.shield_time = 0 # 盾牌剩余时间# 玩家2player2 = turtle.Turtle()player2.color("red")player2.shape("square")player2.penup()player2.goto(350, 0)player2.setheading(270)player2.speed(0)player2.lifes = 3 # 玩家2的生命值player2.shielded = False # 玩家2的盾牌状态player2.shield_time = 0 # 盾牌剩余时间# 子弹bullets = []bullet_speed = 20# 道具potions = []bombs = []shields = []item_types = ["bomb", "potion", "shield"] # 道具类型def generate_item(item_type): item = turtle.Turtle() item.color("yellow" if item_type == "bomb" else "green" if item_type == "potion" else "blue") item.shape("circle") item.penup() item.goto(random.randint(-350, 350), random.randint(-250, 250)) return item# 分数显示score_display = turtle.Turtle()score_display.color("white")score_display.penup()score_display.hideturtle()score_display.goto(0, 260)score_display.write("玩家1生命值: 3 | 玩家2生命值: 3", align="center", font=("Arial", 24, "normal"))# 玩家1控制def player1_up(): y = player1.ycor() if y < 290: player1.sety(y + 20)def player1_down(): y = player1.ycor() if y > -290: player1.sety(y - 20)def shoot_bullet1(): bullet = turtle.Turtle() bullet.color("white") bullet.shape("circle") bullet.penup() bullet.goto(player1.xcor(), player1.ycor()) bullet.setheading(0) bullets.append(bullet)# 玩家2控制def player2_up(): y = player2.ycor() if y < 290: player2.sety(y + 20)def player2_down(): y = player2.ycor() if y > -290: player2.sety(y - 20)def shoot_bullet2(): bullet = turtle.Turtle() bullet.color("white") bullet.shape("circle") bullet.penup() bullet.goto(player2.xcor(), player2.ycor()) bullet.setheading(180) bullets.append(bullet)# 使用炸弹(击退对方)def use_bomb(): for bomb in bombs: if player1.distance(bomb) < 20: player2.setx(player2.xcor() + 50) bomb.hideturtle() bombs.remove(bomb) print("玩家1使用炸弹击退了玩家2!") elif player2.distance(bomb) < 20: player1.setx(player1.xcor() - 50) bomb.hideturtle() bombs.remove(bomb) print("玩家2使用炸弹击退了玩家1!")# 使用药水(恢复生命)def use_potion(): for potion in potions: if player1.distance(potion) < 20 and player1.lifes < 3: player1.lifes += 1 potion.hideturtle() potions.remove(potion) print("玩家1使用药水,恢复生命!") elif player2.distance(potion) < 20 and player2.lifes < 3: player2.lifes += 1 potion.hideturtle() potions.remove(potion) print("玩家2使用药水,恢复生命!")# 使用盾牌def use_shield(): for shield in shields: if player1.distance(shield) < 20: player1.shielded = True player1.shield_time = 5 # 盾牌有效时间为5秒 shield.hideturtle() shields.remove(shield) print("玩家1获得了盾牌!") elif player2.distance(shield) < 20: player2.shielded = True player2.shield_time = 5 # 盾牌有效时间为5秒 shield.hideturtle() shields.remove(shield) print("玩家2获得了盾牌!")# 更新生命值显示def update_score_display(): score_display.clear() score_display.write(f"玩家1生命值: {player1.lifes} | 玩家2生命值: {player2.lifes}", align="center", font=("Arial", 24, "normal"))# 道具随机生成def generate_items(): if random.random() < 0.05: # 5%的概率生成道具 item_type = random.choice(item_types) if item_type == "bomb": bomb = generate_item("bomb") bombs.append(bomb) elif item_type == "potion": potion = generate_item("potion") potions.append(potion) elif item_type == "shield": shield = generate_item("shield") shields.append(shield)# 按键绑定wn.listen()wn.onkey(player1_up, "w")wn.onkey(player1_down, "s")wn.onkey(shoot_bullet1, "d")wn.onkey(use_potion, "p") # 玩家1按 "p" 使用药水wn.onkey(use_bomb, "b") # 玩家1按"v"使用炸弹wn.onkey(use_shield, "h") # 玩家1按 "h" 选中盾牌wn.onkey(player2_up, "Up")wn.onkey(player2_down, "Down")wn.onkey(shoot_bullet2, "Left")wn.onkey(use_potion, "m") # 玩家2按 "m" 使用药水wn.onkey(use_bomb, "n") # 玩家2按 "n" 使用炸弹wn.onkey(use_shield, "l") # 玩家2按 "l" 使用盾牌# 游戏循环while True: wn.update() # 生成道具 generate_items() # 移动子弹 for bullet in bullets: bullet.forward(bullet_speed) if bullet.xcor() > 400 or bullet.xcor() < -400: bullet.hideturtle() bullets.remove(bullet) # 检测碰撞 if bullet.distance(player1) < 20: # 玩家1被击中 if not player1.shielded: # 如果没有使用盾牌就减少生命值 player1.lifes -= 1 bullet.hideturtle() bullets.remove(bullet) update_score_display() print("玩家1被击中了!") if player1.lifes <= 0: print("玩家1失败!游戏结束!") wn.bye() elif bullet.distance(player2) < 20: # 玩家2被击中 if not player2.shielded: # 如果没有使用盾牌就减少生命值 player2.lifes -= 1 bullet.hideturtle() bullets.remove(bullet) update_score_display() print("玩家2被击中了!") if player2.lifes <= 0: print("玩家2失败!游戏结束!") wn.bye() # 处理盾牌的时间限制 if player1.shielded: player1.shield_time -= 0.1 # 渐渐减小盾牌时间 if player1.shield_time <= 0: player1.shielded = False print("玩家1的盾牌失效!") if player2.shielded: player2.shield_time -= 0.1 # 渐渐减小盾牌时间 if player2.shield_time <= 0: player2.shielded = False print("玩家2的盾牌失效!") # 更新得分显示 update_score_display() time.sleep(0.01)wn.mainloop()
|
|