首页 > 编程语言 >Python-基于Pygame的小游戏(坦克大战-1.0(世界))(一)

Python-基于Pygame的小游戏(坦克大战-1.0(世界))(一)

时间:2024-12-17 10:31:18浏览次数:7  
标签:enemy 1.0 bullet Python self 小游戏 pygame tank barrel

前言:创作背景-《坦克大战》是一款经典的平面射击游戏,最初由日本游戏公司南梦宫于1985年在任天堂FC平台上推出。游戏的主题围绕坦克战斗,玩家的任务是保卫自己的基地,同时摧毁所有敌人的坦克。游戏中有多种地形和敌人类型,玩家可以通过获取道具来强化坦克和基地。此外,游戏还支持玩家自创关卡,增加了游戏的趣味性。游戏中,玩家通过键盘控制坦克的移动和射击,需要灵活应对敌人的攻击并操作自身坦克摧毁敌方坦克,以获得胜利。那么话不多说,本次编程我们就一起来重温这部童年经典游戏。

编程思路:本次编程我们将会用到pygame,random等库。

第一步:准备第三方库

pygame是Python的一个第三方库,它需要我们自行下载。

下载方法:在PyCharm终端中输入"pip install pygame",回车等待一段时间。

pip install pygame

第二步:准备游戏相关图片(包括敌我双方的坦克主体和炮管)

                                                               敌方坦克主体图片

敌方坦克炮管图片

我方坦克主体图片

                                                                     

                                                                我方坦克炮管图片

(需要的也可以私信我发哦)

接下来我们将图片放在python项目下。(如下红色圆圈标注所示)

第三步:完整游戏代码

#导入库
import pygame
import random

#初始化Pygame
pygame.init()

#设置窗口及相关设置
WIDTH = 800
HEIGHT = 600
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
BLACK = (0, 0, 0)
TANK_SIZE = 30
BULLET_SPEED = 10

#图片加载函数
def load_image(path):
    return pygame.image.load(path).convert_alpha()

#坦克类
class Tank:
    def __init__(self, x, y, tank_image, barrel_image, color):
        self.x = x
        self.y = y
        self.tank_image = tank_image
        self.barrel_image = barrel_image
        self.color = color
        self.direction = 'UP'
        self.speed = 4
        self.bullets = []

    def draw(self, screen):
        screen.blit(self.tank_image, (self.x, self.y))
        if self.direction == 'UP':
            rotated_barrel = pygame.transform.rotate(self.barrel_image, -90)
            screen.blit(rotated_barrel, (self.x + TANK_SIZE / 2 - rotated_barrel.get_width() / 2+20, self.y - rotated_barrel.get_height()))
        elif self.direction == 'DOWN':
            rotated_barrel = pygame.transform.rotate(self.barrel_image, 90)
            screen.blit(rotated_barrel, (self.x + TANK_SIZE / 2 - rotated_barrel.get_width() / 2+20, self.y + TANK_SIZE+20))
        elif self.direction == 'LEFT':
            rotated_barrel = pygame.transform.rotate(self.barrel_image, 180)
            screen.blit(rotated_barrel, (self.x -rotated_barrel.get_height()-30, self.y + TANK_SIZE / 2 - rotated_barrel.get_width() / 2+30))
        else:
            rotated_barrel = pygame.transform.rotate(self.barrel_image, 0)
            screen.blit(rotated_barrel, (self.x + TANK_SIZE+30, self.y + TANK_SIZE / 2 - rotated_barrel.get_height() / 2+10))


    def move(self):
        if self.direction == 'UP':
            self.y -= self.speed
            if self.y < 0:
                self.y = 0
        elif self.direction == 'DOWN':
            self.y += self.speed
            if self.y > HEIGHT - TANK_SIZE:
                self.y = HEIGHT - TANK_SIZE
        elif self.direction == 'LEFT':
            self.x -= self.speed
            if self.x < 0:
                self.x = 0
        elif self.direction == 'RIGHT':
            self.x += self.speed
            if self.x > WIDTH - TANK_SIZE:
                self.x = WIDTH - TANK_SIZE

    def fire(self):
        if self.direction == 'UP':
            bullet = Bullet(self.x + TANK_SIZE / 2+20, self.y, 0, -BULLET_SPEED, self.color)
        elif self.direction == 'DOWN':
            bullet = Bullet(self.x + TANK_SIZE / 2+20, self.y + TANK_SIZE, 0, BULLET_SPEED, self.color)
        elif self.direction == 'LEFT':
            bullet = Bullet(self.x+30, self.y + TANK_SIZE / 2+10, -BULLET_SPEED, 0, self.color)
        else:
            bullet = Bullet(self.x + TANK_SIZE+30, self.y + TANK_SIZE / 2+10, BULLET_SPEED, 0, self.color)
        self.bullets.append(bullet)



#炮弹类
class Bullet:
    def __init__(self, x, y, dx, dy, color):
        self.x = x
        self.y = y
        self.dx = dx
        self.dy = dy
        self.color = color

    def move(self):
        self.x += self.dx
        self.y += self.dy

    def draw(self, screen):
        pygame.draw.circle(screen, self.color, (int(self.x), int(self.y)), 3)

#坦克加载类
class TankWar:
    def __init__(self):
        pygame.init()
        self.screen = pygame.display.set_mode((WIDTH, HEIGHT))
        pygame.display.set_caption('坦克大战-1.0(世界)')
        # 加载玩家坦克图片
        self.player_tank_image = load_image('tank_1.png')
        self.player_barrel_image = load_image('tank_barrel.png')
        self.player_tank = Tank(100, 100, self.player_tank_image, self.player_barrel_image, GREEN)
        self.enemy_tanks = []
        for _ in range(3):
            enemy_tank_image = load_image('enemy_1.png')
            enemy_barrel_image = load_image('enemy_barrel.png')
            x = random.randint(0, WIDTH - TANK_SIZE)
            y = random.randint(0, HEIGHT - TANK_SIZE)
            enemy_tank = Tank(x, y, enemy_tank_image, enemy_barrel_image, RED)
            self.enemy_tanks.append(enemy_tank)
        self.clock = pygame.time.Clock()

    def run(self):
        running = True
        while running:
            self.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_UP:
                        self.player_tank.direction = 'UP'
                        self.player_tank.move()
                    elif event.key == pygame.K_DOWN:
                        self.player_tank.direction = 'DOWN'
                        self.player_tank.move()
                    elif event.key == pygame.K_LEFT:
                        self.player_tank.direction = 'LEFT'
                        self.player_tank.move()
                    elif event.key == pygame.K_RIGHT:
                        self.player_tank.direction = 'RIGHT'
                        self.player_tank.move()
                    elif event.key == pygame.K_SPACE:
                        self.player_tank.fire()

            for enemy in self.enemy_tanks:
                # 随机改变敌方坦克方向
                if random.randint(0, 100) < 20:
                    directions = ['UP', 'DOWN', 'LEFT', 'RIGHT']
                    enemy.direction = random.choice(directions)
                enemy.move()
                if random.randint(0, 100) < 10:
                    enemy.fire()

            for bullet in self.player_tank.bullets:
                bullet.move()
                if bullet.x < 0 or bullet.x > WIDTH or bullet.y < 0 or bullet.y > HEIGHT:
                    self.player_tank.bullets.remove(bullet)
                else:
                    for enemy in self.enemy_tanks:
                        if enemy.x < bullet.x < enemy.x + TANK_SIZE and enemy.y < bullet.y < enemy.y + TANK_SIZE:
                            self.enemy_tanks.remove(enemy)

            for enemy in self.enemy_tanks:
                for bullet in enemy.bullets:
                    bullet.move()
                    if bullet.x < 0 or bullet.x > WIDTH or bullet.y < 0 or bullet.y > HEIGHT:
                        enemy.bullets.remove(bullet)
                    else:
                        if self.player_tank.x < bullet.x < self.player_tank.x + TANK_SIZE and self.player_tank.y < bullet.y < self.player_tank.y + TANK_SIZE:
                            running = False

            self.screen.fill(WHITE)
            self.player_tank.draw(self.screen)
            for enemy in self.enemy_tanks:
                enemy.draw(self.screen)
            for bullet in self.player_tank.bullets:
                bullet.draw(self.screen)
            for enemy in self.enemy_tanks:
                for bullet in enemy.bullets:
                    bullet.draw(self.screen)
            pygame.display.flip()

        pygame.quit()

#游戏主函数
if __name__ == '__main__':
    game = TankWar()
    game.run()

第四步:运行效果展示

(后面我还会持续更新哦)

标签:enemy,1.0,bullet,Python,self,小游戏,pygame,tank,barrel
From: https://blog.csdn.net/2401_83954530/article/details/144521489

相关文章

  • Python实现银杏树绘制与效果展示
    银杏树,因其形态优美、叶片独特而被人们喜爱。银杏的叶子呈扇形,秋天时叶片呈现出金黄的色彩,成为秋季的代表之一。今天,我们将使用Python的turtle库来绘制一棵具有银杏树......
  • GanZhiDate类 实现干支历和公历互换 For Python
    GanZhiDate说明在python上运行的,实现干支历和公历互换的类,包括了1949年到2099年的节气数据。GanZhiDate用法实例化一个GanZhiDate对象fromganzhidateimportGanZhiDategan_zhi_date=GanZhiDate(3,3,9,h=0,year=2000)print(gan_zhi_date)#庚辰年戊寅月丙申......
  • 如何用python批量转换.doc文件为.docx文件
    需要用到的库:pywin32、os 实现效果:把文件夹下的文件1.doc、2.doc、3.doc转化成1.docx、2.docx、3.docx,保存到output文件夹下。代码运行前: 代码运行后:  实现代码: #批量把".doc"文件另存在".docx"文件importosfromwin32comimportclientdefdoc_to_docx(p,......
  • python语言匹配链接下载代码
    importrequestsimportreimportostext=“”“”“”使用正确的正则表达式模式,这里的模式匹配以http或https开头,后面跟着任意字符直到.ebt结尾的字符串pattern=r’(https://res.doc88.com.*?))’ebt_urls=re.findall(pattern,text)#print(ebt_url......
  • python 语音转文字
    支持被压缩的wav,缺点是准确率低 importjsonimportwavefromvoskimportModel,KaldiRecognizerfrompydubimportAudioSegmentfrompydub.utilsimportmake_chunksdefrecognize_wave(model,file_path):print(111)#打开WAV音频文件withwave.open(file_pa......
  • 如何在 Ubuntu 20.04 或 22.04 上安装 Python 3
    以下是关于如何在Ubuntu20.04或22.04上安装Python3的详细步骤。Python是一种广泛使用的编程语言,适用于自动化、数据分析、机器学习等领域。Ubuntu系统通常预装了Python3,但如果需要安装或升级到最新版本,可以按照以下方法操作。检查系统是否已安装Python3打......
  • Python+OpenCV系列:AI看图识人、识车、识万物
    在人工智能风靡全球的今天,用Python和OpenCV结合机器学习实现物体识别,不仅是酷炫技能,更是掌握未来的敲门砖。本篇博文手把手教你如何通过摄像头或图片输入,识别人、动物、车辆及其他物品,让你的程序瞬间具备AI能力。一、什么是物体识别?物体识别是计算机视觉中的关键任......
  • python装饰器详解
    一、函数装饰器 #上面是装饰器,下面是原函数defifren(p):#p是额外带来的参数,因为要带参数p所以多了一层函数嵌套defplusnihao(f):defwraper():#核心装饰器代码,f代指sayhello函数,是由上一层传入进来的,本层负责增加前后功能f()......
  • Python系统教程008-条件判断(二)
    知识回顾1、if语句的基本语法?2、常用的比较运算符有哪些?3、注释的分类以及格式4、else处理条件不满足的情况练习:地板上有n个石子,猫头鹰和小兔子正在玩取石子的游戏,从猫头鹰开始,轮流取石子,每次每个动物取走一个石子,猫头鹰能获胜吗?规则如下:流程图:输入格式:一个正整......
  • Python速成脚本小子(附20道基础题)
    当今社会,编程已经成为了一种必备的技能。而Python,作为一门高效简洁的编程语言,备受大家的喜爱。Python语言易学易用,非常适合初学者入门,同时也是各大公司招聘的必备技能之一。那么,如何快速入门Python,成为一个Python速成脚本小子呢?以下是一些建议:1.学习基本语法Python语法......