iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何实现Pygame坦克大战游戏
  • 554
分享到

如何实现Pygame坦克大战游戏

2023-06-29 05:06:59 554人浏览 泡泡鱼
摘要

这篇文章将为大家详细讲解有关如何实现Pygame坦克大战游戏,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。正文1)游戏规则:游戏过程是这样的,玩家操作坦克消灭电脑控制的坦克,并保护自己基地。基地图标是一只

这篇文章将为大家详细讲解有关如何实现Pygame坦克大战游戏,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

正文

1)游戏规则:

游戏过程是这样的,玩家操作坦克消灭电脑控制的坦克,并保护自己基地。基地图标是一只傲娇的张着翅膀的老鹰。小时候自

己失手把飞鹰轰成烧鸡的惨案经常发生。

如何实现Pygame坦克大战游戏

双打的时候,为了看谁刷得分高,都争着打坦克,大本营的老鹰被烤熟了都不管。。

坦克大战中的宝贝有战车、星星、时钟等,小编当时最喜欢的是时钟,敌不能动我能动的感觉妙极了。图中的坦克图标吃了是

可以加一条命的,当时为了抢宝贝都抢先把队友的坦克打晕。。。

2)环境安装

python3PyCharm、Pygame、以及自带或自定义的模块。

pip install +模块名 或pip install -i https://pypi.douban.com/simple/ +模块名

3)代码演示

如何实现Pygame坦克大战游戏

(之前不是写过的嘛,今天的话就是修改下的,这种小游戏代码肯定都很多的,所以这里直接贴主程序了。

需要完整的打包好的代码跟素材哪些的话 直接滴滴我即可或者看我主页左侧哪里有源码基地的哈!)

如何实现Pygame坦克大战游戏

如何实现Pygame坦克大战游戏

主程序:

import pygamefrom pygame.locals import *import sysimport sceneimport bulletimport foodimport tanksimport home # 开始界面显示def show_start_interface(screen, width, height):    tfont = pygame.font.Font('./font/simkai.ttf', width // 4)    cfont = pygame.font.Font('./font/simkai.ttf', width // 20)    title = tfont.render(u'坦克大战', True, (255, 0, 0))    content1 = cfont.render(u'按1键进入单人游戏', True, (0, 244, 222))    content2 = cfont.render(u'按2键进入双人人游戏', True, (0, 0, 255))    #显示字体pygame.font.Font.render(text文本, antialias是否抗锯齿, color颜色, background=None)    trect = title.get_rect()    # 默认title左上角的坐标是 (0, 0)    trect.midtop = (width / 2, height / 5)    crect1 = content1.get_rect()    crect1.midtop = (width / 2, height / 1.8)    crect2 = content2.get_rect()    crect2.midtop = (width / 2, height / 1.6)    screen.blit(title, trect)    screen.blit(content1, crect1)    screen.blit(content2, crect2)    # 在指定位置绘制指定文字对象    pygame.display.update()    # 更新界面    while True:        for event in pygame.event.get():            if event.type == QUIT:                sys.exit()            elif event.type == pygame.KEYDOWN:                if event.key == pygame.K_1:                    return 1                if event.key == pygame.K_2:                    return 2  # 结束界面显示def show_end_interface(screen, width, height, is_win):    bg_img = pygame.image.load("./images/others/background.png")    screen.blit(bg_img, (0, 0))    if is_win:        font = pygame.font.Font('./font/simkai.ttf', width // 10)        content = font.render(u'恭喜通关!', True, (255, 0, 0))        rect = content.get_rect()        rect.midtop = (width / 2, height / 2)        screen.blit(content, rect)    else:        fail_img = pygame.image.load("./images/others/gameover.png")        rect = fail_img.get_rect()        rect.midtop = (width / 2, height / 2)        screen.blit(fail_img, rect)    pygame.display.update()    while True:        for event in pygame.event.get():            if event.type == QUIT:                sys.exit()  # 关卡切换def show_switch_stage(screen, width, height, stage):    bg_img = pygame.image.load("./images/others/background.png")    screen.blit(bg_img, (0, 0))    font = pygame.font.Font('./font/simkai.ttf', width // 10)    content = font.render(u'第%d关' % stage, True, (0, 255, 0))    rect = content.get_rect()    rect.midtop = (width / 2, height / 2)    screen.blit(content, rect)    pygame.display.update()    delay_event = pygame.constants.USEREVENT    pygame.time.set_timer(delay_event, 1000)    #定时器延时    while True:        for event in pygame.event.get():            if event.type == QUIT:                sys.exit()            if event.type == delay_event:                return  def main():    pygame.init()    pygame.mixer.init()    screen = pygame.display.set_mode((630, 630))    pygame.display.set_caption('坦克大战')    bg_img = pygame.image.load('./images/others/background.png')    # 加载音效    add_sound = pygame.mixer.Sound("./audiOS/add.wav")    add_sound.set_volume(1)    bang_sound = pygame.mixer.Sound("./audios/bang.wav")    bang_sound.set_volume(1)    blast_sound = pygame.mixer.Sound("./audios/blast.wav")    blast_sound.set_volume(1)    fire_sound = pygame.mixer.Sound("./audios/fire.wav")    fire_sound.set_volume(1)    Gunfire_sound = pygame.mixer.Sound("./audios/Gunfire.wav")    Gunfire_sound.set_volume(1)    hit_sound = pygame.mixer.Sound("./audios/hit.wav")    hit_sound.set_volume(1)    start_sound = pygame.mixer.Sound("./audios/start.wav")    start_sound.set_volume(1)    # 开始界面    num_player = show_start_interface(screen, 630, 630)    # 播放游戏开始的音乐    start_sound.play()    # 关卡    stage = 0    num_stage = 2    # 游戏是否结束    is_gameover = False    # 时钟    clock = pygame.time.Clock()    # 主循环    while not is_gameover:        # 关卡        stage += 1        if stage > num_stage:            break        show_switch_stage(screen, 630, 630, stage)        # 该关卡坦克总数量        enemytanks_total = min(stage * 18, 80)        # 场上存在的敌方坦克总数量        enemytanks_now = 0        # 场上可以存在的敌方坦克总数量        enemytanks_now_max = min(max(stage * 2, 4), 8)        # 精灵组,独立运行的动画组        tanksGroup = pygame.sprite.Group()        mytanksGroup = pygame.sprite.Group()        enemytanksGroup = pygame.sprite.Group()        bulletsGroup = pygame.sprite.Group()        mybulletsGroup = pygame.sprite.Group()        enemybulletsGroup = pygame.sprite.Group()        myfoodsGroup = pygame.sprite.Group()        # 自定义事件        # -生成敌方坦克事件        genEnemyEvent = pygame.constants.USEREVENT        pygame.time.set_timer(genEnemyEvent, 100)        # -敌方坦克静止恢复事件        recoverEnemyEvent = pygame.constants.USEREVENT        pygame.time.set_timer(recoverEnemyEvent, 8000)        # -我方坦克无敌恢复事件        noprotectMytankEvent = pygame.constants.USEREVENT        pygame.time.set_timer(noprotectMytankEvent, 8000)        # 关卡地图        map_stage = scene.Map(stage)        # 我方坦克        tank_player1 = tanks.myTank(1)        tanksGroup.add(tank_player1)        mytanksGroup.add(tank_player1)        if num_player > 1:            tank_player2 = tanks.myTank(2)            tanksGroup.add(tank_player2)            mytanksGroup.add(tank_player2)        is_switch_tank = True        player1_moving = False        player2_moving = False        # 为了轮胎的动画效果        time = 0        # 敌方坦克        for i in range(0, 3):            if enemytanks_total > 0:                enemytank = tanks.enemyTank(i)                tanksGroup.add(enemytank)                enemytanksGroup.add(enemytank)                enemytanks_now += 1                enemytanks_total -= 1        # 大本营        myhome = home.Home()        # 出场特效        appearance_img = pygame.image.load("./images/others/appear.png").convert_alpha()        appearances = []        appearances.append(appearance_img.subsurface((0, 0), (48, 48)))        appearances.append(appearance_img.subsurface((48, 0), (48, 48)))        appearances.append(appearance_img.subsurface((96, 0), (48, 48)))        # 关卡主循环        while True:            if is_gameover is True:                break            if enemytanks_total < 1 and enemytanks_now < 1:                is_gameover = False                break            for event in pygame.event.get():                if event.type == pygame.QUIT:                    pygame.quit()                    sys.exit()                if event.type == genEnemyEvent:                    if enemytanks_total > 0:                        if enemytanks_now < enemytanks_now_max:                            enemytank = tanks.enemyTank()                            if not pygame.sprite.spritecollide(enemytank, tanksGroup, False, None):                                tanksGroup.add(enemytank)                                enemytanksGroup.add(enemytank)                                enemytanks_now += 1                                enemytanks_total -= 1                if event.type == recoverEnemyEvent:                    for each in enemytanksGroup:                        each.can_move = True                if event.type == noprotectMytankEvent:                    for each in mytanksGroup:                        mytanksGroup.protected = False            # 检查用户键盘操作            key_pressed = pygame.key.get_pressed()            # 玩家一            # WSAD -> 上下左右            # 空格键射击            if key_pressed[pygame.K_w]:                tanksGroup.remove(tank_player1)                tank_player1.move_up(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome)                tanksGroup.add(tank_player1)                player1_moving = True            elif key_pressed[pygame.K_s]:                tanksGroup.remove(tank_player1)                tank_player1.move_down(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome)                tanksGroup.add(tank_player1)                player1_moving = True            elif key_pressed[pygame.K_a]:                tanksGroup.remove(tank_player1)                tank_player1.move_left(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome)                tanksGroup.add(tank_player1)                player1_moving = True            elif key_pressed[pygame.K_d]:                tanksGroup.remove(tank_player1)                tank_player1.move_right(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome)                tanksGroup.add(tank_player1)                player1_moving = True            elif key_pressed[pygame.K_SPACE]:                if not tank_player1.bullet.being:                    fire_sound.play()                    tank_player1.shoot()            # 玩家二            # ↑↓←→ -> 上下左右            # 小键盘0键射击            if num_player > 1:                if key_pressed[pygame.K_UP]:                    tanksGroup.remove(tank_player2)                    tank_player2.move_up(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome)                    tanksGroup.add(tank_player2)                    player2_moving = True                elif key_pressed[pygame.K_DOWN]:                    tanksGroup.remove(tank_player2)                    tank_player2.move_down(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome)                    tanksGroup.add(tank_player2)                    player2_moving = True                elif key_pressed[pygame.K_LEFT]:                    tanksGroup.remove(tank_player2)                    tank_player2.move_left(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome)                    tanksGroup.add(tank_player2)                    player2_moving = True                elif key_pressed[pygame.K_RIGHT]:                    tanksGroup.remove(tank_player2)                    tank_player2.move_right(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome)                    tanksGroup.add(tank_player2)                    player2_moving = True                elif key_pressed[pygame.K_KP0]:                    if not tank_player2.bullet.being:                        fire_sound.play()                        tank_player2.shoot()            # 背景            screen.blit(bg_img, (0, 0))            # 石头墙            for each in map_stage.brickGroup:                screen.blit(each.brick, each.rect)            # 钢墙            for each in map_stage.ironGroup:                screen.blit(each.iron, each.rect)            # 冰            for each in map_stage.iceGroup:                screen.blit(each.ice, each.rect)            # 河流            for each in map_stage.riverGroup:                screen.blit(each.river, each.rect)            # 树            for each in map_stage.treeGroup:                screen.blit(each.tree, each.rect)            time += 1            if time == 5:                time = 0                is_switch_tank = not is_switch_tank            # 我方坦克            if tank_player1 in mytanksGroup:                if is_switch_tank and player1_moving:                    screen.blit(tank_player1.tank_0, (tank_player1.rect.left, tank_player1.rect.top))                    player1_moving = False                else:                    screen.blit(tank_player1.tank_1, (tank_player1.rect.left, tank_player1.rect.top))                if tank_player1.protected:                    screen.blit(tank_player1.protected_mask1, (tank_player1.rect.left, tank_player1.rect.top))            if num_player > 1:                if tank_player2 in mytanksGroup:                    if is_switch_tank and player2_moving:                        screen.blit(tank_player2.tank_0, (tank_player2.rect.left, tank_player2.rect.top))                        player1_moving = False                    else:                        screen.blit(tank_player2.tank_1, (tank_player2.rect.left, tank_player2.rect.top))                    if tank_player2.protected:                        screen.blit(tank_player1.protected_mask1, (tank_player2.rect.left, tank_player2.rect.top))            # 敌方坦克            for each in enemytanksGroup:                # 出生特效                if each.born:                    if each.times > 0:                        each.times -= 1                        if each.times <= 10:                            screen.blit(appearances[2], (3 + each.x * 12 * 24, 3))                        elif each.times <= 20:                            screen.blit(appearances[1], (3 + each.x * 12 * 24, 3))                        elif each.times <= 30:                            screen.blit(appearances[0], (3 + each.x * 12 * 24, 3))                        elif each.times <= 40:                            screen.blit(appearances[2], (3 + each.x * 12 * 24, 3))                        elif each.times <= 50:                            screen.blit(appearances[1], (3 + each.x * 12 * 24, 3))                        elif each.times <= 60:                            screen.blit(appearances[0], (3 + each.x * 12 * 24, 3))                        elif each.times <= 70:                            screen.blit(appearances[2], (3 + each.x * 12 * 24, 3))                        elif each.times <= 80:                            screen.blit(appearances[1], (3 + each.x * 12 * 24, 3))                        elif each.times <= 90:                            screen.blit(appearances[0], (3 + each.x * 12 * 24, 3))                    else:                        each.born = False                else:                    if is_switch_tank:                        screen.blit(each.tank_0, (each.rect.left, each.rect.top))                    else:                        screen.blit(each.tank_1, (each.rect.left, each.rect.top))                    if each.can_move:                        tanksGroup.remove(each)                        each.move(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome)                        tanksGroup.add(each)            # 我方子弹            for tank_player in mytanksGroup:                if tank_player.bullet.being:                    tank_player.bullet.move()                    screen.blit(tank_player.bullet.bullet, tank_player.bullet.rect)                    # 子弹碰撞敌方子弹                    for each in enemybulletsGroup:                        if each.being:                            if pygame.sprite.collide_rect(tank_player.bullet, each):                                tank_player.bullet.being = False                                each.being = False                                enemybulletsGroup.remove(each)                                break                        else:                            enemybulletsGroup.remove(each)                    # 子弹碰撞敌方坦克                    for each in enemytanksGroup:                        if each.being:                            if pygame.sprite.collide_rect(tank_player.bullet, each):                                if each.is_red == True:                                    myfood = food.Food()                                    myfood.generate()                                    myfoodsGroup.add(myfood)                                    each.is_red = False                                each.blood -= 1                                each.color -= 1                                if each.blood < 0:                                    bang_sound.play()                                    each.being = False                                    enemytanksGroup.remove(each)                                    enemytanks_now -= 1                                    tanksGroup.remove(each)                                else:                                    each.reload()                                tank_player.bullet.being = False                                break                        else:                            enemytanksGroup.remove(each)                            tanksGroup.remove(each)                    # 子弹碰撞石头墙                    if pygame.sprite.spritecollide(tank_player.bullet, map_stage.brickGroup, True, None):                        tank_player.bullet.being = False                    # 子弹碰钢墙                    if tank_player.bullet.stronger:                        if pygame.sprite.spritecollide(tank_player.bullet, map_stage.ironGroup, True, None):                            tank_player.bullet.being = False                    else:                        if pygame.sprite.spritecollide(tank_player.bullet, map_stage.ironGroup, False, None):                            tank_player.bullet.being = False                    # 子弹碰大本营                    if pygame.sprite.collide_rect(tank_player.bullet, myhome):                        tank_player.bullet.being = False                        myhome.set_dead()                        is_gameover = True            # 敌方子弹            for each in enemytanksGroup:                if each.being:                    if each.can_move and not each.bullet.being:                        enemybulletsGroup.remove(each.bullet)                        each.shoot()                        enemybulletsGroup.add(each.bullet)                    if not each.born:                        if each.bullet.being:                            each.bullet.move()                            screen.blit(each.bullet.bullet, each.bullet.rect)                            # 子弹碰撞我方坦克                            for tank_player in mytanksGroup:                                if pygame.sprite.collide_rect(each.bullet, tank_player):                                    if not tank_player.protected:                                        bang_sound.play()                                        tank_player.life -= 1                                        if tank_player.life < 0:                                            mytanksGroup.remove(tank_player)                                            tanksGroup.remove(tank_player)                                            if len(mytanksGroup) < 1:                                                is_gameover = True                                        else:                                            tank_player.reset()                                    each.bullet.being = False                                    enemybulletsGroup.remove(each.bullet)                                    break                            # 子弹碰撞石头墙                            if pygame.sprite.spritecollide(each.bullet, map_stage.brickGroup, True, None):                                each.bullet.being = False                                enemybulletsGroup.remove(each.bullet)                            # 子弹碰钢墙                            if each.bullet.stronger:                                if pygame.sprite.spritecollide(each.bullet, map_stage.ironGroup, True, None):                                    each.bullet.being = False                            else:                                if pygame.sprite.spritecollide(each.bullet, map_stage.ironGroup, False, None):                                    each.bullet.being = False                            # 子弹碰大本营                            if pygame.sprite.collide_rect(each.bullet, myhome):                                each.bullet.being = False                                myhome.set_dead()                                is_gameover = True                else:                    enemytanksGroup.remove(each)                    tanksGroup.remove(each)            # 家            screen.blit(myhome.home, myhome.rect)            # 食物            for myfood in myfoodsGroup:                if myfood.being and myfood.time > 0:                    screen.blit(myfood.food, myfood.rect)                    myfood.time -= 1                    for tank_player in mytanksGroup:                        if pygame.sprite.collide_rect(tank_player, myfood):                            # 消灭当前所有敌人                            if myfood.kind == 0:                                for _ in enemytanksGroup:                                    bang_sound.play()                                enemytanksGroup = pygame.sprite.Group()                                enemytanks_total -= enemytanks_now                                enemytanks_now = 0                            # 敌人静止                            if myfood.kind == 1:                                for each in enemytanksGroup:                                    each.can_move = False                            # 子弹增强                            if myfood.kind == 2:                                add_sound.play()                                tank_player.bullet.stronger = True                            # 使得大本营的墙变为钢板                            if myfood.kind == 3:                                map_stage.protect_home()                            # 坦克获得一段时间的保护罩                            if myfood.kind == 4:                                add_sound.play()                                for tank_player in mytanksGroup:                                    tank_player.protected = True                            # 坦克升级                            if myfood.kind == 5:                                add_sound.play()                                tank_player.up_level()                            # 坦克生命+1                            if myfood.kind == 6:                                add_sound.play()                                tank_player.life += 1                            myfood.being = False                            myfoodsGroup.remove(myfood)                            break                else:                    myfood.being = False                    myfoodsGroup.remove(myfood)            pygame.display.flip()            clock.tick(60)    if not is_gameover:        show_end_interface(screen, 630, 630, True)    else:        show_end_interface(screen, 630, 630, False)  if __name__ == '__main__':    main()

如何实现Pygame坦克大战游戏

4)效果展示

视频展示效果&mdash;&mdash;

视频播放链接:Https://live.csdn.net/v/embed/181068

【Pygame实战】经典的坦克大战游戏,勾起童年无限回忆!

静态截图效果&mdash;&mdash;

游戏界面:

如何实现Pygame坦克大战游戏

第一关单人游戏:

如何实现Pygame坦克大战游戏

双人第一关游戏:

如何实现Pygame坦克大战游戏

关于“如何实现Pygame坦克大战游戏”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: 如何实现Pygame坦克大战游戏

本文链接: https://www.lsjlt.com/news/322801.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作