Pygame实战之实现扎气球游戏
作者:顾木子吖 发布时间:2023-06-17 10:17:43
标签:Pygame,扎气球,游戏
导语
前几天,有人私信小编:
说陪女朋友在小广场上面逛街玩儿扎气球:结果一个都没扎破,扎心了老铁。
女朋友都要离家出走了~让我给想想办法:小编只想给你一个表情。
哈哈哈,开玩笑的~于是,为了满足需求,小编做了一个重大决定:熬夜给他做了一款扎气球的小
游戏,可以拿去哄哄女朋友啦~
这游戏做完之后木子已经替大家玩儿过了,这个很棒,不信的话你自己试试?
本文的扎气球小游戏原型就是路边的扎气球的游戏撒,基于Pygame做的!
就准备好射的箭、不同颜色的气球、一张背景图片、然后 * 的特效就可。哦~对了音乐还是要准备,游戏的话有音乐背景才更有趣哦~
一、准备中
1)素材资料
首先是准备好需要的素材、图片、背景音乐:
2)运行环境
环境安装 本文用到的运行环境:Python3.7、Pycharm社区版2020、Pygame游戏模块部分自带
模块直 接导入不需要安装。
模块安装:
pip install -i https://pypi.douban.com/simple/ +模块名
二、代码演示
这款小游戏总的有6个.py文件组成的,代码比较都啦,这里就只放一点点哈!
主程序运行:
from game import *
def main() :
intro = True
game = Game()
game.loadMusic()
game.readHighScore()
pygame.mixer.music.play(loops=-1)
while intro:
for event in pygame.event.get():
if event.type == pygame.QUIT:
intro = False
game.screen.fill(SKY_BLUE)
game.screen.blit(game.background, game.background_rect)
game.draw.Button(200, 2*game.HEIGHT/3, "PLAY", BRIGHT_GREEN, GREEN, game.gameloop, 150, 100)
game.draw.Button(game.WIDTH/2 - 75, 2*game.HEIGHT/3, "PLAY TIMED", BRIGHT_RED, RED, game.time_restricted, 150, 100)
game.draw.Button(game.WIDTH-350, 2*game.HEIGHT/3, "QUIT", BRIGHT_GREEN, GREEN, quit, 150, 100)
game.draw.draw_text("__ArcuS__", game.WIDTH/2, game.HEIGHT/3, 200, BLUE)
game.draw.draw_text("HIGH SCORE:%d" % (game.highscore), game.WIDTH-400, 50, 30, BLACK)
pygame.display.flip()
game.clock.tick(FPS)
main()
定义的一些常量:桌面背景、音乐等等。
FPS = 60
GRAVITY = 0.15
PI = 3.142
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (200, 0, 0)
BRIGHT_RED = (255, 0, 0)
GREEN = (0, 200, 0)
BRIGHT_GREEN = (0, 255, 0)
SKY_BLUE = (0, 255, 255)
BLUE = (0, 0, 255)
GREEN_YELLOW=(181,255,98)
BROWN=(204,102,0)
DARK_BROWN=(204,76,0)
HIGHSCORE_FILE="highscore.txt"
ARROW_IMAGE = "assets/arrow_1.png"
BACKGROUND_IMAGE = "assets/background.png"
EXPLOSION_SOUND = "assets/boom.wav"
CLICK_SOUND = "assets/select.wav"
MUSIC_FILE = "assets/tgfcoder-FrozenJam-SeamlessLoop.ogg"
VOLUME = 0.2
ARROW_SIZE = (16, 150)
BALOON_SIZE = (100, 100)
HIT_RADIUS = 15
MISSES = 15
GAME_TIME = 60
定义游戏精灵类等:
import pygame
import math
import random
from os import path
from constants import *
#游戏精灵类
class Arrow(pygame.sprite.Sprite):
def __init__(self,game):
pygame.sprite.Sprite.__init__(self)
self.WIDTH = game.WIDTH
self.HEIGHT = game.HEIGHT
self.image_orig = pygame.transform.scale(game.arrow_img, ARROW_SIZE)
self.image_orig.set_colorkey(BLACK)
self.image = self.image_orig
self.rect = self.image.get_rect()
self.rect.centerx = self.WIDTH/2
self.rect.bottom = self.HEIGHT-100
self.rot = 0
self.speedx = 0
self.speedy = 0
self.range = 0
self.max_height = 0
self.release_angle = 0
self.set_vel = False
self.Released = False
self.releasex = self.rect.centerx
self.releasey = self.rect.bottom
self.cy = self.rect.centery
self.game = game
def update(self):
if self.Released:
self.speedy -= GRAVITY
self.rect.bottom -= self.speedy
self.rect.centerx += self.speedx
self.rot = (-math.atan2(self.speedx, self.speedy)*180/3.14) % 360
new_image = pygame.transform.rotate(self.image_orig, self.rot)
old_center = self.rect.center
self.image = new_image
self.rect = self.image.get_rect()
self.rect.center = old_center
# print "moving"
if self.rect.bottom < 0 or self.rect.left > self.WIDTH + 10 or self.rect.right < -10:
self.kill()
else:
mouse = pygame.mouse.get_pos()
click = pygame.mouse.get_pressed()
if mouse[1] > self.rect.centery and click[0] == 1:
self.set_vel = True
dist = math.sqrt(
math.pow(self.rect.centerx-mouse[0], 2)+math.pow(self.rect.bottom-mouse[1], 2))
# print dist
self.rect.centerx = mouse[0]
self.rect.centery = mouse[1]
# print(2*GRAVITY*(self.rect.centery-mouse[1]))
self.speedy = math.sqrt(2*GRAVITY*(-self.cy+mouse[1]))*4
self.speedx = self.speedy * \
(mouse[0]-self.releasex)/(self.cy-mouse[1])
self.rot = (-math.atan2(self.speedx, self.speedy)
* 180/3.14*0.5) % 360
new_image = pygame.transform.rotate(self.image_orig, self.rot)
old_center = self.rect.center
self.image = new_image
self.rect = self.image.get_rect()
self.rect.center = old_center
# print "setting velocity"
else:
if self.set_vel:
self.Released = True
self.game.last_arrow_time = pygame.time.get_ticks()
self.max_height = (self.rect.bottom-mouse[1])
self.range = (mouse[0]-self.rect.centerx)*2
# print "releasing"
# math.sqrt(math.pow(mouse[0]-self.rect.centerx,2)+math.pow(mouse[1]-self.rect.centery,2)) < 200:
else:
if (mouse[0]-self.rect.centerx) != 0:
theta = math.atan(
(mouse[1]-self.rect.bottom)/(self.rect.centerx-mouse[0]))
else:
theta = PI
move = theta-self.rot
self.rot = math.degrees(theta)
new_image = pygame.transform.rotate(
self.image_orig, self.rot)
old_center = self.rect.center
self.image = new_image
self.rect = self.image.get_rect()
self.rect.center = old_center
# print "rotating"
# print self.rot
# print theta
class Baloon(pygame.sprite.Sprite):
def __init__(self,game):
pygame.sprite.Sprite.__init__(self)
self.WIDTH = game.WIDTH
self.HEIGHT = game.HEIGHT
bcolor = random.choice(game.baloon_color)
temp = "assets/balloon_{}.png".format(bcolor)
self.image_orig = pygame.image.load(
path.join(path.dirname(__file__), temp))
if bcolor == "blue":
self.image_orig.set_colorkey(BLUE)
elif bcolor == "black":
self.image_orig.set_colorkey(BLACK)
elif bcolor == "green":
self.image_orig.set_colorkey(BRIGHT_GREEN)
elif bcolor == "red":
self.image_orig.set_colorkey(BRIGHT_RED)
self.image_orig = pygame.transform.scale(self.image_orig, BALOON_SIZE)
self.image = self.image_orig.copy()
self.rect = self.image.get_rect()
self.radius = HIT_RADIUS
temp = random.randrange(self.WIDTH - self.rect.width)
while (-150 < temp-self.WIDTH/2 < 150):
temp = random.randrange(self.WIDTH - self.rect.width)
self.rect.x = temp
self.rect.y = random.randrange(self.HEIGHT+100, self.HEIGHT+150)
self.speedy = random.randrange(-4, -1)
self.speedx = random.randrange(-3, 3)
self.game = game
self.last_update = pygame.time.get_ticks()
# print "baloon"
def update(self):
self.rect.y += self.speedy
if self.rect.top < -20 or self.rect.left < -25 or self.rect.right > self.WIDTH + 20:
self.kill()
self.game.misses += 1
三、效果展示
游戏规则的话:箭会出现在游戏界面底部中间位置,拉动它:即是鼠标左键拉动方向可自己调整,
直接向下拉动然后放箭射中气球即可。射中的越多积累的分数越高哦!
1)截图展示效果——
游戏开始界面如下:
游戏开始界面如下:
扎中气球效果如下:
游戏结束总成绩13分:
2)视频展示效果——
到此这篇关于Pygame实战之实现扎气球游戏的文章就介绍到这了,更多相关Pygame扎气球游戏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
来源:https://blog.csdn.net/weixin_55822277/article/details/122086118


猜你喜欢
- 本文实例讲述了Python实现将一个正整数分解质因数的方法。分享给大家供大家参考,具体如下:遇到一个python编程联系题目:将一个正整数分
- 本文实例讲述了PHP利用header跳转失效的解决方法,分享给大家供大家参考。具体方法分析如下:一、问题:今天header(\"L
- 除非您正在对服务进行原型设计,否则您可能会关心应用程序的内存使用情况。占用更小的内存,会使基础设施成本降低,扩展变得更容易。尽管 Go 以不
- 前言在JavaScript中,数据类型分为两大类,一种是基础数据类型,另一种则是复杂数据类型,又叫引用数据类型基础数据类型:数字Number
- 阅读上一篇:W3C优质网页小贴士(二) 注意字体大小网页设计者中有这么一种倾向:他们认为小字体能让网页看起来更漂亮,并能提供更多空间给每个网
- 本文实例讲述了python统计一个文本中重复行数的方法。分享给大家供大家参考。具体实现方法如下:比如有下面一个文件2312我们期望得到2,2
- 1 介绍推导式(解析器):是Python独有的一种特性。使用推导式可以快速生成列表、元组、字典以及集合类型的数据,因此推导式又可分为列表推导
- 地址:https://youzan.github.io/vant/#/zh-CN/intro一.引入Vant组件库1.首先运行 npm in
- 一、CONCAT函数concat函数是将多个字段或字符串拼接为一个字符串;但是字符串之间没有任何分隔。concat函数官方介绍-- CONC
- ASP中查询数据库记录写入XML文件示例,把下面代码保存为Asp_XML.asp运行即可: &
- 无意中还找到了CentOS的专业论坛,记住:http://www.centospub.com于是,开始的学习配置本次环境:CentOS系统,
- CSS网页布局开发中,会有很多小技巧,这里再扩展一下您所想要得到的知识,相信您会有很多收获!一、ul标签在Mozilla中默认是有paddi
- 一、系统要求操作系统:Windows 2012 R2数据库:SqlServer2012web服务器:APACHE =>httpd-2.
- 1.安装完成自动化测试,需要配置三个东西。selenium:pip就可以了chrome:浏览器下载一个谷歌浏览器就行chrome-drive
- 下半年毕业季,各种毕业设计纷涌而至,虽然学校教了Python,但是我相信各位肯定没有认真学,做作业就懵逼的那种~所以我都给大家准备好了!各种
- 1.ROW_NUMBER()基本用法:SELECT SalesOrderID, CustomerID,
- 本文实例讲述了Python读取properties配置文件操作。分享给大家供大家参考,具体如下:工作需要将Java项目的逻辑改为python
- 昨天在书上看到SQL语句优化时,where条件顺序不同,性能不同,这个建议在Oracle11G版本还合适吗?方式1优于方式2? 方式1: s
- 排序这个词,我的第一感觉是几乎所有App都有排序的地方,淘宝商品有按照购买时间的排序、B站的评论有按照热度排序的...对于MySQL,一说到
- pycharm中导入selenium报错现象: pycharm中输入from selenium import webdriver, sele