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

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

一.什么是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



相关文章
|
1天前
|
设计模式 缓存 测试技术
Python中的装饰器:功能增强与代码复用的艺术####
本文将深入探讨Python中装饰器的概念、用途及实现方式,通过实例演示其如何为函数或方法添加新功能而不影响原有代码结构,从而提升代码的可读性和可维护性。我们将从基础定义出发,逐步深入到高级应用,揭示装饰器在提高代码复用性方面的强大能力。 ####
|
2天前
|
缓存 测试技术 数据安全/隐私保护
探索Python中的装饰器:简化代码,增强功能
【10月更文挑战第29天】本文通过深入浅出的方式,探讨了Python装饰器的概念、使用场景和实现方法。文章不仅介绍了装饰器的基本知识,还通过实例展示了如何利用装饰器优化代码结构,提高代码的可读性和重用性。适合初学者和有一定经验的开发者阅读,旨在帮助读者更好地理解和应用装饰器,提升编程效率。
|
4天前
|
机器学习/深度学习 算法 编译器
Python程序到计算图一键转化,详解清华开源深度学习编译器MagPy
【10月更文挑战第26天】MagPy是一款由清华大学研发的开源深度学习编译器,可将Python程序一键转化为计算图,简化模型构建和优化过程。它支持多种深度学习框架,具备自动化、灵活性、优化性能好和易于扩展等特点,适用于模型构建、迁移、部署及教学研究。尽管MagPy具有诸多优势,但在算子支持、优化策略等方面仍面临挑战。
8 3
|
9天前
|
开发者 Python
探索Python中的装饰器:简化代码,增强功能
【10月更文挑战第22天】在Python的世界里,装饰器是一个强大的工具,它能够让我们以简洁的方式修改函数的行为,增加额外的功能而不需要重写原有代码。本文将带你了解装饰器的基本概念,并通过实例展示如何一步步构建自己的装饰器,从而让你的代码更加高效、易于维护。
|
6天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
10 3
|
11天前
|
开发框架 Python
探索Python中的装饰器:简化代码,增强功能
【10月更文挑战第20天】在编程的海洋中,简洁与强大是航行的双桨。Python的装饰器,这一高级特性,恰似海风助力,让代码更优雅、功能更强大。本文将带你领略装饰器的奥秘,从基础概念到实际应用,一步步深入其内涵与意义。
|
9天前
|
机器学习/深度学习 缓存 数据挖掘
Python性能优化:提升你的代码效率
【10月更文挑战第22天】 Python性能优化:提升你的代码效率
10 1
|
12天前
|
机器人 Shell Linux
【Azure Bot Service】部署Python ChatBot代码到App Service中
本文介绍了使用Python编写的ChatBot在部署到Azure App Service时遇到的问题及解决方案。主要问题是应用启动失败,错误信息为“Failed to find attribute &#39;app&#39; in &#39;app&#39;”。解决步骤包括:1) 修改`app.py`文件,添加`init_func`函数;2) 配置`config.py`,添加与Azure Bot Service认证相关的配置项;3) 设置App Service的启动命令为`python3 -m aiohttp.web -H 0.0.0.0 -P 8000 app:init_func`。
|
16天前
|
数据处理 开发者 Python
Python中的列表推导式:一种优雅的代码简化技巧####
【10月更文挑战第15天】 本文将深入浅出地探讨Python中列表推导式的使用,这是一种强大且简洁的语法结构,用于从现有列表生成新列表。通过具体示例和对比传统循环方法,我们将揭示列表推导式如何提高代码的可读性和执行效率,同时保持语言的简洁性。无论你是Python初学者还是有经验的开发者,掌握这一技能都将使你的编程之旅更加顺畅。 ####
18 1
|
9天前
|
缓存 算法 数据处理
Python性能优化:提升代码效率与速度的秘诀
【10月更文挑战第22天】Python性能优化:提升代码效率与速度的秘诀
8 0