Python Pygame实现兔子猎人守护城堡游戏

Hazel
Hazel
发布时间:2026-10-15| 5人浏览过
原创

本文详细介绍如何使用Python和Pygame库开发一款名为“兔子猎人守护城堡”的塔防类小游戏。文章从环境初始化、素材加载到游戏主循环、碰撞检测及胜负判定,逐步解析核心代码逻辑,帮助开发者掌握Pygame基础应用与游戏开发流程。

效果图

相信大家都玩过守卫类游戏,比如《植物大战僵尸》或《保卫萝卜》。今天我们将使用Python编写一款名为“兔子猎人守护城堡”的守护类小游戏,并展示其运行效果。

主要代码

接下来,我将分享实现该游戏的核心代码及其逻辑。

首先,需要导入游戏运行所需的库文件。


import cfg
import math
import random
import pygame
from modules.Sprites import *
from modules.interfaces import *

游戏初始化

初始化Pygame模块,并设置游戏窗口的显示尺寸。


pygame.init()
	pygame.mixer.init()
	screen = pygame.display.set_mode(cfg.SCREENSIZE)
	pygame.display.set_caption(' QQ群号: 932574150')

加载游戏中必要的图像和音效素材。


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

主函数

执行游戏初始化的核心步骤。


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 = 100
	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] += 1
				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)

运行游戏主程序。


if __name__ == '__main__':
	main()

上述代码已分段展示,读者可自行整合后运行测试。

至此,关于使用Python Pygame实现兔子猎人守护城堡游戏的介绍完毕。更多Python游戏开发相关内容,欢迎查阅本站其他文章或继续关注后续更新,感谢支持!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。