侄儿子非要抢我手机玩吃鸡!但他才六岁菜的很。我花五分钟写了个游戏,他玩了一天。
导语
前两天不是中秋节吗,放了几天假,所以我就回家过节去了,也是没时间给大家更新,回家亲戚朋友多嘛,所以我侄儿子看到我在和别人玩和平精英,他也要玩,我以为他会,结果连东西都不会搜,就知道让我找飞机给他开!看得出,应该是看别人玩的多,自己基本没有玩过,但是他这么菜,我不能让他坑我的队友啊,毕竟也是分段比较高的局了,于是我就掏出笔记本写了款非常简单的游戏给他玩!没想到一玩上手了,家也不回了,玩到大晚上还念念不忘,说明天还来玩哦!
这款小游戏非常简单,也适合5,6岁的小朋友玩!看下效果
这里提供了所有代码:私信我
安装游戏库:
pip install pgzero
我们要做的第一件事是打开一个空窗口:
import pgzrunTITLE = "Arkanoid clone" WIDTH = 800 HEIGHT = 500pgzrun.go()
我们进口游戏零。标题显示在窗口上的标题,其他两个变量定义宽度和高度。Go()运行程序。
您将看到一个空白窗口:
接下来,让我们展示一些街区。
在高度和宽度下面添加以下代码:
WIDTH = 800 HEIGHT = 500paddle = Actor("paddleblue.png") paddle.x = 120 paddle.y = 420ball = Actor("ballblue.png") ball.x = 30 ball.y = 300
是PyGames 0显示图像的方式。图像总是存储在
影象
文件夹位于与游戏脚本相同的位置。
➜ tree . ├── game.py └── images├── ballblue.png└── paddleblue.png1 directory, 3 files
我们还设置了正在加载的图像的起始x和y位置:
paddle.x = 120 paddle.y = 420
这些值可以是任意的,我通过反复试验得到了上面的结果。
因此,我们将图像加载到内存中,但我们还没有显示它们。我们现在就解决这个问题。PgZero有一个内置的抽签()函数,该函数在启动游戏时自动调用。还有一个更新函数,每秒调用60次,并在移动时更新屏幕。
更新VS绘图功能
更新和绘制函数是相似的--除非更新每秒调用60次,而只有在某些事情发生变化时才调用绘图。
没有硬和快速的规则,但我会使用更新的东西,很多变化,如键盘运动,球运动等,而背景图像可以在绘制。
画桨和球
现在,我们将只在屏幕上绘图,并将UPDATE保留为空:
def draw():paddle.draw()ball.draw()def update():
我还有一件事要做。背景很无聊--让我们把它整理一下吧。
让我们更新绘图功能:
def draw():screen.blit("background.png", (0,0))paddle.draw()ball.draw()
背景是一个文件Background.png在……里面影象。这个布利特()函数将我们的图像绘制到屏幕上。(0,0)表示从x=0y=0开始。我们将在下面讨论更多关于PyameZero坐标系的内容。
好多了。
布置栏杆
接下来,我们要列出我们的球将击中的所有顶部的栏杆。
在我们的目录中有一些条形图,我们将使用它们。首先,布局1栏:
bar = Actor("element_blue_rectangle_glossy.png") bar.x=120 bar.y=100def draw():bar.draw()
很明显,一次只放一个栏杆是很痛苦的。让我们使用一个for循环来放置多个。
def draw():bar_x = 120bar_y = 100for i in range(8):bar = Actor("element_blue_rectangle_glossy.png")bar.x = bar_xbar.y = bar_ybar.draw()bar_x += 70
我们创建了开始的x和y变量-棒x初始化为120和棒Y初始化为100我们绕8圈。为什么是8?因为这就是我们能舒服地坐在屏幕上的酒吧。
对于每个循环,我们创建一个Actor并初始化它的x和y,并将其绘制到屏幕上。然后我们会:
bar_x += 70
使下一个条形图向左移动70个像素。再一次,我通过反复试验找到了70个。尝试更改值,然后看到条形图重叠或相距太远。
运行代码:
好的。现在我们也要把其他的栏杆都布置好。我计划有三排不同颜色的。
我要做的第一件事是将上面的代码解压缩到一个函数中:
def draw():screen.blit("background.png", (0,0))paddle.draw()ball.draw()place_blue_bars()def place_blue_bars():bar_x = 120bar_y = 100for i in range(8):bar = Actor("element_blue_rectangle_glossy.png")bar.x = bar_xbar.y = bar_ybar.draw()bar_x += 70
我所做的就是将代码解压缩成一个函数放置蓝条()现在,我可以创建更多的函Create_red_bar(等但我相信我们可以做得更聪明。所以我将有一个一般的函数Place_bar():
def place_bars(x,y,image):
我们还将创建另一个全局变量。条形表=[]在顶部,我们将用这个来检查要显示的条子,以及球击中后要移除的条子。
我们将传递第一个条形的起始x和y,加上我们想要使用的图像。最后的职能是:
def place_bars(x,y,image):bar_x = xbar_y = yfor i in range(8):bar = Actor(image)bar.x = bar_xbar.y = bar_ybar_x += 70bars_list.append(bar)
唯一的变化是我们初始化了x,y和输入的图像。
我们将在游戏主代码开始之前调用这个函数。
Pgzero.run()
coloured_box_list = ["element_blue_rectangle_glossy.png", "element_green_rectangle_glossy.png","element_red_rectangle_glossy.png"]x = 120y = 100
我们有一个包含3幅图像的列表,我们初始化了x和y值。然后我们循环遍历我们的列表:
for coloured_box in coloured_box_list:place_bars(x, y, coloured_box)y += 50
我们需要做一个
Y+=50
在每个循环中,否则,条子将放置在彼此的顶部。
最后代码:
coloured_box_list = ["element_blue_rectangle_glossy.png","element_green_rectangle_glossy.png","element_red_rectangle_glossy.png"]x = 120y = 100for coloured_box in coloured_box_list:place_bars(x, y, coloured_box)y += 50
还有一件事要做。我们正在创建我们的栏杆,但没有显示它们。更新绘图功能:
def draw()for bar in bars_list:bar.draw()
我们有漂亮的布局。我们现在可以开始研究逻辑了。
添加球物理和处理用户输入
移动桨
让我们从移动我们的桨开始。这是相当容易的,在游戏零-你可以直接检查键盘事件。让我们更新我们的更新()技巧:
def update():if keyboard.left:paddle.x = paddle.x - 5if keyboard.right:paddle.x = paddle.x + 5
如果键盘左
检查左键是否按下,如果是,则将桨的x位置更改为-5(即向左移动5个像素)。正确的钥匙也是一样。
为什么我要选择5个像素?在移动太快/太慢之间找到平衡。尝试将值更改为1和10,看看会发生什么。
按左右键-你现在可以移动桨了。
移动球
记住,内置的UPDATE()方法每秒调用60次。因此,任何游戏逻辑,如移动球,检查碰撞等都会出现在这里。我们将创建一个名为更新球()我们会从更新().
def update():update_ball()def update_ball():ball.x -= 1ball.y -= 1
我们要改变球的x和y位置。
关于PYGERO零坐标系的一点看法
屏幕左上角为0,0;即x=0,y=0。
当你往右走,x就会增加。
当你下去的时候,y会增加。
所以向左移动,减小x。向右移动,增加x。
下去,增加你。向上,减少你。
考虑到这一点:
Ball.x-=1
向左移动球(as-1=左,+1=右)
Ball.y-=1
将球向上移动(as-1=向上,+1=向下)
所以在开始的时候,球会向上和左边移动。这只是一个随机的决定-你可以很容易地选择下来和正确的。但我会坚持下去,现在,我可以给你们看一个问题:
球飞离了屏幕!哈!
我们需要增加检查,这样如果它撞到墙上,它就会反弹回来。这是物理部分。
现在再加上那张支票。
首先,让我们为x和y的速度添加一个全局变量。将这些全局VAR添加到文件的顶部:
ball_x_speed = 1 ball_y_speed = 1
左/右和上/下的速度是1像素。您可以尝试增加这个数字,以使球跑得更快(从而增加难度),但我们将坚持1,因为它使测试变得容易。
让我们在函数中使用这个变量:
def update_ball():global ball_x_speed, ball_y_speedball.x -= ball_x_speedball.y -= ball_y_speed
代码和以前一样,只是用变量替换了‘1’。我们现在把加起来。
if (ball.x >= WIDTH) or (ball.x <=0):ball_x_speed *= -1
如果x超过我们为游戏定义的最大宽度(即超出屏幕的右侧),或低于0(即超出屏幕的左边),那么:
ball_x_speed *= -1
这是什么意思?记住,每次更新的时候我们都是按球的速度前进的。首先,我们向上移动,然后离开。
在这里,我们把速度乘以-1。所以,如果球向左移动,它就会开始向右移动,反之亦然。
结果是,球一碰到边界,就会改变方向。
对于y轴,我们也可以这样做:
if (ball.y >= HEIGHT) or (ball.y <=0):ball_y_speed *= -1
再一次,我们检查球是在屏幕上方还是下面。最后的职能是:
def update_ball():global ball_x_speed, ball_y_speedball.x -= ball_x_speedball.y -= ball_y_speedif (ball.x >= WIDTH) or (ball.x <=0):ball_x_speed *= -1if (ball.y >= HEIGHT) or (ball.y <=0):ball_y_speed *= -1
让我们测试代码:
太酷了,所以球会从墙上跳下来。但它仍然穿过街区。我们来解决这个问题。
在PyameZero中实现碰撞检测
在UPDATE函数中,我们添加此代码以检测冲突:
def update():update_ball()for bar in bars_list:if ball.colliderect(bar):bars_list.remove(bar)
让我们逐行检查代码。
我们绕着栏杆:
for bar in bars_list:
对于每个酒吧,我们检查球是否与之碰撞:
if ball.colliderect(bar):
对撞机()是一个内置的函数,它检查两个对象是否发生碰撞;在本例中,是球体和棒子。
如果它们发生碰撞,我们从列表中删除该条:
if ball.colliderect(bar):bars_list.remove(bar)
记住,这些条是在
抽签()
功能?
for bar in bars_list:bar.draw()
如果我们从列表中删除该条,它将不再被绘制,从而从屏幕上消失。
运行代码以检查它是否有效:
好的,那很好,但是球像刀子一样穿过块。这不是我们想要的。我们想让球在击中盖子时反弹。
幸运的是,有一个简单的解决方案:
for bar in bars_list:if ball.colliderect(bar):bars_list.remove(bar)ball_y_speed *= -1 # ==> this is the new code
最后一行是新代码--我们改变了球的y方向--所以如果它上升了,它就会开始下降。
我还想做一件事。在真正的阿肯色州,当球击中块或桨,它可以左或右,模拟现实世界弹球样的“物理”。是的,这并不完美,但它给比赛增添了一些乐趣,因为你不知道球会去哪里。
我将为此添加代码:
# randomly move ball left or right on hitrand = random.randint(0,1)if rand:ball_move_x *= -1
当球击中一个街区,我们将随机,大约50%的时间,改变方向。所以如果球向右,它可能会开始向左移动。
我们还有最后一件事要做。
把球从我们的桨上弹下来
我将分享代码--你现在应该能够理解它了:
if paddle.colliderect(ball):ball_y_speed *= -1# randomly move ball left or right on hitrand = random.randint(0,1)if rand:ball_x_speed *= -1
再次,我们检查球是否与桨碰撞,如果是,改变它的y方向。随机改变x方向。
你现在应该可以玩这个游戏了:
1)代码中有一个很大的错误--如果它落在桨下,游戏就会继续进行。实际上,你永远不会输!
你需要改变逻辑,这样如果球落在桨下,游戏就结束了。在下一个例子中,我们将看到如何在屏幕上创建一个游戏,现在只需将其打印到控制台即可。
2)试着增加分数--所以每次你碰到一个街区,你就能得到1分。同样,只需将得分打印到控制台即可。
对于加分,对于不同颜色的块有不同的分数。提示:您需要将块存储在不同的列表中,这样您就可以根据您点击的颜色来检查分数。
那么你学会了吗?需要代码记得看前文哈!
侄儿子非要抢我手机玩吃鸡!但他才六岁菜的很。我花五分钟写了个游戏,他玩了一天。相关推荐
- 怎么用计算机打吃鸡,用电脑也能玩“吃鸡手游”,屏幕大更容易找到对手的位置!...
#宅家游戏大赏# 大家好,欢迎来到<刺激实战教室>,我是你们的老朋友刺激哥.在吃鸡手游中,一直都有一个歧视链存在. 这个歧视链大致的顺序是,手机玩家歧视平板玩家,平板玩家歧视外设玩家,外设 ...
- win10玩cf不能全屏_5千左右预算,2020年畅玩吃鸡、魔兽、LOL、CF、炉石传说、逆水寒,高性价台式电脑推荐/选购指南...
吃鸡.魔兽.逆水寒这种3D游戏还是比较消耗配置的,要想保持多人团战.特效高开时不卡顿,保持流畅,笔记本得买很贵的,但台式机就不用花那么多钱,5千左右的主机性能就相当于7-8千左右的笔记本的性能. 因为 ...
- 还在做手搓党和模拟器党?手机投屏电脑玩吃鸡你值得拥有
有没有什么模拟器电脑上玩刺激战场可以匹配手机玩家?我告诉你,已经没有了,基本所有的可以叫得出名字的安卓模拟器玩刺激战场都是匹配的模拟器家.不想做手搓党也不想被系统检测模拟器,你只需要一款神奇:手机投屏 ...
- 战场模拟器过检测集体凉凉?没关系,你还可以这样电脑玩吃鸡匹配手机
刺激战场模拟器过检测被封号怎么办?最近听用模拟器玩刺激战场的朋友说的最多的就是"千万不要用模拟器过检测,我都被封了好几个账号了,封号时长从三天到三个月不等.要么就好好的用手搓,要么就听天由命 ...
- 手机玩吃鸡屏幕太小咋办?模拟器玩不能匹配手机?你可以这样操作
手机玩和平精英嫌屏幕太小怎么办?如何用模拟器在电脑上玩吃鸡才能匹配手机?对于喜欢玩吃鸡的玩家来说,为了可以吃到鸡基本上什么方法都愿意尝试,什么模拟器过检测啊,游戏手柄外设等等,再看看刺激战场国际服有多 ...
- 良心推荐:最适合玩吃鸡手游的安卓机型有哪些?刺激战场为例
什么安卓手机玩吃鸡效果最好?性价比最高的适合玩游戏的机型推荐?废话不多说,作为一个游戏爱好者,特别是吃鸡爱好者加游戏主播,平均每天花在游戏上的时间高于5小时,现在就给你们推荐一下我用过的比较适合玩游戏 ...
- 模拟器什么的都过时了!这样玩吃鸡才能真正的高清无延迟
怎么在电脑上玩和平精英?模拟器玩刺激战场国际服如何高清流畅无延迟?说到怎么玩吃鸡,相信不少睿智的玩家可以细数出几十种方式:模拟器.手柄.三指五指等等.今天我也要跟各位玩家分享一种真正的高清零延迟电脑玩 ...
- 性能稳定的android手机,盘点吃鸡性能最好的4款安卓手机,黑鲨只能垫底
原标题:盘点吃鸡性能最好的4款安卓手机,黑鲨只能垫底 随着科技的发展,现在的手机是越来越不错了,大家最喜欢的是哪款手机呢?相信许多的男网友都会选择性能比较好的手机吧,判断一款手机性能好不好,吃鸡游戏是 ...
- android平板能玩吃鸡吗,吃鸡不卡的安卓平板
用手机玩吃鸡的时候,常常会因为屏幕大小.续航时间不够而苦恼,没玩多久就需要充电,有没有什么好的办法来解决呢?平板是不错的选择,既可提供更大屏幕,同时续航也更好,那么安卓平板里哪些玩吃鸡不卡呢?下面就来 ...
最新文章
- 相爱相杀:程序员的数学
- mysql二进制日志文件差不多_mysql数据同步-基于二进制日志文件和position复制点的方式...
- kmeans python interation flag_Python / Scipy Integration数组
- 读文件 —— 读写配置文件
- 谈吉日嘎拉的《白话反射技术》及其他(吵架篇)
- 【Awsome】GitHub 资源汇总(更新中)
- 轻量级Web应用程序框架:PrimeFaces(JSF)+ Guice + MyBatis(第2部分)
- tp auth 转载保存
- dede站怎么在首页调用单页的内容?
- Julia:关于split的用法
- java项目王者荣耀源码分享,拿走不谢
- SAP PK Oracle
- 水经注万能地图下载器的自定义瓦片导出功能
- 利用Python画直方图
- python网络爬虫-复杂HTML解析
- cpua55和a53哪个好_OPPOA55和OPPOA53哪个好-参数对比-更值得入手
- C. Xenon's Attack on the Gangs(树形dp)
- 为什么Android没有iOS那么顺滑
- python真的有用吗-Python真的没有用吗?
- HTML、CSS定义字体、颜色、背景等属性