Python自制 笨鸟先飞

2023-11-01 06:30
文章标签 python 自制 笨鸟先飞

本文主要是介绍Python自制 笨鸟先飞,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最初灵感 

        回想起寒假之前也做过一个游戏,但是还没有做好,出现了很多问题,于是想要再做一个游戏来填补自己以前的遗憾,于是着手尝试从头开始了解Pygame,于是我打开了Pygame的官网,并发现了一些有趣的事情,下面代码是官网给出的Pygame的示例代码

# Example file showing a circle moving on screen
import pygame# pygame setup
pygame.init()
screen = pygame.display.set_mode((1280, 720))
clock = pygame.time.Clock()
running = True
dt = 0player_pos = pygame.Vector2(screen.get_width() / 2, screen.get_height() / 2)while running:# poll for events# pygame.QUIT event means the user clicked X to close your windowfor event in pygame.event.get():if event.type == pygame.QUIT:running = False# fill the screen with a color to wipe away anything from last framescreen.fill("purple")pygame.draw.circle(screen, "red", player_pos, 40)keys = pygame.key.get_pressed()if keys[pygame.K_w]:player_pos.y -= 300 * dtif keys[pygame.K_s]:player_pos.y += 300 * dtif keys[pygame.K_a]:player_pos.x -= 300 * dtif keys[pygame.K_d]:player_pos.x += 300 * dt# flip() the display to put your work on screenpygame.display.flip()# limits FPS to 60# dt is delta time in seconds since last frame, used for framerate-# independent physics.dt = clock.tick(60) / 1000pygame.quit()

这段代码的效果就是在屏幕中间整个球,然后用W,S,A,D控制这个球移动,效果如下

 研究了一下发现他的逻辑很简单,就是直接上下移动多少,然后画个球更新位置,于是我就知道了应该如何操作了。

代码

        首先先把代码放上来,就是下面这一大片,虽然其实很大一片都是用来在上面写字的。。。

import pygame
import random
import time# pygame setup
pygame.init()
screen = pygame.display.set_mode((1920, 1080))
clock = pygame.time.Clock()
running = True
dt = 0score_history = []#基本参数
screen_width = screen.get_width()
screen_height = screen.get_height()#字体参数
menu_font = pygame.font.Font('STZHONGS.TTF', 48)
game_name_font = pygame.font.Font('SIMYOU.TTF', 96)
special_font = pygame.font.Font('SIMYOU.TTF', 24)#读取图片
bird = pygame.image.load("bird.jpg")#点参数
point_size = 35
score = 0#速度参数
path_y = 20
add_speed = 5 
down_y = 5#时间参数
pause_speed = 0
press_time = 0
not_press = 0
start_time = pygame.time.get_ticks() def random_height():return random.randint(270, 1080 - 10*point_size)#柱子参数
bar_width = 200
bar_position = 1920 - bar_width
pass_locate = random_height()
bar_speed = 7#正式开始游戏
start = False
game_over = False
win = Falseplayer_pos = pygame.Vector2(screen.get_width()/2, screen.get_height() / 2 )pygame.mixer.music.load("START.wav")
pygame.mixer.music.play(-1)while running:for event in pygame.event.get():if event.type == pygame.QUIT:running = Falsescreen.fill("white")if start == False:mouse_position = pygame.mouse.get_pos()mouse = pygame.draw.circle(screen, "black", mouse_position, 10)game_name = game_name_font.render("笨鸟先飞", True, "red")easy_rect = pygame.Rect(screen.get_width()/2 - 400, screen.get_height() / 2 - 100, 200, 100)e_text = menu_font.render("简单难度", True, "black")hard_rect = pygame.Rect(screen.get_width()/2 - 100, screen.get_height() / 2 - 100, 200, 100)h_text = menu_font.render("困难难度", True, "black")explain_rect = pygame.Rect(screen.get_width()/2 - 100, screen.get_height() / 2 + 100, 200, 100)ex_text = menu_font.render("游戏说明", True, "black")very_hard_rect = pygame.Rect(screen.get_width()/2 + 200, screen.get_height() / 2 - 100, 200, 100)v_text = menu_font.render("地狱难度", True, "black")special_text = special_font.render("Made by: hjl 2023.8.2 In Home", True, "black")pygame.draw.rect(screen, "green", easy_rect,5)pygame.draw.rect(screen, "yellow", hard_rect,5)pygame.draw.rect(screen, "red", very_hard_rect,5)pygame.draw.rect(screen, "blue", explain_rect, 5)screen.blit(e_text, (screen.get_width()/2 - 395, screen.get_height() / 2 - 90))screen.blit(h_text, (screen.get_width()/2 - 95, screen.get_height() / 2 - 90))screen.blit(v_text, (screen.get_width()/2 + 205, screen.get_height() / 2 - 90))screen.blit(ex_text, (screen.get_width()/2 - 95, screen.get_height() / 2 + 110))screen.blit(game_name, (screen.get_width()/2 - 180, screen.get_height() / 2-300))screen.blit(special_text, (screen.get_width()/2 - 180, screen.get_height() / 2+400))easy_text = menu_font.render("30", True, "green")hard_text = menu_font.render("20", True, "yellow")very_hard_text = menu_font.render("15", True, "red")explain_rect_text = menu_font.render("游戏说明", True, "blue")if mouse.colliderect(easy_rect):screen.blit(easy_text, mouse_position)pygame.draw.rect(screen, "black", easy_rect, 5)mouse = pygame.draw.circle(screen, "green", mouse_position, 10)if pygame.mouse.get_pressed()[0]:start = Truewin_score = 30if mouse.colliderect(hard_rect):screen.blit(hard_text, mouse_position)pygame.draw.rect(screen, "black", hard_rect, 5)mouse = pygame.draw.circle(screen, "yellow", mouse_position, 10)if pygame.mouse.get_pressed()[0]:start = Truebar_speed = 10down_y = 6path_y = 17win_score = 20if mouse.colliderect(very_hard_rect):screen.blit(very_hard_text, mouse_position)pygame.draw.rect(screen, "black", very_hard_rect, 5)mouse = pygame.draw.circle(screen, "red", mouse_position, 10)if pygame.mouse.get_pressed()[0]:start = Truebar_speed = 12down_y = 8path_y = 20win_score = 15if mouse.colliderect(explain_rect):screen.blit(explain_rect_text, mouse_position)pygame.draw.rect(screen, "black", explain_rect, 5)mouse = pygame.draw.circle(screen, "blue", mouse_position, 10)if pygame.mouse.get_pressed()[0]:screen.fill("white")explain = game_name_font.render("游戏说明", True, "black")screen.blit(explain, ((screen.get_width()/2) - 200 , screen.get_height() / 2 - 400))explain_text = menu_font.render("1.按下空格键或鼠标右键使小鸟上升", True, "black")screen.blit(explain_text, ((screen.get_width()/2) - 350 , screen.get_height() / 2 - 200))explain_text = menu_font.render("2.松开空格键或鼠标右键使小鸟下降", True, "black")screen.blit(explain_text, ((screen.get_width()/2) - 350 , screen.get_height() / 2 - 100))explain_text = menu_font.render("3.碰到柱子或者地面游戏结束", True, "black")screen.blit(explain_text, ((screen.get_width()/2) - 350 , screen.get_height() / 2 - 0))explain_text = menu_font.render("4.按下ESC键退出游戏", True, "black")screen.blit(explain_text, ((screen.get_width()/2) - 350 , screen.get_height() / 2 + 100))keys = pygame.key.get_pressed()if keys[pygame.K_ESCAPE]:running = Falseif start == True :now_time = pygame.time.get_ticks() - start_timeif not_press == 0:not_press = pygame.time.get_ticks()/300if press_time == 0:press_time = pygame.time.get_ticks()/300cir = pygame.draw.circle(screen, "white", player_pos, point_size)bird = pygame.transform.scale(bird, (point_size*2, point_size*2))screen.blit(bird, (player_pos.x - point_size, player_pos.y - point_size))keys = pygame.key.get_pressed()if keys[pygame.K_SPACE] or pygame.mouse.get_pressed()[2]:between_press = pygame.time.get_ticks()/300 - not_presspath = (path_y)*(between_press) + 0.5 * add_speed * (between_press) * (between_press)player_pos.y -= pathpress_time = pygame.time.get_ticks()/300elif keys[pygame.K_ESCAPE]:running = False else:not_press = pygame.time.get_ticks()/300press_button = Falsedelta_time = pygame.time.get_ticks()/300  - press_timeif bar_position > 0:bar_position -= bar_speedelse:bar_position = 1920 - bar_widthpass_locate = random_height()score += 1bar_speed += 0.5score_text = menu_font.render("SCORE:" + str(score), True, "black")screen.blit(score_text, (screen.get_width() - 1730,100))if score == win_score:win = Truepygame.mixer.music.stop()pygame.mixer.music.load("win.wav")pygame.mixer.music.play(-1)player_pos = pygame.mouse.get_pos()pygame.draw.circle(screen, "gold", player_pos, point_size)bar_width = 0bar_position = 1920 - bar_widthscreen.fill("white")color_egg = pygame.image.load("color_egg.jpg")screen.blit(color_egg, (0, 0))egg_text1 = menu_font.render("          恭喜你发现了隐藏彩蛋", True, "black")egg_text2 = menu_font.render("          左边是我最好的朋友,吉仔", True, "black")egg_text3 = menu_font.render("          你赢了!", True, "black")screen.blit(egg_text1, (screen.get_width()/2 ,400))screen.blit(egg_text2, (screen.get_width()/2 ,500))screen.blit(egg_text3, (screen.get_width()/2 ,600))pygame.display.flip()time.sleep(4)screen.fill("gold")win_text = game_name_font.render("YOU WIN", True, "RED")win_text2  = menu_font.render("将在三秒后退出游戏...", True, "black")screen.blit(win_text, ((screen.get_width()/2) - 200 , screen.get_height() / 2 - 100))screen.blit(win_text2, ((screen.get_width()/2) - 250 , screen.get_height() / 2 + 100))pygame.display.flip()time.sleep(2)breakrect1 = pygame.Rect(bar_position, 0, bar_width, pass_locate)rect2 = pygame.Rect(bar_position, pass_locate + 6*point_size, bar_width, 1080)pygame.draw.rect(screen, "green", rect1)pygame.draw.rect(screen, "green", rect2) player_pos.y += down_y * (delta_time) +   add_speed * (delta_time) * (delta_time)if cir.colliderect(rect2) or cir.colliderect(rect1) or player_pos.y > screen_height - 3 * point_size or player_pos.y < 0 + 4  * point_size:      start = Falsebar_width = 200bar_position = 1920 - bar_widthpass_locate = random_height()player_pos = pygame.Vector2(screen.get_width()/2, screen.get_height() / 2 )screen.fill("white")over = game_name_font.render("GAME OVER", True, "black")text_score = game_name_font.render(" SCORE:" + str(score), True, "red")screen.blit(over, ((screen.get_width()/2) - 200 , screen.get_height() / 2 - 100))screen.blit(text_score, ((screen.get_width()/2) - 200 , screen.get_height() / 2 + 100))bar_speed = 7score_history.append(score)best_score_text = menu_font.render("BEST SCORE:" + str(max(score_history)), True, "gold")screen.blit(best_score_text, (screen.get_width() - 1730,200))pygame.display.flip()press_time = 0score = 0#播放ENDpygame.mixer.music.stop()pygame.mixer.music.load("END.wav")pygame.mixer.music.play()keys = pygame.key.get_pressed()if keys[pygame.K_ESCAPE]:running = Falsepygame.time.wait(3000)pygame.mixer.music.load("START.wav")pygame.mixer.music.play(-1)dt = clock.tick(60) / 1000 pygame.display.flip() pygame.quit()

标题效果

        先来看看这个标题的效果

 

     虽然看着很酷炫(个人觉得),但是实际上并不是很复杂的原理,偶然之间发现了可以使用pygame获取鼠标的位置,然后我就异想天开,如果我在鼠标位置绘制个球会发生什么事情呢?然后就发现有个球一直追着我的鼠标跑,而且很流畅,噢!接着又尝试着向里面加入字体,就会发现,字体就会刚好出现在球的附近,那就完事了

        接下来进行一些小操作就行,把鼠标的位置画个球,然后用pygame自带的触碰检测函数就可以判断鼠标是不是点到我搞的框上面了,接着,如果接触到框,就改变颜色就行,至于怎么变色就是让它的框变成黑色,而宽度和原来的宽度一样就可以造出一个接触后变色的效果,具体代码都在上面自己看吧

        利用这点就可以控制游戏难度与搞一些花活

        鸟就是那个圆圈,思考了一下,发现其实本质上应该不会左右动才是,只是经过一些小操作让它看上去在左右移动,所以操作很简单,就只要控制鸟的上下移动就行

        但是,在看过那个原版游戏之后发现这个球啊,是会上下加速的,就比如你不按空格了,它就下降,而且下降的速度会逐渐增加,那么应该怎么操作呢?很简单的高中物理,给那个球搞个加速度,我称之为"伪重力",公式就是0.5*g*t^2,剩下就是怎么记录时间来加速,但是实际上这个操作很简单,就只要设置几个结点,比如你按空格或者没按空格的时候记录一下起始时间然后再减一下就行,但是要控制一下时间的重置和一些别的比较琐碎的事情,不然容易出现各种bug,总之处理完成后就会得到如下的效果:

柱子

        柱子的话本质上就是两个矩形,第一个柱子的高度就是直接随机,然后第二柱子的起始点就是第一个柱子的高度再增加几个球的大小的值,测试了一下发现没有问题,然后就是如何使柱子动起来,这点也很简单,和球的原理是一样的,只要一直增加或减去某个方向的值就行,你如果想的话还可以倒着来,类似于UnderTale的操作(doge),然后再用pygame自带的触碰检测函数检测球有没有和柱子相交就完事了。效果就和上面显示的一样

重开与结束

        结束有几个情况,第一种是按ESC键就可以退出游戏,另外一种就是赢了就退出游戏,很简单的事情,没必要说

        重开比较复杂,首先要重置所有点然后再搞个战败画面,然后再返回到最开是的那个界面,反正实际上就是调参,没什么好说的,效果如下:

        

总体流程

 

 备注

        上面写的代码是包含了一些图片和音频的,那是我自己搞的彩蛋和自己用吉他弹的音乐,需要使用的话可以把包含这些操作的代码删掉就可以了,如果需要原本的内容的话可以发邮箱给我,我的邮箱地址是okura_machi@126.com,或者也可以去github上搜ifhjl,然后这个游戏就是在work项目里面的小游戏的文件夹里面,需要可以自取。

这篇关于Python自制 笨鸟先飞的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/321132

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

HTML提交表单给python

python 代码 from flask import Flask, request, render_template, redirect, url_forapp = Flask(__name__)@app.route('/')def form():# 渲染表单页面return render_template('./index.html')@app.route('/submit_form',

Python QT实现A-star寻路算法

目录 1、界面使用方法 2、注意事项 3、补充说明 用Qt5搭建一个图形化测试寻路算法的测试环境。 1、界面使用方法 设定起点: 鼠标左键双击,设定红色的起点。左键双击设定起点,用红色标记。 设定终点: 鼠标右键双击,设定蓝色的终点。右键双击设定终点,用蓝色标记。 设置障碍点: 鼠标左键或者右键按着不放,拖动可以设置黑色的障碍点。按住左键或右键并拖动,设置一系列黑色障碍点

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

【Python报错已解决】AttributeError: ‘list‘ object has no attribute ‘text‘

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查属性名2.2 步骤二:访问列表元素的属性 三、其他解决方法四、总结 前言 在Python编程中,属性错误(At