Python Pygame实战之超级 * 人游戏的实现
作者:嗨!栗子同学 时间:2023-07-24 00:56:11
前言
如今的玩家们在无聊的时候会玩些什么游戏呢?
王者还是吃鸡是最多的选择。但在80、90年代的时候多是一些很简单的游戏:《超级玛丽》、《蜘蛛纸牌》、《魂斗罗》......
不知道还有人记得《 * 人》这款怀旧的产品嘛?
啊这,不对不对,放错图片了下面这才是童年的正确打开方式
今天小编就带大家怀旧一波,来给大家用代码仿制一下童年大家玩儿过的《 * 人》小游戏!
一、环境安装
1.素材(图片)
2.环境安装
本文是由Pygame写的小游戏。
涉及运行环境:Python3.7、Pycharm社区版、Pygame模块。
pip install +模块名 或pip install -i https://pypi.douban.com/simple/ +模块名
二、代码演示
1.配置文件
'''配置文件'''
import os
'''屏幕大小'''
SCREENSIZE = (640, 480)
'''块大小'''
BLOCKSIZE = 30
'''FPS'''
FPS = 30
'''游戏地图路径'''
GAMEMAPPATHS = [os.path.join(os.getcwd(), path) for path in \
['resources/maps/1.map', 'resources/maps/2.map']]
'''墙路径'''
WALLPATHS = [os.path.join(os.getcwd(), path) for path in \
['resources/images/misc/wall0.png', 'resources/images/misc/wall1.png', 'resources/images/misc/wall2.png']]
'''英雄路径'''
HERODKPATHS = [os.path.join(os.getcwd(), path) for path in \
['resources/images/dk/left.png', 'resources/images/dk/right.png', 'resources/images/dk/up.png', 'resources/images/dk/down.png']]
HEROZELDAPATHS = [os.path.join(os.getcwd(), path) for path in \
['resources/images/zelda/left.png', 'resources/images/zelda/right.png', 'resources/images/zelda/up.png', 'resources/images/zelda/down.png']]
HEROBATMANPATHS = [os.path.join(os.getcwd(), path) for path in \
['resources/images/batman/left.png', 'resources/images/batman/right.png', 'resources/images/batman/up.png', 'resources/images/batman/down.png']]
'''水果路径'''
FRUITPATHS = [os.path.join(os.getcwd(), path) for path in \
['resources/images/misc/banana.png', 'resources/images/misc/cherry.png']]
'''背景路径'''
BACKGROUNDPATHS = [os.path.join(os.getcwd(), path) for path in \
['resources/images/misc/bg0.png', 'resources/images/misc/bg1.png', 'resources/images/misc/bg2.png']]
''' * 和发射路径'''
BOMBPATH = os.path.join(os.getcwd(), 'resources/images/misc/bomb.png')
FIREPATH = os.path.join(os.getcwd(), 'resources/images/misc/fire.png')
'''背景音乐'''
BGMPATH = os.path.join(os.getcwd(), 'resources/audio/bgm.mp3')
'''一些颜色'''
YELLOW = (255, 255, 0)
BLUE = (0, 0, 255)
RED = (255, 0, 0)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
2.主程序
import sys
import cfg
import random
import pygame
from modules import *
'''游戏主程序'''
def main(cfg):
# 初始化
pygame.init()
pygame.mixer.init()
pygame.mixer.music.load(cfg.BGMPATH)
pygame.mixer.music.play(-1, 0.0)
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption(' * 人小游戏')
# 开始界面
Interface(screen, cfg, mode='game_start')
# 游戏主循环
font = pygame.font.SysFont('Consolas', 15)
for gamemap_path in cfg.GAMEMAPPATHS:
# -地图
map_parser = mapParser(gamemap_path, bg_paths=cfg.BACKGROUNDPATHS, wall_paths=cfg.WALLPATHS, blocksize=cfg.BLOCKSIZE)
# -水果
fruit_sprite_group = pygame.sprite.Group()
used_spaces = []
for i in range(5):
coordinate = map_parser.randomGetSpace(used_spaces)
used_spaces.append(coordinate)
fruit_sprite_group.add(Fruit(random.choice(cfg.FRUITPATHS), coordinate=coordinate, blocksize=cfg.BLOCKSIZE))
# -我方Hero
coordinate = map_parser.randomGetSpace(used_spaces)
used_spaces.append(coordinate)
ourhero = Hero(imagepaths=cfg.HEROZELDAPATHS, coordinate=coordinate, blocksize=cfg.BLOCKSIZE, map_parser=map_parser, hero_name='ZELDA')
# -电脑Hero
aihero_sprite_group = pygame.sprite.Group()
coordinate = map_parser.randomGetSpace(used_spaces)
aihero_sprite_group.add(Hero(imagepaths=cfg.HEROBATMANPATHS, coordinate=coordinate, blocksize=cfg.BLOCKSIZE, map_parser=map_parser, hero_name='BATMAN'))
used_spaces.append(coordinate)
coordinate = map_parser.randomGetSpace(used_spaces)
aihero_sprite_group.add(Hero(imagepaths=cfg.HERODKPATHS, coordinate=coordinate, blocksize=cfg.BLOCKSIZE, map_parser=map_parser, hero_name='DK'))
used_spaces.append(coordinate)
# - * bomb
bomb_sprite_group = pygame.sprite.Group()
# -用于判断游戏胜利或者失败的flag
is_win_flag = False
# -主循环
screen = pygame.display.set_mode(map_parser.screen_size)
clock = pygame.time.Clock()
while True:
dt = clock.tick(cfg.FPS)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit(-1)
# --↑↓←→键控制上下左右, 空格键丢 *
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
ourhero.move('up')
elif event.key == pygame.K_DOWN:
ourhero.move('down')
elif event.key == pygame.K_LEFT:
ourhero.move('left')
elif event.key == pygame.K_RIGHT:
ourhero.move('right')
elif event.key == pygame.K_SPACE:
if ourhero.bomb_cooling_count <= 0:
bomb_sprite_group.add(ourhero.generateBomb(imagepath=cfg.BOMBPATH, digitalcolor=cfg.YELLOW, explode_imagepath=cfg.FIREPATH))
screen.fill(cfg.WHITE)
# --电脑Hero随机行动
for hero in aihero_sprite_group:
action, flag = hero.randomAction(dt)
if flag and action == 'dropbomb':
bomb_sprite_group.add(hero.generateBomb(imagepath=cfg.BOMBPATH, digitalcolor=cfg.YELLOW, explode_imagepath=cfg.FIREPATH))
# --吃到水果加生命值(只要是Hero, 都能加)
ourhero.eatFruit(fruit_sprite_group)
for hero in aihero_sprite_group:
hero.eatFruit(fruit_sprite_group)
# --游戏元素都绑定到屏幕上
map_parser.draw(screen)
for bomb in bomb_sprite_group:
if not bomb.is_being:
bomb_sprite_group.remove(bomb)
explode_area = bomb.draw(screen, dt, map_parser)
if explode_area:
# -- * 火焰范围内的Hero生命值将持续下降
if ourhero.coordinate in explode_area:
ourhero.health_value -= bomb.harm_value
for hero in aihero_sprite_group:
if hero.coordinate in explode_area:
hero.health_value -= bomb.harm_value
fruit_sprite_group.draw(screen)
for hero in aihero_sprite_group:
hero.draw(screen, dt)
ourhero.draw(screen, dt)
# --左上角显示生命值
pos_x = showText(screen, font, text=ourhero.hero_name+'(our):'+str(ourhero.health_value), color=cfg.YELLOW, position=[5, 5])
for hero in aihero_sprite_group:
pos_x, pos_y = pos_x+15, 5
pos_x = showText(screen, font, text=hero.hero_name+'(ai):'+str(hero.health_value), color=cfg.YELLOW, position=[pos_x, pos_y])
# --我方玩家生命值小于等于0/电脑方玩家生命值均小于等于0则判断游戏结束
if ourhero.health_value <= 0:
is_win_flag = False
break
for hero in aihero_sprite_group:
if hero.health_value <= 0:
aihero_sprite_group.remove(hero)
if len(aihero_sprite_group) == 0:
is_win_flag = True
break
pygame.display.update()
clock.tick(cfg.FPS)
if is_win_flag:
Interface(screen, cfg, mode='game_switch')
else:
break
Interface(screen, cfg, mode='game_end')
'''run'''
if __name__ == '__main__':
while True:
main(cfg)
三、效果展示
1.游戏界面
都是有音乐背景的啦!
2.游戏开始
3.游戏结束
来源:https://blog.csdn.net/xy258009/article/details/123537120
标签:Python,Pygame, , 人,游戏
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Python实现将xml导入至excel
2023-10-01 06:17:45
![](https://img.aspxhome.com/file/2023/5/95605_0s.jpg)
python中函数默认值使用注意点详解
2021-01-26 12:36:44
快速解决vue.js 模板和jinja 模板冲突的问题
2023-04-04 12:49:59
![](https://img.aspxhome.com/file/2023/5/81785_0s.jpg)
golang实现的文件上传下载小工具
2023-06-28 05:34:34
让MYSQL彻底支持中文
2008-12-24 16:23:00
pytest解读一次请求多个fixtures及多次请求
2023-07-20 01:13:43
Python bsddb模块操作Berkeley DB数据库介绍
2024-01-18 05:32:02
PyQt5实现五子棋游戏(人机对弈)
2022-05-22 12:00:50
![](https://img.aspxhome.com/file/2023/4/96964_0s.jpg)
Vue实现聊天界面
2024-04-28 09:23:57
![](https://img.aspxhome.com/file/2023/7/133037_0s.jpg)
python如何获取apk的packagename和activity
2023-07-11 20:50:19
MySQL下载安装详情图文教程
2024-01-24 15:48:48
![](https://img.aspxhome.com/file/2023/5/69155_0s.jpg)
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
2023-10-12 19:21:46
![](https://img.aspxhome.com/file/2023/9/55619_0s.png)
mysql共享锁与排他锁用法实例分析
2024-01-20 15:15:26
![](https://img.aspxhome.com/file/2023/3/123393_0s.png)
MySQL数据库innodb启动失败无法重启的解决方法
2024-01-25 13:29:12
vue3简单封装input组件和统一表单数据详解
2024-04-26 17:41:18
![](https://img.aspxhome.com/file/2023/6/133126_0s.jpg)
golang实现http服务器处理静态文件示例
2024-05-21 10:22:17
简单理解Python中的装饰器
2021-06-18 01:44:21
Python matplotlib学习笔记之坐标轴范围
2022-04-21 16:24:28
![](https://img.aspxhome.com/file/2023/8/88038_0s.jpg)
Python pandas之求和运算和非空值个数统计
2023-11-19 03:04:59
![](https://img.aspxhome.com/file/2023/8/64288_0s.png)
GitHub Eclipse配置使用教程详解
2023-11-04 10:23:02
![](https://img.aspxhome.com/file/2023/4/109524_0s.png)