点击上方码农的后花园”,选择星标” 公众号

精选文章,第一时间送达

大家好,我是 A梦。

今天给大家带来一个 Python 的练手项目。用Python的Pygame游戏开发库编写代码写一个植物大战僵尸!

直接开搞!

1. 引入需要的模块

import pygame
import random

2. 配置图片地址

IMAGE_PATH = 'imgs/'

3. 设置页面宽高

scrrr_width = 800
scrrr_height = 560

4. 创建控制游戏结束的状态

GAMEOVER = False

5. 图片加载报错处理

LOG = '文件:{}中的方法:{}出错'.format(__file__, __name__)

6. 创建地图类

class Map():

7. 存储两张不同颜色的图片名称

map_names_list = [IMAGE_PATH + 'map1.png', IMAGE_PATH + 'map2.png']

8. 初始化地图

def __init__(self, x, y, img_index):self.image = pygame.image.load(Map.map_names_list[img_index])self.position = (x, y)

9. 是否能够种植

self.can_grow = True

10. 加载地图

def load_map(self):MainGame.window.blit(self.image, self.position)

11. 植物类

class Plant(pygame.sprite.Sprite):def __init__(self):super(Plant, self).__init__()self.live = True

12. 加载图片

def load_image(self):if hasattr(self, 'image') and hasattr(self, 'rect'):MainGame.window.blit(self.image, self.rect)else:print(LOG)

13. 向日葵类

class Sunflower(Plant):def __init__(self, x, y):super(Sunflower, self).__init__()self.image = pygame.image.load('imgs/sunflower.png')self.rect = self.image.get_rect()self.rect.x = xself.rect.y = yself.price = 50self.hp = 100# 5 时间计数器self.time_count = 0

14. 新增功能:生成阳光

def produce_money(self):self.time_count += 1if self.time_count == 25:MainGame.money += 5self.time_count = 0

15. 向日葵加入到窗口中

def display_sunflower(self):MainGame.window.blit(self.image, self.rect)

16. 豌豆射手类

class PeaShooter(Plant):def __init__(self, x, y):super(PeaShooter, self).__init__()# self.image 为一个 surfaceself.image = pygame.image.load('imgs/peashooter.png')self.rect = self.image.get_rect()self.rect.x = xself.rect.y = yself.price = 50self.hp = 200# 6 发射计数器self.shot_count = 0

17. 增加射击方法

def shot(self):# 6 记录是否应该射击should_fire = Falsefor zombie in MainGame.zombie_list:if zombie.rect.y == self.rect.y and zombie.rect.x < 800 and zombie.rect.x > self.rect.x:should_fire = True# 6 如果活着if self.live and should_fire:self.shot_count += 1# 6 计数器到25发射一次if self.shot_count == 25:# 6 基于当前豌豆射手的位置,创建子弹peabullet = PeaBullet(self)# 6 将子弹存储到子弹列表中MainGame.peabullet_list.append(peabullet)self.shot_count = 0

18. 将豌豆射手加入到窗口中的方法

def display_peashooter(self):MainGame.window.blit(self.image, self.rect)

19. 豌豆子弹类

class PeaBullet(pygame.sprite.Sprite):def __init__(self, peashooter):self.live = Trueself.image = pygame.image.load('imgs/peabullet.png')self.damage = 50self.speed = 10self.rect = self.image.get_rect()self.rect.x = peashooter.rect.x + 60self.rect.y = peashooter.rect.y + 15def move_bullet(self):# 7 在屏幕范围内,实现往右移动if self.rect.x < scrrr_width:self.rect.x += self.speedelse:self.live = False# 7 新增,子弹与僵尸的碰撞def hit_zombie(self):for zombie in MainGame.zombie_list:if pygame.sprite.collide_rect(self, zombie):# 打中僵尸之后,修改子弹的状态,self.live = False# 僵尸掉血zombie.hp -= self.damageif zombie.hp <= 0:zombie.live = Falseself.nextLevel()# 7闯关方法def nextLevel(self):MainGame.score += 20MainGame.remnant_score -= 20for i in range(1, 100):if MainGame.score == 100 * i and MainGame.remnant_score == 0:MainGame.remnant_score = 100 * iMainGame.shaoguan += 1MainGame.produce_zombie += 50def display_peabullet(self):MainGame.window.blit(self.image, self.rect)

20. 僵尸类

class Zombie(pygame.sprite.Sprite):def __init__(self, x, y):super(Zombie, self).__init__()self.image = pygame.image.load('imgs/zombie.png')self.rect = self.image.get_rect()self.rect.x = xself.rect.y = yself.hp = 1000self.damage = 2self.speed = 1self.live = Trueself.stop = False# 9 僵尸的移动def move_zombie(self):if self.live and not self.stop:self.rect.x -= self.speedif self.rect.x < -80:# 8 调用游戏结束方法MainGame().gameOver()# 9 判断僵尸是否碰撞到植物,如果碰撞,调用攻击植物的方法def hit_plant(self):for plant in MainGame.plants_list:if pygame.sprite.collide_rect(self, plant):# 8  僵尸移动状态的修改self.stop = Trueself.eat_plant(plant)# 9 僵尸攻击植物def eat_plant(self, plant):# 9 植物生命值减少plant.hp -= self.damage# 9 植物死亡后的状态修改,以及地图状态的修改if plant.hp <= 0:a = plant.rect.y // 80 - 1b = plant.rect.x // 80map = MainGame.map_list[a][b]map.can_grow = Trueplant.live = False# 8 修改僵尸的移动状态self.stop = False# 9 将僵尸加载到地图中def display_zombie(self):MainGame.window.blit(self.image, self.rect)

21. 主程序

class MainGame():# 2 创建关数,得分,剩余分数,钱数shaoguan = 1score = 0remnant_score = 100money = 200# 3 存储所有地图坐标点map_points_list = []# 3 存储所有的地图块map_list = []# 4 存储所有植物的列表plants_list = []# 7 存储所有豌豆子弹的列表peabullet_list = []# 9 新增存储所有僵尸的列表zombie_list = []count_zombie = 0produce_zombie = 100# 1 加载游戏窗口def init_window(self):# 1 调用显示模块的初始化pygame.display.init()# 1 创建窗口MainGame.window = pygame.display.set_mode([scrrr_width, scrrr_height])# 2 文本绘制def draw_text(self, content, size, color):pygame.font.init()font = pygame.font.SysFont('kaiti', size)text = font.render(content, True, color)return text# 2 加载帮助提示def load_help_text(self):text1 = self.draw_text('1.按左键创建向日葵 2.按右键创建豌豆射手', 26, (255, 0, 0))MainGame.window.blit(text1, (5, 5))# 3 初始化坐标点def init_plant_points(self):for y in range(1, 7):points = []for x in range(10):point = (x, y)points.append(point)MainGame.map_points_list.append(points)print("MainGame.map_points_list", MainGame.map_points_list)# 3 初始化地图def init_map(self):for points in MainGame.map_points_list:temp_map_list = list()for point in points:# map = Noneif (point[0] + point[1]) % 2 == 0:map = Map(point[0] * 80, point[1] * 80, 0)else:map = Map(point[0] * 80, point[1] * 80, 1)# 将地图块加入到窗口中temp_map_list.append(map)print("temp_map_list", temp_map_list)MainGame.map_list.append(temp_map_list)print("MainGame.map_list", MainGame.map_list)# 3 将地图加载到窗口中def load_map(self):for temp_map_list in MainGame.map_list:for map in temp_map_list:map.load_map()# 6 增加豌豆射手发射处理def load_plants(self):for plant in MainGame.plants_list:# 6 优化加载植物的处理逻辑if plant.live:if isinstance(plant, Sunflower):plant.display_sunflower()plant.produce_money()elif isinstance(plant, PeaShooter):plant.display_peashooter()plant.shot()else:MainGame.plants_list.remove(plant)# 7 加载所有子弹的方法def load_peabullets(self):for b in MainGame.peabullet_list:if b.live:b.display_peabullet()b.move_bullet()# v1.9 调用子弹是否打中僵尸的方法b.hit_zombie()else:MainGame.peabullet_list.remove(b)# 8事件处理def deal_events(self):# 8 获取所有事件eventList = pygame.event.get()# 8 遍历事件列表,判断for e in eventList:if e.type == pygame.QUIT:self.gameOver()elif e.type == pygame.MOUSEBUTTONDOWN:# print('按下鼠标按键')print(e.pos)# print(e.button)#左键1  按下滚轮2 上转滚轮为4 下转滚轮为5  右键 3x = e.pos[0] // 80y = e.pos[1] // 80print(x, y)map = MainGame.map_list[y - 1][x]print(map.position)# 8 增加创建时候的地图装填判断以及金钱判断if e.button == 1:if map.can_grow and MainGame.money >= 50:sunflower = Sunflower(map.position[0], map.position[1])MainGame.plants_list.append(sunflower)print('当前植物列表长度:{}'.format(len(MainGame.plants_list)))map.can_grow = FalseMainGame.money -= 50elif e.button == 3:if map.can_grow and MainGame.money >= 50:peashooter = PeaShooter(map.position[0], map.position[1])MainGame.plants_list.append(peashooter)print('当前植物列表长度:{}'.format(len(MainGame.plants_list)))map.can_grow = FalseMainGame.money -= 50# 9 新增初始化僵尸的方法def init_zombies(self):for i in range(1, 7):dis = random.randint(1, 5) * 200zombie = Zombie(800 + dis, i * 80)MainGame.zombie_list.append(zombie)# 9将所有僵尸加载到地图中def load_zombies(self):for zombie in MainGame.zombie_list:if zombie.live:zombie.display_zombie()zombie.move_zombie()# v2.0 调用是否碰撞到植物的方法zombie.hit_plant()else:MainGame.zombie_list.remove(zombie)# 1 开始游戏def start_game(self):# 1 初始化窗口self.init_window()# 3 初始化坐标和地图self.init_plant_points()self.init_map()# 9 调用初始化僵尸的方法self.init_zombies()# 1 只要游戏没结束,就一直循环while not GAMEOVER:# 1 渲染白色背景MainGame.window.fill((255, 255, 255))# 2 渲染的文字和坐标位置MainGame.window.blit(self.draw_text('当前钱数$: {}'.format(MainGame.money), 26, (255, 0, 0)), (500, 40))MainGame.window.blit(self.draw_text('当前关数{},得分{},距离下关还差{}分'.format(MainGame.shaoguan,MainGame.score,MainGame.remnant_score),26,(255,0,0)),(5,40))self.load_help_text()# 3 需要反复加载地图self.load_map()# 6 调用加载植物的方法self.load_plants()# 7  调用加载所有子弹的方法self.load_peabullets()# 8 调用事件处理的方法self.deal_events()# 9 调用展示僵尸的方法self.load_zombies()# 9 计数器增长,每数到100,调用初始化僵尸的方法MainGame.count_zombie += 1if MainGame.count_zombie == MainGame.produce_zombie:self.init_zombies()MainGame.count_zombie = 0pygame.time.wait(10)pygame.display.update()def gameOver(self):MainGame.window.blit(self.draw_text('游戏结束', 50, (255, 0, 0)), (300, 200))print('游戏结束')pygame.time.wait(400)global GAMEOVERGAMEOVER = Trueif __name__ == '__main__':game = MainGame()game.start_game()

运行效果图就是这样的啦

在后台回复: Python神器,即可获取下载源代码,觉得不错的,记得三连哦~

参考:https://blog.csdn.net/Gtieguo

用Python写了一个植物大战僵尸小游戏相关推荐

  1. 基于C++控制台(Windows平台)的一个植物大战僵尸小游戏

    Plants Vs Zombies --南京大学2019秋季学期 "高级程序设计" 课程设计二 基于C++控制台(Windows平台)的一个植物大战僵尸小游戏 已实现的目标: 12 ...

  2. 【Python游戏】Python实现一个植物大战僵尸小游戏,非常简单,可以用于做毕业设计哟 | 附源码

    前言 halo,包子们上午好 今天给打击整一个植物大战僵尸 无广告版本 哈哈 说实话,现在的小游戏很多都是有广告,多少有点难受 今天给大家直接安排 相关文件 关注小编,私信小编领取哟! 当然别忘了一件 ...

  3. 【python】pygame实现植物大战僵尸小游戏(附源码 有注释)

    全部源码和数据集请点赞关注收藏后评论区留言或私信博主要 完全免费~~ 动态演示视频已经上传到我的个人主页 有兴趣的伙伴可自行前往 观看 相信许多小伙伴们都玩过植物大战僵尸这款游戏,可以说是很多人的童年 ...

  4. 用Python写了一个空洞机甲小游戏

    来源:http://nxw.so/4WSng 先来看看效果图: 由于项目代码过多,这里只给出部分代码. 图片素材和源码的下载链接在文章结尾,大家自行下载即可. import pygame,sys im ...

  5. python卖水果_小姨开水果店的,所以今天用Python写了一个水果店小系统!

    原标题:小姨开水果店的,所以今天用Python写了一个水果店小系统! 前言 今天晚上才刚下班,小姨就提了我最爱吃的榴莲过来,说不吃就坏了. 我一眼就看破了她的用意,哈哈哈 我这个小姨也是一起长大的,她 ...

  6. JS实现植物大战僵尸小游戏,代码记录及效果展示

    前几天看到了一个很有趣的demo,用js制作植物大战僵尸小游戏,本着学习的心态,对照着做了一下,发现这里面的一些代码设计的确很精妙,这里分享下源码和效果,如果有需要,可以看下. 效果如下: 下载地址

  7. 用Python代码做一个简单数字小游戏

    #作者是一个十三岁的小男孩. 编辑工具 电脑Python 需要模块 random #今日用代码做一个猜数小游戏 #话不多说,上代码!!! import random number = random.r ...

  8. 如何用python简单做一个植物大战僵尸 源码

    简单实现的植物大战僵尸我自己网上扣了王校长的图做了个热狗射手hhhhhhhh最后面给大家分享一下我扣的热狗png图片求点赞!!!""" v1.81.完善僵尸类2.加载僵尸 ...

  9. 用纯C语言写的一个植物大战僵尸的外挂

    http://www.cnblogs.com/xuesongshu/ 这个外挂主要用来帮助鼠标点击的.最近很忙,代码注释我以后会慢慢补充进来.请多多指点. 1 #include "PC2St ...

最新文章

  1. java多线程消息队列_java多线程消息队列的实现
  2. Marketing learning-2
  3. 每日 30 秒 ⏱ 唯一的数据集
  4. refreshtoken用mysql_「SpringCloud」 Spring Security OAuth2 Mysql管理在线Token
  5. 桌面怎么设置 计算机 网络,Win10 10130桌面电脑网络图标怎么设置?
  6. chrome json插件_如何使用此免费的Chrome扩展程序(或Firefox插件)获取易于阅读的JSON树
  7. 【C】strcpy()需谨慎使用;
  8. Python基础知识汇总
  9. 有哪些在朋友圈发会被秒赞的文案?
  10. 看半小时漫画,通晓计算机基础
  11. HanLP1.5.2 -python使用介绍
  12. pp助手|pp助手下载
  13. 服务器修改字体,云服务器怎么修改字体
  14. Word 中几个较有用的宏
  15. 国外香港云计算服务器评测,UCLOUD云计算活动及体验香港云主机综合评测记录
  16. 瑞芯微RK3328硬件设计指南
  17. 天宝营养冲刺深交所IPO:业绩明显波动,深创投是股东
  18. 安卓手机数据备份与恢复方法汇总和操作详解
  19. 生成世界地图并在地图上画圆圈
  20. 计算机安全原理与实践第三版答案,计算机安全: 原理与实践 : 第3版

热门文章

  1. MySQL limit 1,1的含义
  2. 什么是RGB-D图像
  3. 三年80个用3dmax建模会遇到的问题,入门基础和老手都会遇到的问题及解答
  4. Android向SDCard中上传文件时报错:Failed to push items
  5. Echarts使用map3D+visualMap 实现地图下钻,区域高亮状态下变高
  6. Analytic hierarchy process
  7. openlayers结合谷歌api进行地图定位
  8. ps怎么快速将图片变成黑白 在线PS哪个好用
  9. ajax 实现关键字搜索,jQuery实现搜索页面关键字的功能
  10. 万圣节元素矢量图案 Halloween Vector Pattern