Python Pygame实现兔子猎人守护城堡游戏
作者:九叔敲代码 发布时间:2021-09-21 11:09:59
标签:Python,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()
上面我将代码分散了,大家可以看一下整合一下就可以运行了
来源:https://blog.csdn.net/weixin_46661629/article/details/121757363


猜你喜欢
- 字符型图片验证码识别完整过程及Python实现的博主,我的大部分知识点都是从他那里学来的。想要识别验证码,收集足够多的样本后,首先要做的就是
- 本文为大家分享了微信小程序radio组件的使用方法,供大家参考,具体内容如下效果图WXML<view class="tui-
- 最近好多伙伴说,我用vue做的项目本地是可以的,但部署到服务器遇到好多问题:资源找不到,直接访问index.html页面空白,刷新当前路由4
- 网上下载mayavi的官方帮助文档,里面有很多例子,下面的记录都是查看手册后得到的。http://code.enthought.com/pr
- python3实现批量修改文件名,供大家参考,具体内容如下以批量修改某文件夹下所有图片名称为例,注释超详细,万能模板,读者可举一反三,适当修
- 1、#coding:utf-8chose = [ ('foo',1,2), ('bar
- 一、简介:1、cron包cron包:"github.com/robfig/cron/v3"文档:cron package
- 安装部署Scrapy在安装Scrapy前首先需要确定的是已经安装好了Python(目前Scrapy支持Python2.5,Python2.6
- 刚入职新公司,等了好几天,今天公司给发了新电脑,就要开始进行开发环境的安装了。在软件(JDK,GIT,IDEA,MYSQL,Navicate
- 图例如下https://github.com/Dongvdong/python_Smartvoice上电后,只要周围声音超过 2000,开始
- 在javascript中原型(prototype)定义了特定类型的所有实例都可以访问的属性和方法,很多些情况下需要重新对原型中的属性赋值,如
- 本文介绍了网页中插入视频播放的代码全集:有avi格式的视频,mpg格式,smi格式,rm格式,wmv格式,wma格式,Windows Med
- /* *(REFER TO <JAVASCRIPT CORE>P151) *@time 2008-11-25 */ //没有返回
- 本文实例讲述了Python实现多并发访问网站功能。分享给大家供大家参考,具体如下:# Filename:visitweb_threads.p
- 平台:windows 10pycharm 2016.2python 2.7.12问题始于我在pycharm下建了一个flask工程,然后导入
- 迭代器(Iterable):能直接作用于for循环的对象,统称可迭代对象。例如:list、tuple、set、str、generator都是
- 本文实例为大家分享了OpenCV基于ORB算法实现角点检测的具体代码,供大家参考,具体内容如下ORB算法是FAST算法和BRIEF算法的结合
- 数据准备moduls.py# 构建表结构from django.db import models# 表app01_publishclass
- 环境Win10Python3.6.6Django2.1.3中间件作用 中间件用于全局修改Django的输入或输出。中间件常见用途 缓存会话认
- 前言一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇文章了。这篇笔记主要记录mysql