pygame坦克大战

这篇具有很好参考价值的文章主要介绍了pygame坦克大战。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

很高兴为你提供帮助。以下是一个简单的坦克大战游戏。

1. 导入模块和初始化

import pygame
import random

WIDTH = 800
HEIGHT = 600

pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Tank Game")

clock = pygame.time.Clock()

2. 定义颜色和音效

# define colors
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

# 加载音效
fire_sound = pygame.mixer.Sound("assets/sounds/fire.wav")
explosion_sound = pygame.mixer.Sound("assets/sounds/explosion.wav")

3. 定义类

# 坦克类
class Tank(pygame.sprite.Sprite):
    def __init__(self, x, y, color, direction, speed=5):
        super().__init__()
        self.image = pygame.Surface((30, 30))
        self.image.fill(color)
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.direction = direction
        self.speed = speed

    def move(self):
        if self.direction == "up":
            self.rect.y -= self.speed
        elif self.direction == "down":
            self.rect.y += self.speed
        elif self.direction == "left":
            self.rect.x -= self.speed
        elif self.direction == "right":
            self.rect.x += self.speed

    def fire(self):
        fire_sound.play()
        bullet = Bullet(self.rect.centerx, self.rect.centery, self.direction)
        all_sprites.add(bullet)
        bullets.add(bullet)

# 子弹类
class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y, direction, speed=10):
        super().__init__()
        self.image = pygame.Surface((10, 10))
        self.image.fill(WHITE)
        self.rect = self.image.get_rect()
        self.rect.centerx = x
        self.rect.centery = y
        self.direction = direction
        self.speed = speed

    def update(self):
        if self.direction == "up":
            self.rect.y -= self.speed
        elif self.direction == "down":
            self.rect.y += self.speed
        elif self.direction == "left":
            self.rect.x -= self.speed
        elif self.direction == "right":
            self.rect.x += self.speed

        if self.rect.right < 0 or self.rect.left > WIDTH or self.rect.bottom < 0 or self.rect.top > HEIGHT:
            self.kill()

#障碍物类 暂且没用 等后续研究琢磨加上
class Wall(pygame.sprite.Sprite):
    def __init__(self, x, y, width, height):
        super().__init__()
        self.image = pygame.Surface((width, height))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y

4. 创建对象和添加到精灵组

# create objects
player_tank = Tank(100, 100, BLUE, "up")
enemy_tank1 = Tank(500, 100, RED, "down")
enemy_tank2 = Tank(300, 400, RED, "left")
enemy_tank3 = Tank(700, 400, RED, "right")

all_tanks = pygame.sprite.Group()
all_tanks.add(player_tank)
all_tanks.add(enemy_tank1)
all_tanks.add(enemy_tank2)
all_tanks.add(enemy_tank3)

bullets = pygame.sprite.Group()

wall1 = Wall(200, 200, 100, 20)
wall2 = Wall(500, 300, 20, 100)

all_walls = pygame.sprite.Group()
all_walls.add(wall1)
all_walls.add(wall2)

all_sprites = pygame.sprite.Group()
all_sprites.add(player_tank)
all_sprites.add(enemy_tank1)
all_sprites.add(enemy_tank2)
all_sprites.add(enemy_tank3)
all_sprites.add(wall1)
all_sprites.add(wall2)

5. 游戏循环

running = True
while running:
    clock.tick(30)
    
    # 按键事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                player_tank.fire()
            elif event.key == pygame.K_LEFT:
                player_tank.direction = "left"
            elif event.key == pygame.K_RIGHT:
                player_tank.direction = "right"
            elif event.key == pygame.K_UP:
                player_tank.direction = "up"
            elif event.key == pygame.K_DOWN:
                player_tank.direction = "down"

    # update
    all_sprites.update()

    # check for collisions
    hits = pygame.sprite.groupcollide(bullets, all_tanks, True, False)
    for hit in hits:
        explosion_sound.play()
        hit_list = hits[hit]
        for tank in hit_list:
            tank.kill()

    # draw
    screen.fill(BLACK)
    all_sprites.draw(screen)

    # update display
    pygame.display.flip()

pygame.quit()

完整代码:

import pygame
import random

WIDTH = 800
HEIGHT = 600

pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("坦克大战")

clock = pygame.time.Clock()

# define colors
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

directions = ["up", "down", "left", "right"]

# load sound
fire_sound = pygame.mixer.Sound("assets/sounds/fire.mp3")
explosion_sound = pygame.mixer.Sound("assets/sounds/explosion.mp3")


# define classes
class Tank(pygame.sprite.Sprite):
    def __init__(self, x, y, color, direction, speed=5, isOther=True):
        super().__init__()
        self.image = pygame.Surface((30, 30))
        self.image.fill(color)
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.direction = direction
        self.speed = speed
        self.num = 0
        self.time = pygame.time.get_ticks()
        self.isOther=isOther # 默认是敌方

    def move(self):
        self.num += 1
        if self.direction == "up":
            self.rect.y -= self.speed
            if self.rect.y <= 0:
                self.direction = "down"
                self.rect.y = 0
                self.num = 0
        elif self.direction == "down":
            self.rect.y += self.speed
            if self.rect.y >= HEIGHT:
                self.direction = "up"
                self.rect.y = HEIGHT
                self.num = 0
        elif self.direction == "left":
            self.rect.x -= self.speed
            if self.rect.x <= 0:
                self.direction = "right"
                self.rect.x = 0
                self.num = 0
        elif self.direction == "right":
            self.rect.x += self.speed
            if self.rect.x >= WIDTH:
                self.direction = "left"
                self.rect.x = WIDTH
                self.num = 0

    def fire(self):
        fire_sound.play()
        bullet = Bullet(self.rect.centerx, self.rect.centery, self.direction)
        all_sprites.add(bullet)
        if self.isOther:
            bulletsOther.add(bullet)
        else:
            bullets.add(bullet)


# 子弹
class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y, direction, speed=10):
        super().__init__()
        self.image = pygame.Surface((10, 10))
        self.image.fill(WHITE)
        self.rect = self.image.get_rect()
        self.rect.centerx = x
        self.rect.centery = y
        self.direction = direction
        self.speed = speed

    def update(self):
        if self.direction == "up":
            self.rect.y -= self.speed
        elif self.direction == "down":
            self.rect.y += self.speed
        elif self.direction == "left":
            self.rect.x -= self.speed
        elif self.direction == "right":
            self.rect.x += self.speed

        # 超出界限消失
        if self.rect.right < 0 or self.rect.left > WIDTH or self.rect.bottom < 0 or self.rect.top > HEIGHT:
            self.kill()


# 墙
class Wall(pygame.sprite.Sprite):
    def __init__(self, x, y, width, height):
        super().__init__()
        self.image = pygame.Surface((width, height))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y


#游戏结束
def game_over():
    global score
    print("游戏结束")
    # 绘制提示语言
    font = pygame.font.Font("assets/fonts/simsun.ttc", 24)
    text = font.render("游戏结束您的得分是{},重新开始请按空格键".format(score), True, WHITE)
    screen.blit(text, (10, HEIGHT // 2 - 12))
    pygame.display.update()
    flag = True
    while flag:
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
                flag = False
                break
    reset_game()


# 重置游戏
def reset_game():
    global score, running, player_tank
    # 重置分数
    score = 0
    player_tank = Tank(100, 100, BLUE, "up", speed=10, isOther=False)
    self_tanks.add(player_tank)
    running = True  # 接着继续
    all_sprites.add(player_tank)


# 创建对象
player_tank = Tank(100, 100, BLUE, "up", speed=10, isOther=False)
enemy_tank1 = Tank(500, 100, RED, "down")
enemy_tank2 = Tank(300, 400, RED, "left")
enemy_tank3 = Tank(700, 400, RED, "right")

self_tanks = pygame.sprite.Group()
self_tanks.add(player_tank)

all_tanks = pygame.sprite.Group()
all_tanks.add(enemy_tank1)
all_tanks.add(enemy_tank2)
all_tanks.add(enemy_tank3)

all_tankOther = list()
all_tankOther.append(enemy_tank1)
all_tankOther.append(enemy_tank2)
all_tankOther.append(enemy_tank3)


bullets = pygame.sprite.Group()  # 我方发射的子弹
bulletsOther = pygame.sprite.Group()  # 敌方发射的子弹
wall1 = Wall(200, 200, 100, 20)
wall2 = Wall(500, 300, 20, 100)

all_walls = pygame.sprite.Group()
all_walls.add(wall1)
all_walls.add(wall2)

all_sprites = pygame.sprite.Group()
all_sprites.add(player_tank)
all_sprites.add(enemy_tank1)
all_sprites.add(enemy_tank2)
all_sprites.add(enemy_tank3)
all_sprites.add(wall1)
all_sprites.add(wall2)
pygame.key.set_repeat(100)
# set_repeat方法可以控制KEYDOWN事件的频率。
# 比如持续按下某个按键时,想要让KEYDOWN事件每过一段时间就触发一次,
# 就可以用set_repeat方法。

score = 0

running = True
while running:
    clock.tick(30)

    # 按键事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                player_tank.fire()
            elif event.key == pygame.K_LEFT or event.key == pygame.K_a:
                player_tank.direction = "left"
                player_tank.move()
            elif event.key == pygame.K_RIGHT or event.key == pygame.K_d:
                player_tank.direction = "right"
                player_tank.move()
            elif event.key == pygame.K_UP or event.key == pygame.K_w:
                player_tank.direction = "up"
                player_tank.move()
            elif event.key == pygame.K_DOWN or event.key == pygame.K_s:
                player_tank.direction = "down"
                player_tank.move()

    # update
    all_sprites.update()
    # 检测我方是否被敌方子弹射到
    hits_self = pygame.sprite.groupcollide(bulletsOther, self_tanks, True, False)
    for hit in hits_self:
        explosion_sound.play()
        hit_list = hits_self[hit]
        print(hit_list)
        for tank in hit_list:
            # 我方被击倒 游戏结束
            tank.kill()
            running = False
            game_over()


    # 检测敌方是否被我方射到
    hits = pygame.sprite.groupcollide(bullets, all_tanks, True, False)
    for hit in hits:
        explosion_sound.play()
        hit_list = hits[hit]
        print(hit_list)
        for tank in hit_list:
            score += 100  # 干掉一个得一百分
            all_tankOther.remove(tank)
            tank.kill()  # 干掉一个 立马随机位置生成一个
            enemy_tankNew = Tank(random.randint(0, WIDTH-20),
                                 random.randint(0, HEIGHT-20), RED,
                                 random.choice(directions))
            all_tanks.add(enemy_tankNew)
            all_sprites.add(enemy_tankNew)
            all_tankOther.append(enemy_tankNew)
    # 敌方每个坦克定时1秒发射一颗子弹
    now = pygame.time.get_ticks()
    for tank in all_tankOther:
        if now > tank.time+1000*1:
            tank.time = now
            tank.fire()
        tank.move()
        if tank.num > 15:
            tank.num = 0
            tank.direction = random.choice(directions)  # 四步一换方向

    # draw
    screen.fill(BLACK)
    all_sprites.draw(screen)

    # update display
    pygame.display.flip()

pygame.quit()

游戏截图

蓝色为我方坦克 红色为敌方坦克 白色为子弹
pygame坦克大战,pygame游戏开发,pygame,python,开发语言文章来源地址https://www.toymoban.com/news/detail-713412.html

到了这里,关于pygame坦克大战的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python项目分享 - python坦克大战小游戏

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 坦克大战小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取:

    2024年02月03日
    浏览(43)
  • 毕业设计 python坦克大战小游戏

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 坦克大战小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取:

    2024年02月21日
    浏览(43)
  • python小游戏毕设 坦克大战游戏设计与实现

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 坦克大战小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 《坦克大战》

    2024年02月05日
    浏览(62)
  • python毕设分享 python坦克大战小游戏

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 坦克大战小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取:

    2024年02月03日
    浏览(54)
  • pygame坦克大战

    很高兴为你提供帮助。以下是一个简单的坦克大战游戏。 完整代码: 蓝色为我方坦克 红色为敌方坦克 白色为子弹

    2024年02月08日
    浏览(37)
  • pygame--坦克大战(三)

    添加显示子弹 按空格键产生子弹,并将子弹添加到子弹列表中 将子弹添加到窗口 修改MainGame类,显示子弹方法 修改子弹类,创建live属性,与根据移动位置修改live状态 修改MainGame类,修改显示子弹类,与事件监听 实现发射子弹方法 敌方坦克加入窗口后,发射子弹,并将子弹添

    2024年04月13日
    浏览(38)
  • python项目分享 - 坦克大战小游戏设计与实现 (源码)

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 坦克大战小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取:

    2024年02月01日
    浏览(50)
  • python项目分享 坦克大战小游戏设计与实现 (源码)

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 坦克大战小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取:

    2024年01月25日
    浏览(52)
  • python毕设分享 坦克大战小游戏设计与实现 (源码)

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 坦克大战小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取:

    2024年02月03日
    浏览(51)
  • 微信小游戏开发之坦克大战(比羊了个羊还好玩系列)

    现在很多公司开始使用游戏化的方式去做产品,让产品呈现给用户时更好玩,以达到增加用户粘性,提升DAU的效果。 同时随着硬件与底层系统的发展,用户的终端对动画的表现能力也越来越强,很多APP以引导用户互动的方式开发业务,所以开发互动类业务将成为前端工程师的

    2024年02月09日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包