打造吃豆人小游戏,一共需要这几个文件:
Game.py
Levels.py
Sprites.py
以及一些配置文件与源文件。

废话不多说,直接上代码:

Game.py

"""
Function:吃豆豆小游戏
"""
import os
import sys
import pygame
import Levels"""定义一些必要的参数"""
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
YELLOW = (255, 255, 0)
PURPLE = (255, 0, 255)
SKYBLUE = (0, 191, 255)
BGMPATH = os.path.join(os.getcwd(), "resources/sounds/bg.mp3")
ICONPATH = os.path.join(os.getcwd(), "resources/images/icon.png")
FONTPATH = os.path.join(os.getcwd(), "resources/font/ALGER.TTF")
HEROPATH = os.path.join(os.getcwd(), "resources/images/pacman.png")
BlinkyPATH = os.path.join(os.getcwd(), "resources/images/Blinky.png")
ClydePATH = os.path.join(os.getcwd(), "resources/images/Clyde.png")
InkyPATH = os.path.join(os.getcwd(), "resources/images/Inky.png")
PinkyPATH = os.path.join(os.getcwd(), "resources/images/Pinky.png")"""开始某一关游戏"""def startLevelGame(level, screen, font):clock = pygame.time.Clock()SCORE = 0wall_sprites = level.setupWalls(SKYBLUE)gate_sprites = level.setupGate(WHITE)hero_sprites, ghost_sprites = level.setupPlayers(HEROPATH, [BlinkyPATH, ClydePATH, InkyPATH, PinkyPATH])food_sprites = level.setupFood(YELLOW, WHITE)is_clearance = Falsewhile True:for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit(-1)pygame.quit()if event.type == pygame.KEYDOWN:if event.key == pygame.K_LEFT:for hero in hero_sprites:hero.changeSpeed([-1, 0])hero.is_move = Trueelif event.key == pygame.K_RIGHT:for hero in hero_sprites:hero.changeSpeed([1, 0])hero.is_move = Trueelif event.key == pygame.K_UP:for hero in hero_sprites:hero.changeSpeed([0, -1])hero.is_move = Trueelif event.key == pygame.K_DOWN:for hero in hero_sprites:hero.changeSpeed([0, 1])hero.is_move = Trueif event.type == pygame.KEYUP:if ((event.key == pygame.K_LEFT)or (event.key == pygame.K_RIGHT)or (event.key == pygame.K_UP)or (event.key == pygame.K_DOWN)):hero.is_move = Falsescreen.fill(BLACK)for hero in hero_sprites:hero.update(wall_sprites, gate_sprites)hero_sprites.draw(screen)for hero in hero_sprites:food_eaten = pygame.sprite.spritecollide(hero, food_sprites, True)SCORE += len(food_eaten)wall_sprites.draw(screen)gate_sprites.draw(screen)food_sprites.draw(screen)for ghost in ghost_sprites:# 幽灵随机运动(效果不好且有BUG)"""res = ghost.update(wall_sprites, None)while not res:ghost.changeSpeed(ghost.randomDirection())res = ghost.update(wall_sprites, None)"""# 指定幽灵运动路径if ghost.tracks_loc[1] < ghost.tracks[ghost.tracks_loc[0]][2]:ghost.changeSpeed(ghost.tracks[ghost.tracks_loc[0]][0:2])ghost.tracks_loc[1] += 1else:if ghost.tracks_loc[0] < len(ghost.tracks) - 1:ghost.tracks_loc[0] += 1elif ghost.role_name == "Clyde":ghost.tracks_loc[0] = 2else:ghost.tracks_loc[0] = 0ghost.changeSpeed(ghost.tracks[ghost.tracks_loc[0]][0:2])ghost.tracks_loc[1] = 0if ghost.tracks_loc[1] < ghost.tracks[ghost.tracks_loc[0]][2]:ghost.changeSpeed(ghost.tracks[ghost.tracks_loc[0]][0:2])else:if ghost.tracks_loc[0] < len(ghost.tracks) - 1:loc0 = ghost.tracks_loc[0] + 1elif ghost.role_name == "Clyde":loc0 = 2else:loc0 = 0ghost.changeSpeed(ghost.tracks[loc0][0:2])ghost.update(wall_sprites, None)ghost_sprites.draw(screen)score_text = font.render("Score: %s" % SCORE, True, RED)screen.blit(score_text, [10, 10])if len(food_sprites) == 0:is_clearance = Truebreakif pygame.sprite.groupcollide(hero_sprites, ghost_sprites, False, False):is_clearance = Falsebreakpygame.display.flip()clock.tick(10)return is_clearance"""显示文字"""def showText(screen, font, is_clearance, flag=False):clock = pygame.time.Clock()msg = "Game Over!" if not is_clearance else "Congratulations, you won!"positions = ([[235, 233], [65, 303], [170, 333]]if not is_clearanceelse [[145, 233], [65, 303], [170, 333]])surface = pygame.Surface((400, 200))surface.set_alpha(10)surface.fill((128, 128, 128))screen.blit(surface, (100, 200))texts = [font.render(msg, True, WHITE),font.render("Press ENTER to continue or play again.", True, WHITE),font.render("Press ESCAPE to quit.", True, WHITE),]while True:for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()pygame.quit()if event.type == pygame.KEYDOWN:if event.key == pygame.K_RETURN:if is_clearance:if not flag:returnelse:main(initialize())else:main(initialize())elif event.key == pygame.K_ESCAPE:sys.exit()pygame.quit()for idx, (text, position) in enumerate(zip(texts, positions)):screen.blit(text, position)pygame.display.flip()clock.tick(10)"""初始化"""def initialize():pygame.init()icon_image = pygame.image.load(ICONPATH)pygame.display.set_icon(icon_image)screen = pygame.display.set_mode([606, 606])pygame.display.set_caption("吃豆人")return screen"""主函数"""def main(screen):pygame.mixer.init()pygame.mixer.music.load(BGMPATH)pygame.mixer.music.play(-1, 0.0)pygame.font.init()font_small = pygame.font.Font(FONTPATH, 18)font_big = pygame.font.Font(FONTPATH, 24)for num_level in range(1, Levels.NUMLEVELS + 1):if num_level == 1:level = Levels.Level1()is_clearance = startLevelGame(level, screen, font_small)if num_level == Levels.NUMLEVELS:showText(screen, font_big, is_clearance, True)else:showText(screen, font_big, is_clearance)"""test"""
if __name__ == "__main__":main(initialize())

这里我们采用了pygame来进行游戏的主要设计。

Levels.py

'''
Function:定义关卡
'''
import pygame
from Sprites import *NUMLEVELS = 1'''关卡一'''class Level1():def __init__(self):self.info = 'level1''''创建墙'''def setupWalls(self, wall_color):self.wall_sprites = pygame.sprite.Group()wall_positions = [[0, 0, 6, 600],[0, 0, 600, 6],[0, 600, 606, 6],[600, 0, 6, 606],[300, 0, 6, 66],[60, 60, 186, 6],[360, 60, 186, 6],[60, 120, 66, 6],[60, 120, 6, 126],[180, 120, 246, 6],[300, 120, 6, 66],[480, 120, 66, 6],[540, 120, 6, 126],[120, 180, 126, 6],[120, 180, 6, 126],[360, 180, 126, 6],[480, 180, 6, 126],[180, 240, 6, 126],[180, 360, 246, 6],[420, 240, 6, 126],[240, 240, 42, 6],[324, 240, 42, 6],[240, 240, 6, 66],[240, 300, 126, 6],[360, 240, 6, 66],[0, 300, 66, 6],[540, 300, 66, 6],[60, 360, 66, 6],[60, 360, 6, 186],[480, 360, 66, 6],[540, 360, 6, 186],[120, 420, 366, 6],[120, 420, 6, 66],[480, 420, 6, 66],[180, 480, 246, 6],[300, 480, 6, 66],[120, 540, 126, 6],[360, 540, 126, 6]]for wall_position in wall_positions:wall = Wall(*wall_position, wall_color)self.wall_sprites.add(wall)return self.wall_sprites'''创建门'''def setupGate(self, gate_color):self.gate_sprites = pygame.sprite.Group()self.gate_sprites.add(Wall(282, 242, 42, 2, gate_color))return self.gate_sprites'''创建角色'''def setupPlayers(self, hero_image_path, ghost_images_path):self.hero_sprites = pygame.sprite.Group()self.ghost_sprites = pygame.sprite.Group()self.hero_sprites.add(Player(287, 439, hero_image_path))for each in ghost_images_path:role_name = each.split('/')[-1].split('.')[0]if role_name == 'Blinky':player = Player(287, 199, each)player.is_move = Trueplayer.tracks = [[0, -0.5, 4], [0.5, 0, 9], [0, 0.5, 11], [0.5, 0, 3], [0, 0.5, 7], [-0.5, 0, 11],[0, 0.5, 3],[0.5, 0, 15], [0, -0.5, 15], [0.5, 0, 3], [0, -0.5, 11], [-0.5, 0, 3], [0, -0.5, 11],[-0.5, 0, 3],[0, -0.5, 3], [-0.5, 0, 7], [0, -0.5, 3], [0.5, 0, 15], [0, 0.5, 15], [-0.5, 0, 3],[0, 0.5, 3],[-0.5, 0, 3], [0, -0.5, 7], [-0.5, 0, 3], [0, 0.5, 7], [-0.5, 0, 11], [0, -0.5, 7],[0.5, 0, 5]]self.ghost_sprites.add(player)elif role_name == 'Clyde':player = Player(319, 259, each)player.is_move = Trueplayer.tracks = [[-1, 0, 2], [0, -0.5, 4], [0.5, 0, 5], [0, 0.5, 7], [-0.5, 0, 11], [0, -0.5, 7],[-0.5, 0, 3], [0, 0.5, 7], [-0.5, 0, 7], [0, 0.5, 15], [0.5, 0, 15], [0, -0.5, 3],[-0.5, 0, 11], [0, -0.5, 7], [0.5, 0, 3], [0, -0.5, 11], [0.5, 0, 9]]self.ghost_sprites.add(player)elif role_name == 'Inky':player = Player(255, 259, each)player.is_move = Trueplayer.tracks = [[1, 0, 2], [0, -0.5, 4], [0.5, 0, 10], [0, 0.5, 7], [0.5, 0, 3], [0, -0.5, 3],[0.5, 0, 3], [0, -0.5, 15], [-0.5, 0, 15], [0, 0.5, 3], [0.5, 0, 15], [0, 0.5, 11],[-0.5, 0, 3], [0, -0.5, 7], [-0.5, 0, 11], [0, 0.5, 3], [-0.5, 0, 11], [0, 0.5, 7],[-0.5, 0, 3], [0, -0.5, 3], [-0.5, 0, 3], [0, -0.5, 15], [0.5, 0, 15], [0, 0.5, 3],[-0.5, 0, 15], [0, 0.5, 11], [0.5, 0, 3], [0, -0.5, 11], [0.5, 0, 11], [0, 0.5, 3],[0.5, 0, 1]]self.ghost_sprites.add(player)elif role_name == 'Pinky':player = Player(287, 259, each)player.is_move = Trueplayer.tracks = [[0, -1, 4], [0.5, 0, 9], [0, 0.5, 11], [-0.5, 0, 23], [0, 0.5, 7], [0.5, 0, 3],[0, -0.5, 3], [0.5, 0, 19], [0, 0.5, 3], [0.5, 0, 3], [0, 0.5, 3], [0.5, 0, 3],[0, -0.5, 15], [-0.5, 0, 7], [0, 0.5, 3], [-0.5, 0, 19], [0, -0.5, 11], [0.5, 0, 9]]self.ghost_sprites.add(player)return self.hero_sprites, self.ghost_sprites'''创建食物'''def setupFood(self, food_color, bg_color):self.food_sprites = pygame.sprite.Group()for row in range(19):for col in range(19):if (row == 7 or row == 8) and (col == 8 or col == 9 or col == 10):continueelse:food = Food(30 * col + 32, 30 * row + 32, 4, 4, food_color, bg_color)is_collide = pygame.sprite.spritecollide(food, self.wall_sprites, False)if is_collide:continueis_collide = pygame.sprite.spritecollide(food, self.hero_sprites, False)if is_collide:continueself.food_sprites.add(food)return self.food_sprites

Levels的作用是定义关卡。

Sprites.py

'''
Function:定义一些精灵类
'''
import random
import pygame'''墙类'''class Wall(pygame.sprite.Sprite):def __init__(self, x, y, width, height, color, **kwargs):pygame.sprite.Sprite.__init__(self)self.image = pygame.Surface([width, height])self.image.fill(color)self.rect = self.image.get_rect()self.rect.left = xself.rect.top = y'''食物类'''class Food(pygame.sprite.Sprite):def __init__(self, x, y, width, height, color, bg_color, **kwargs):pygame.sprite.Sprite.__init__(self)self.image = pygame.Surface([width, height])self.image.fill(bg_color)self.image.set_colorkey(bg_color)pygame.draw.ellipse(self.image, color, [0, 0, width, height])self.rect = self.image.get_rect()self.rect.left = xself.rect.top = y'''角色类'''class Player(pygame.sprite.Sprite):def __init__(self, x, y, role_image_path):pygame.sprite.Sprite.__init__(self)self.role_name = role_image_path.split('/')[-1].split('.')[0]self.base_image = pygame.image.load(role_image_path).convert()self.image = self.base_image.copy()self.rect = self.image.get_rect()self.rect.left = xself.rect.top = yself.prev_x = xself.prev_y = yself.base_speed = [30, 30]self.speed = [0, 0]self.is_move = Falseself.tracks = []self.tracks_loc = [0, 0]'''改变速度方向'''def changeSpeed(self, direction):if direction[0] < 0:self.image = pygame.transform.flip(self.base_image, True, False)elif direction[0] > 0:self.image = self.base_image.copy()elif direction[1] < 0:self.image = pygame.transform.rotate(self.base_image, 90)elif direction[1] > 0:self.image = pygame.transform.rotate(self.base_image, -90)self.speed = [direction[0] * self.base_speed[0], direction[1] * self.base_speed[1]]return self.speed'''更新角色位置'''def update(self, wall_sprites, gate_sprites):if not self.is_move:return Falsex_prev = self.rect.lefty_prev = self.rect.topself.rect.left += self.speed[0]self.rect.top += self.speed[1]is_collide = pygame.sprite.spritecollide(self, wall_sprites, False)if gate_sprites is not None:if not is_collide:is_collide = pygame.sprite.spritecollide(self, gate_sprites, False)if is_collide:self.rect.left = x_prevself.rect.top = y_prevreturn Falsereturn True'''生成随机的方向'''def randomDirection(self):return random.choice([[-0.5, 0], [0.5, 0], [0, 0.5], [0, -0.5]])

这是为了让怪物与吃豆人运动的一系列操作。

到这里我们的整个游戏设计就结束了,只要运行Game.py,就可以尽情地玩耍啦。让我们来看看效果如何:


到这里我们的文章就结束了,想偷懒的小伙伴们请注意,这里有我已经做好的成品,放在百度网盘里,不拿白不拿哦!
链接:https://pan.baidu.com/s/1JiqwK4kWZkXLJ1G7ThT2ZA
提取码:0721


原创不易,求打赏 :)

关于我:11岁小学生,马上六年级了,喜欢个人研究一些python和c++的编程内容,希望以后能去大厂(最好是鹅厂)工作。

3个文件,不到400行代码打造经典吃豆人小游戏相关推荐

  1. c 语言500行小游戏代码,500行代码使用python写个微信小游戏飞机大战游戏.pdf

    500行行代代码码使使用用python写写个个微微信信小小游游戏戏飞飞机机大大战战游游戏戏 这篇文章主要介绍了500行代码使用python写个微信小游戏飞机大战游戏,本文通过实例代码给大家介绍的非常详 ...

  2. python代码示例500行源代码-500行代码使用python写个微信小游戏飞机大战游戏

    这几天在重温微信小游戏的飞机大战,玩着玩着就在思考人生了,这飞机大战怎么就可以做的那么好,操作简单,简单上手. 帮助蹲厕族.YP族.饭圈女孩在无聊之余可以有一样东西让他们振作起来!让他们的左手 / 右 ...

  3. 怎么把4399小游戏的代码_25行代码带你爬取4399小游戏数据,看下童年的游戏是否还在...

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 还记得童年的网页小游戏吗?今天带大家爬取4399小游戏网站的数据,游戏名字+链接地址 目标网 ...

  4. 25行代码带你爬取4399小游戏数据,看下童年的游戏是否还在

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 还记得童年的网页小游戏吗?今天带大家爬取4399小游戏网站的数据,游戏名字+链接地址 目标网 ...

  5. python爬取4399小游戏数据_25行代码带你爬取4399小游戏数据,看下童年的游戏是否还在...

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 还记得童年的网页小游戏吗?今天带大家爬取4399小游戏网站的数据,游戏名字+链接地址 目标网 ...

  6. python吃豆人代码_像“吃豆人”一样的黑洞正在互相吞噬

    "吃豆人"游戏竟然能解释黑洞如何互相吞噬? 在<物理评论快报>发表的一项研究揭示了黑洞是如何融合在一起的,在此之前这仍然是个谜.这篇论文指出,这些黑洞间的融合来自于每个 ...

  7. 400行代码实现双人对战五子棋(适合新手入门)

    400行代码实现双人对战五子棋(适合新手入门) 跟上一篇博客一样,都是看了慕课网的视频之后写的学习记录,记录一下实现的思路,大部分内容比较简单,但也从中学到了很多东西. 按惯例首先看一下效果:(素材都 ...

  8. 用c语言400行代码小游戏,程序员400行代码制作翻牌游戏解决无聊时间

    原标题:程序员400行代码制作翻牌游戏解决无聊时间 上班感觉累,很想放假,但是放假在家又感觉非常无聊,总是不知道干什么,又感觉还不如上班呢,反正无聊不如练练写小游戏吧,即练习了代码,做完后还能接着玩, ...

  9. python写一个游戏多少代码-使用50行Python代码从零开始实现一个AI平衡小游戏

    集智导读: 本文会为大家展示机器学习专家 Mike Shi 如何用 50 行 Python 代码创建一个 AI,使用增强学习技术,玩耍一个保持杆子平衡的小游戏.所用环境为标准的 OpenAI Gym, ...

  10. 50行python游戏代码_使用50行Python代码从零开始实现一个AI平衡小游戏

    使用50行Python代码从零开始实现一个AI平衡小游戏 发布时间:2020-10-23 09:26:14 来源:脚本之家 阅读:74 集智导读: 本文会为大家展示机器学习专家 Mike Shi 如何 ...

最新文章

  1. rtp 多媒体流同步控制 实时传输协议 简介
  2. Dockerfile指令详解:ONBUILD 为他人作嫁衣裳
  3. 不同版本的mysql_windows下如何让多个个不同版本的mysql共存-百度经验
  4. dbml mysql_MySQL数据库笔记二:数据类型及数据库操作
  5. Java虚拟机专题之内存分配(读书笔记)
  6. metal分析是什么意思_GWAS数据如何做meta分析?
  7. Java,List转json,json转List
  8. Ubuntu系统文件被上锁了怎么编辑:Ubuntu系统获得读写权限
  9. Matlab中erf函数的用法
  10. SAM-BA 2.12 Patch 7 win7 64位 的安装
  11. input输入框提示语
  12. [BZOJ5276] Skyfall [CF235E] Number Challenge [莫比乌斯反演]
  13. 被晨光搁浅的誓言无声
  14. (71)--爬取拉勾网招聘信息
  15. wox无法启动解决办法:
  16. 概率论在实际生活的例子_日常生活中的概率统计
  17. ReactOS实践(一) ReactOS 源代码编译以及VMWare下运行
  18. 面试官十年面试经验总结
  19. Android super.img 镜像解包
  20. https协议能否让网站,优先被百度收录,个人观点

热门文章

  1. php 设置针式打印机纸张,针式打印机设置方法 针式打印机打印连续纸设置技巧【图文】...
  2. 独立开发者能够从这位作家身上学些什么
  3. 使用腾讯云服务器搭建鸿蒙操作系统编译环境
  4. ​VB语言凉凉了!微软宣布放弃不再​更新,GitHub正式收购 npm ,力挺整个JavaScript生态!...
  5. TF-IDF算法简介
  6. 招投标工作中投标书编制的流程是怎样的?
  7. C#实现多人视频聊天
  8. 均线颜色怎么区分_六种颜色的均线包括哪六种颜色,其代表的含义分别是什么?...
  9. 基于收益率的基金绩效归因
  10. JS验证邮箱 身份证 VISA 卡[转]