1.游戏的主函数,文件名为Game1.py
import sys
import cfg
import math
import random
import pygame
from modules import *
'''游戏初始化'''
def initGame():
# 初始化pygame, 设置展示窗口
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('亲爱的福哥哥制作')
# 加载必要的游戏素材
game_images = {}
for key, value in cfg.IMAGE_PATHS.items():
game_images[key] = pygame.image.load(value)
game_sounds = {}
for key, value in cfg.SOUNDS_PATHS.items():
if key != 'moonlight':
game_sounds[key] = pygame.mixer.Sound(value)
return screen, game_images, game_sounds
'''主函数'''
def main():
# 初始化
screen, game_images, game_sounds = initGame()
# 播放背景音乐
pygame.mixer.music.load(cfg.SOUNDS_PATHS['moonlight'])
pygame.mixer.music.play(-1, 0.0)
# 字体加载
font = pygame.font.Font(None, 24)
# 定义兔子
bunny = BunnySprite(image=game_images.get('rabbit'), position=(100, 100))
# 跟踪玩家的精度变量, 记录了射出的箭头数和被击中的獾的数量.
acc_record = [0., 0.]
# 生命值
healthvalue = 194
# 弓箭
arrow_sprites_group = pygame.sprite.Group()
# 獾
badguy_sprites_group = pygame.sprite.Group()
badguy = BadguySprite(game_images.get('badguy'), position=(640, 100))
badguy_sprites_group.add(badguy)
# 定义了一个定时器, 使得游戏里经过一段时间后就新建一支獾
badtimer = 200
badtimer1 = 0
# 游戏主循环, running变量会跟踪游戏是否结束, exitcode变量会跟踪玩家是否胜利.
running, exitcode = True, False
clock = pygame.time.Clock()
while running:
# --在给屏幕画任何东西之前用黑色进行填充
screen.fill(0)
# --添加的风景也需要画在屏幕上
for x in range(cfg.SCREENSIZE[0]//game_images['grass'].get_width()+1):
for y in range(cfg.SCREENSIZE[1]//game_images['grass'].get_height()+1):
screen.blit(game_images['grass'], (x*100, y*100))
for i in range(4): screen.blit(game_images['castle'], (0, 30+105*i))
# --倒计时信息
countdown_text = font.render(str((90000-pygame.time.get_ticks())//60000)+":"+str((90000-pygame.time.get_ticks())//1000%60).zfill(2), True, (0, 0, 0))
countdown_rect = countdown_text.get_rect()
countdown_rect.topright = [635, 5]
screen.blit(countdown_text, countdown_rect)
# --按键检测
# ----退出与射击
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN:
game_sounds['shoot'].play()
acc_record[1] += 20
mouse_pos = pygame.mouse.get_pos()
angle = math.atan2(mouse_pos[1]-(bunny.rotated_position[1]+32), mouse_pos[0]-(bunny.rotated_position[0]+26))
arrow = ArrowSprite(game_images.get('arrow'), (angle, bunny.rotated_position[0]+32, bunny.rotated_position[1]+26))
arrow_sprites_group.add(arrow)
# ----移动兔子
key_pressed = pygame.key.get_pressed()
if key_pressed[pygame.K_w]:
bunny.move(cfg.SCREENSIZE, 'up')
elif key_pressed[pygame.K_s]:
bunny.move(cfg.SCREENSIZE, 'down')
elif key_pressed[pygame.K_a]:
bunny.move(cfg.SCREENSIZE, 'left')
elif key_pressed[pygame.K_d]:
bunny.move(cfg.SCREENSIZE, 'right')
# --更新弓箭
for arrow in arrow_sprites_group:
if arrow.update(cfg.SCREENSIZE):
arrow_sprites_group.remove(arrow)
# --更新獾
if badtimer == 0:
badguy = BadguySprite(game_images.get('badguy'), position=(640, random.randint(50, 430)))
badguy_sprites_group.add(badguy)
badtimer = 100 - (badtimer1 * 2)
badtimer1 = 20 if badtimer1>=20 else badtimer1+2
badtimer -= 1
for badguy in badguy_sprites_group:
if badguy.update():
game_sounds['hit'].play()
healthvalue -= random.randint(4, 8)
badguy_sprites_group.remove(badguy)
# --碰撞检测
for arrow in arrow_sprites_group:
for badguy in badguy_sprites_group:
if pygame.sprite.collide_mask(arrow, badguy):
game_sounds['enemy'].play()
arrow_sprites_group.remove(arrow)
badguy_sprites_group.remove(badguy)
acc_record[0] += 1
# --画出弓箭
arrow_sprites_group.draw(screen)
# --画出獾
badguy_sprites_group.draw(screen)
# --画出兔子
bunny.draw(screen, pygame.mouse.get_pos())
# --画出城堡健康值, 首先画了一个全红色的生命值条, 然后根据城堡的生命值往生命条里面添加绿色.
screen.blit(game_images.get('healthbar'), (5, 5))
for i in range(healthvalue):
screen.blit(game_images.get('health'), (i+8, 8))
# --判断游戏是否结束
if pygame.time.get_ticks() >= 90000:
running, exitcode = False, True
if healthvalue <= 0:
running, exitcode = False, False
# --更新屏幕
pygame.display.flip()
clock.tick(cfg.FPS)
# 计算准确率
accuracy = acc_record[0] / acc_record[1] * 100 if acc_record[1] > 0 else 0
accuracy = '%.2f' % accuracy
showEndGameInterface(screen, exitcode, accuracy, game_images)
'''run'''
if __name__ == '__main__':
main()`
2.生成配置文件cfg.py
```python
import os
# 每s刷新次数
FPS = 100
# 屏幕大小
SCREENSIZE = (640, 480)
# 游戏图片路径
IMAGE_PATHS = {
#Hero
'rabbit': os.path.join(os.getcwd(), 'resources/images/dude.png'),
#图片背景
'grass': os.path.join(os.getcwd(), 'resources/images/grass.png'),
#城墙
'castle': os.path.join(os.getcwd(), 'resources/images/castle.png'),
#子弹
'arrow': os.path.join(os.getcwd(), 'resources/images/bullet.png'),
#兔子
'badguy': os.path.join(os.getcwd(), 'resources/images/badguy4.png'),
#血量显示
'healthbar': os.path.join(os.getcwd(), 'resources/images/healthbar.png'),
#血量框
'health': os.path.join(os.getcwd(), 'resources/images/health.png'),
#失败结束
'gameover': os.path.join(os.getcwd(), 'resources/images/gameover.png'),
#胜利结束
'youwin': os.path.join(os.getcwd(), 'resources/images/youwin.png')
}
# 游戏声音路径
SOUNDS_PATHS = {
'hit': os.path.join(os.getcwd(), 'resources/audio/explode.wav'),
'enemy': os.path.join(os.getcwd(), 'resources/audio/enemy.wav'),
'shoot': os.path.join(os.getcwd(), 'resources/audio/shoot.wav'),
'moonlight': os.path.join(os.getcwd(), 'resources/audio/moonlight.wav'
}
3.生成最重要的初始化文件__init__.py
'''初始化'''
from .interfaces import showEndGameInterface
from .Sprites import BadguySprite, ArrowSprite, BunnySprite
4.定义游戏开始和结束开始的界面interfaces.py
import sys
import pygame
‘’‘游戏结束界面’‘’
def showEndGameInterface(screen, exitcode, accuracy, game_images):
font = pygame.font.Font(None, 24)
text = font.render(f"Accuracy: {accuracy}%", True, (255, 0, 0))
text_rect = text.get_rect()
text_rect.centerx = screen.get_rect().centerx
text_rect.centery = screen.get_rect().centery + 24
while True:
screen.fill(0)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if exitcode:
screen.blit(game_images[‘youwin’], (0, 0))
else:
screen.blit(game_images[‘gameover’], (0, 0))
screen.blit(text, text_rect)
pygame.display.flip()
5.定义函数精灵类Sprites.py
import math
import pygame
'''定义兔子类'''
class BunnySprite(pygame.sprite.Sprite):
def __init__(self, image, position, **kwargs):
pygame.sprite.Sprite.__init__(self)
self.image = image
self.rect = self.image.get_rect()
self.rect.left, self.rect.top = position
self.speed = 5
self.rotated_position = position
'''移动兔子'''
def move(self, screensize, direction):
if direction == 'left':
self.rect.left = max(self.rect.left-self.speed, 0)
elif direction == 'right':
self.rect.left = min(self.rect.left+self.speed, screensize[0])
elif direction == 'up':
self.rect.top = max(self.rect.top-self.speed, 0)
elif direction == 'down':
self.rect.top = min(self.rect.top+self.speed, screensize[1])
'''画到屏幕上'''
def draw(self, screen, mouse_pos):
angle = math.atan2(mouse_pos[1]-(self.rect.top+32), mouse_pos[0]-(self.rect.left+26))
image_rotate = pygame.transform.rotate(self.image, 360-angle*57.29)
bunny_pos = (self.rect.left-image_rotate.get_rect().width/2, self.rect.top-image_rotate.get_rect().height/2)
self.rotated_position = bunny_pos
screen.blit(image_rotate, bunny_pos)
'''定义弓箭类'''
class ArrowSprite(pygame.sprite.Sprite):
def __init__(self, image, position, **kwargs):
pygame.sprite.Sprite.__init__(self)
self.angle = position[0]
self.image = pygame.transform.rotate(image, 360-position[0]*57.29)
self.rect = self.image.get_rect()
self.mask = pygame.mask.from_surface(self.image)
self.rect.left, self.rect.top = position[1:]
self.speed = 10
'''更新弓箭'''
def update(self, screensize):
velx = math.cos(self.angle) * self.speed
vely = math.sin(self.angle) * self.speed
self.rect.left += velx
self.rect.top += vely
if self.rect.right < 0 or self.rect.left > screensize[0] or self.rect.top > screensize[1] or self.rect.bottom < 0:
return True
return False
'''定义獾类'''
class BadguySprite(pygame.sprite.Sprite):
def __init__(self, image, position, **kwargs):
pygame.sprite.Sprite.__init__(self)
self.image = image
self.rect = self.image.get_rect()
self.mask = pygame.mask.from_surface(self.image)
self.rect.left, self.rect.top = position
self.speed = 7
'''更新獾'''
def update(self):
self.rect.left -= self.speed
if self.rect.left < 64:
return True
return False
必须注意所创建项目为pycharm上所搭载运行的项目,所有配套图片资源,私信我,我发给你们