python-产品篇-游戏-飞鸟

文章目录

代码

FlappyBird

python 复制代码
import cfg
import sys
import random
import pygame
from modules.sprites.Pipe import *
from modules.sprites.Bird import *
from modules.interfaces.endGame import *
from modules.interfaces.startGame import *


'''游戏初始化'''
def initGame():
	pygame.init()
	pygame.mixer.init()
	screen = pygame.display.set_mode((cfg.SCREENWIDTH, cfg.SCREENHEIGHT))
	pygame.display.set_caption('Flappy Bird')
	return screen


'''显示当前分数'''
def showScore(screen, score, number_images):
	digits = list(str(int(score)))
	width = 0
	for d in digits:
		width += number_images.get(d).get_width()
	offset = (cfg.SCREENWIDTH - width) / 2
	for d in digits:
		screen.blit(number_images.get(d), (offset, cfg.SCREENHEIGHT*0.1))
		offset += number_images.get(d).get_width()


'''主函数'''
def main():
	screen = initGame()
	# 加载必要的游戏资源
	# --导入音频
	sounds = dict()
	for key, value in cfg.AUDIO_PATHS.items():
		sounds[key] = pygame.mixer.Sound(value)
	# --导入数字图片
	number_images = dict()
	for key, value in cfg.NUMBER_IMAGE_PATHS.items():
		number_images[key] = pygame.image.load(value).convert_alpha()
	# --管道
	pipe_images = dict()
	pipe_images['bottom'] = pygame.image.load(random.choice(list(cfg.PIPE_IMAGE_PATHS.values()))).convert_alpha()
	pipe_images['top'] = pygame.transform.rotate(pipe_images['bottom'], 180)
	# --小鸟图片
	bird_images = dict()
	for key, value in cfg.BIRD_IMAGE_PATHS[random.choice(list(cfg.BIRD_IMAGE_PATHS.keys()))].items():
		bird_images[key] = pygame.image.load(value).convert_alpha()
	# --背景图片
	backgroud_image = pygame.image.load(random.choice(list(cfg.BACKGROUND_IMAGE_PATHS.values()))).convert_alpha()
	# --其他图片
	other_images = dict()
	for key, value in cfg.OTHER_IMAGE_PATHS.items():
		other_images[key] = pygame.image.load(value).convert_alpha()
	# 游戏开始界面
	game_start_info = startGame(screen, sounds, bird_images, other_images, backgroud_image, cfg)
	# 进入主游戏
	score = 0
	bird_pos, base_pos, bird_idx = list(game_start_info.values())
	base_diff_bg = other_images['base'].get_width() - backgroud_image.get_width()
	clock = pygame.time.Clock()
	# --管道类
	pipe_sprites = pygame.sprite.Group()
	for i in range(2):
		pipe_pos = Pipe.randomPipe(cfg, pipe_images.get('top'))
		pipe_sprites.add(Pipe(image=pipe_images.get('top'), position=(cfg.SCREENWIDTH+200+i*cfg.SCREENWIDTH/2, pipe_pos.get('top')[-1])))
		pipe_sprites.add(Pipe(image=pipe_images.get('bottom'), position=(cfg.SCREENWIDTH+200+i*cfg.SCREENWIDTH/2, pipe_pos.get('bottom')[-1])))
	# --bird类
	bird = Bird(images=bird_images, idx=bird_idx, position=bird_pos)
	# --是否增加pipe
	is_add_pipe = True
	# --游戏是否进行中
	is_game_running = True
	while is_game_running:
		for event in pygame.event.get():
			if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
				pygame.quit()
				sys.exit()
			elif event.type == pygame.KEYDOWN:
				if event.key == pygame.K_SPACE or event.key == pygame.K_UP:
					bird.setFlapped()
					sounds['wing'].play()
		# --碰撞检测
		for pipe in pipe_sprites:
			if pygame.sprite.collide_mask(bird, pipe):
				sounds['hit'].play()
				is_game_running = False
		# --更新小鸟
		boundary_values = [0, base_pos[-1]]
		is_dead = bird.update(boundary_values, float(clock.tick(cfg.FPS))/1000.)
		if is_dead:
			sounds['hit'].play()
			is_game_running = False
		# --移动base实现小鸟往前飞的效果
		base_pos[0] = -((-base_pos[0] + 4) % base_diff_bg)
		# --移动pipe实现小鸟往前飞的效果
		flag = False
		for pipe in pipe_sprites:
			pipe.rect.left -= 4
			if pipe.rect.centerx < bird.rect.centerx and not pipe.used_for_score:
				pipe.used_for_score = True
				score += 0.5
				if '.5' in str(score):
					sounds['point'].play()
			if pipe.rect.left < 5 and pipe.rect.left > 0 and is_add_pipe:
				pipe_pos = Pipe.randomPipe(cfg, pipe_images.get('top'))
				pipe_sprites.add(Pipe(image=pipe_images.get('top'), position=pipe_pos.get('top')))
				pipe_sprites.add(Pipe(image=pipe_images.get('bottom'), position=pipe_pos.get('bottom')))
				is_add_pipe = False
			elif pipe.rect.right < 0:
				pipe_sprites.remove(pipe)
				flag = True
		if flag: is_add_pipe = True
		# --绑定必要的元素在屏幕上
		screen.blit(backgroud_image, (0, 0))
		pipe_sprites.draw(screen)
		screen.blit(other_images['base'], base_pos)
		showScore(screen, score, number_images)
		bird.draw(screen)
		pygame.display.update()
		clock.tick(cfg.FPS)
	endGame(screen, sounds, showScore, score, number_images, bird, pipe_sprites, backgroud_image, other_images, base_pos, cfg)


'''run'''
if __name__ == '__main__':
	while True:
		main()

cfg

python 复制代码
'''配置文件'''
import os


# FPS
FPS = 60
# 屏幕
SCREENWIDTH = 288
SCREENHEIGHT = 512
# 管道之间的空隙
PIPE_GAP_SIZE = 100
# 图片
NUMBER_IMAGE_PATHS = {
						'0': os.path.join(os.getcwd(), 'resources/images/0.png'),
						'1': os.path.join(os.getcwd(), 'resources/images/1.png'),
						'2': os.path.join(os.getcwd(), 'resources/images/2.png'),
						'3': os.path.join(os.getcwd(), 'resources/images/3.png'),
						'4': os.path.join(os.getcwd(), 'resources/images/4.png'),
						'5': os.path.join(os.getcwd(), 'resources/images/5.png'),
						'6': os.path.join(os.getcwd(), 'resources/images/6.png'),
						'7': os.path.join(os.getcwd(), 'resources/images/7.png'),
						'8': os.path.join(os.getcwd(), 'resources/images/8.png'),
						'9': os.path.join(os.getcwd(), 'resources/images/9.png')
					}
BIRD_IMAGE_PATHS = {
						'red': {'up': os.path.join(os.getcwd(), 'resources/images/redbird-upflap.png'),
								'mid': os.path.join(os.getcwd(), 'resources/images/redbird-midflap.png'),
								'down': os.path.join(os.getcwd(), 'resources/images/redbird-downflap.png')},
						'blue': {'up': os.path.join(os.getcwd(), 'resources/images/bluebird-upflap.png'),
								 'mid': os.path.join(os.getcwd(), 'resources/images/bluebird-midflap.png'),
								 'down': os.path.join(os.getcwd(), 'resources/images/bluebird-downflap.png')},
						'yellow': {'up': os.path.join(os.getcwd(), 'resources/images/yellowbird-upflap.png'),
								   'mid': os.path.join(os.getcwd(), 'resources/images/yellowbird-midflap.png'),
								   'down': os.path.join(os.getcwd(), 'resources/images/yellowbird-downflap.png')}
					}
BACKGROUND_IMAGE_PATHS = {
							'day': os.path.join(os.getcwd(), 'resources/images/background-day.png'),
							'night': os.path.join(os.getcwd(), 'resources/images/background-night.png')
						}
PIPE_IMAGE_PATHS = {
						'green': os.path.join(os.getcwd(), 'resources/images/pipe-green.png'),
						'red': os.path.join(os.getcwd(), 'resources/images/pipe-red.png')
					}
OTHER_IMAGE_PATHS = {
						'gameover': os.path.join(os.getcwd(), 'resources/images/gameover.png'),
						'message': os.path.join(os.getcwd(), 'resources/images/message.png'),
						'base': os.path.join(os.getcwd(), 'resources/images/base.png')
					}
# 音频路径
AUDIO_PATHS = {
				'die': os.path.join(os.getcwd(), 'resources/audios/die.wav'),
				'hit': os.path.join(os.getcwd(), 'resources/audios/hit.wav'),
				'point': os.path.join(os.getcwd(), 'resources/audios/point.wav'),
				'swoosh': os.path.join(os.getcwd(), 'resources/audios/swoosh.wav'),
				'wing': os.path.join(os.getcwd(), 'resources/audios/wing.wav')
			}

效果

PS:全部运行软件放下载处

相关推荐
笨鸟先飞,勤能补拙4 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
长和信泰光伏储能4 小时前
京津冀光伏发电:绿色能源的未来之路
python·能源
浦信仿真大讲堂5 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
Gu Gu Study5 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
卷无止境6 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境6 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd1236 小时前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
Dxy12393102167 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
bamb007 小时前
一个项目带你入门AI应用开发01
python
0566467 小时前
Python康复训练——常用标准库
开发语言·python·学习