找回密码
 中文实名注册
搜索
查看: 713|回复: 1

高质量枪战(双人)可使用炸弹,药水,盾牌

[复制链接]

12

主题

18

回帖

1817

积分

金牌会员

积分
1817
发表于 2025-7-13 17:03:09 | 显示全部楼层 |阅读模式
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()
回复

使用道具 举报

12

主题

18

回帖

1817

积分

金牌会员

积分
1817
 楼主| 发表于 2025-7-13 17:03:46 | 显示全部楼层
此帖仅作者可见

使用道具 举报

您需要登录后才可以回帖 登录 | 中文实名注册

本版积分规则

快速回复 返回顶部 返回列表