炸弹人小游戏代码开源(python)

再度Miren
2023-03-06 / 0 评论 / 5 阅读 / 正在检测是否收录...


??作者:小刘在C站

??个人主页:小刘主页

??每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生!

??夕阳下,是最美的绽放,当遵从一心,踏浪而往,纵千山万水, 也要抵达。

目录

一.什么是python

二.游戏代码效果呈现

??三.游戏主代码

四.cfg

五.README

六.requirements


一.什么是python

Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆于1990年代初设计,作为一门叫做ABC语言的替代品。?? Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言, [ 随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。

Python解释器易于扩展,可以使用C语言或C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型。Python也可用于可定制化软件中的扩展程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码或机器码

二.游戏代码效果呈现

??三.游戏主代码

'''
Function:
??? 炸弹人小游戏
'''
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)

四.cfg

'''配置文件'''
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)

五.README

# Introduction
https://mp.weixin.qq.com/s/XzB_cJMFEtz6p_MvqiaCrA

# Environment
```
OS: Windows10
Python: Python3.5+(have installed necessary dependencies)
```

# Usage
```
Step1:
pip install -r requirements.txt
Step2:
run "python Game19.py"
```

# Game Display
![giphy](demonstration/running.gif)

六.requirements

pygame

0

评论 (0)

取消