Python游戏开发,pgzrun模块,Python实现阿肯色克隆人游戏

article/2025/9/7 1:45:05

前言

利用Python实现Python和PyGameZero编写阿卡尼类(Outout)的克隆,废话不多说。

让我们愉快地开始吧~

开发工具

**Python版本:**3.6.4

相关模块:

pgzrun模块;

以及一些Python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

游戏实现

安装游戏零:

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():pass

更换背景

让我们更新绘图功能:

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()

布置1栏

很明显,一次只放一个酒吧是很痛苦的。让我们使用一个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分。同样,只需将得分打印到控制台即可。

对于加分,对于不同颜色的块有不同的分数。提示:您需要将块存储在不同的列表中,这样您就可以根据您点击的颜色来检查分数。


http://chatgpt.dhexx.cn/article/4AiEBNgc.shtml

相关文章

python游戏开发必有套路

游戏开发很简单&#xff0c;只需几个步骤 重点: 控制和显示窗口: pygame.display.方法 必有步骤1:创建游戏窗口 初始化游戏窗口 pygame.init() 设置游戏窗口 必用到pygame里的display模块&#xff0c;记住只要是控制和显示窗口和屏幕&#xff0c;都会调用display模块…

Python开发系列课程(12) - 图形用户界面和游戏开发

图形用户界面和游戏开发 基于tkinter模块的GUI GUI是图形用户界面的缩写&#xff0c;图形化的用户界面对使用过计算机的人来说应该都不陌生&#xff0c;在此也无需进行赘述。Python默认的GUI开发模块是tkinter&#xff08;在Python 3以前的版本中名为Tkinter&#xff09;&…

【python游戏开发】:那些由python开发的知名网站和游戏你知道多少

前言 众所周知&#xff0c;Python不仅在数据分析和人工智能方面有着广泛的应用&#xff0c;而且在网站开发和游戏开发方面也是独一无二的。今天&#xff0c;大美将带你去看看哪些知名的大公司和网站是用Python开发的&#xff0c;还有一些用Python开发的超级游戏。列出一些著名…

python游戏开发的五个案例分享

本文给大家分享了作者整理的五个python游戏开发的案例,通过具体设计思路,代码等方面详细了解python游戏开发的过程,非常的详细,希望大家能够喜欢 一、序列应用——猜单词游戏 1. 游戏介绍 猜单词游戏就是计筧机随机产生一个单词&#xff0c;打乱字母顺序&#xff0c;供玩家去…

pgzero:用 Python 进行游戏开发

1. pgzero python在各个领域都有着丰富的第三方库&#xff0c;pygame是python在游戏领域的应用库&#xff0c;可以用来开发各种不同的游戏。但是对于初学者来说&#xff0c;还是存在一定的门槛。 而今天要和大家分享的pgzero&#xff08;pygame zero&#xff09;是在pygame基础…

Python3爬虫、数据清洗与可视化实战之写一个简单的爬虫

文章目录 关于爬虫的合法性了解网页认识网页结构写一个简单的HTML 使用requests库请求网站安装requests库爬虫的基本原理使用GET方式抓取数据使用POST方式抓取数据 使用Beautiful Soup解析网页清洗和组织数据爬虫攻防战 关于爬虫的合法性 几乎每一个网站都有一个名为robots.tx…

Python3.X 爬虫实战(并发爬取)

【工匠若水 http://blog.csdn.net/yanbober 未经允许严禁转载&#xff0c;请尊重作者劳动成果。私信联系我】 1 背景 在这一系列开始前我们就说过&#xff0c;简单的爬虫很容易&#xff0c;但是要完成一个高效健壮的爬虫不是一个简单的事情&#xff0c;这一系列我们已经明白了爬…

Python爬虫(三)

Python爬虫&#xff08;三&#xff09; 一、ajax请求豆瓣电影第一页 # get请求 # 获取豆瓣电影的第一页数据并保存 import urllib.request url https://movie.douban.com/j/chart/top_list?type5&interval_id100%3A90&action&start0&limit20 headers {use…

Python3爬虫(一)抓取网页的html

因为代码只有几行&#xff0c;所以可以先贴代码&#xff1a; import urllib.request url rhttp://douban.com res urllib.request.urlopen(url) html res.read().decode(utf-8) print(html) 第一行&#xff0c;导入 urllib库的request模块 第二行&#xff0c;指定要抓取的网…

python3爬虫-Python3网络爬虫入门实战解析

网络爬虫简介 网络爬虫&#xff0c;也叫网络蜘蛛(Web?Spider)。它根据网页地址(URL)爬取网页内容&#xff0c;而网页地址(URL)就是我们在浏览器中输入的网站链接。 在浏览器的地址栏输入URL地址&#xff0c;在网页处右键单击&#xff0c;找到检查。(不同浏览器的叫法不同&am…

Python3爬虫概述

爬虫基础 文章目录 爬虫基础爬虫概述Session和Cookie简述1. Session2. Cookie3.关于Session 参考资料 爬虫概述 简单来说&#xff0c;爬虫就是从网页上提取信息并保存的自动化程序。 爬虫程序的工作: 获取网页: 爬虫需要先获取网页信息&#xff0c;即网页源代码进行后续分析。…

python爬虫之

使用BeaufulSoup获取指定class时&#xff0c;结果是将我们所输入的字符串去做模糊匹配&#xff0c;因此会将所有包含的class结果输出&#xff0c;如下图&#xff1a; 但我们所需要的可能是精确匹配的那一条&#xff0c;这个时候更换一下代码即可&#xff1a; web_url http://…

Python3 网络爬虫 <教程全集>

1.1 最简单的爬虫 我的老师&#xff1a;Jack Cui PS&#xff1a;我是通过 看 Jack Cui 老师的文章 学习的爬虫&#xff0c;也为我之后的 爬虫打开了大门。 1.1.1 URL 是什么&#xff1f; 在学习 爬虫之前&#xff0c;我们必须知道 我们 平常 所说的网址&#xff0c;实际上 叫…

爬虫python

一、Urllib 1.什么是互联网爬虫&#xff1f; 如果我们把互联网比作一张大的蜘蛛网&#xff0c;那一台计算机上的数据便是蜘蛛网上的一个猎物&#xff0c;而爬虫程序就是一只小蜘蛛&#xff0c;沿着蜘蛛网抓取自己想要的数据 解释1&#xff1a;通过一个程序&#xff0c;根据Ur…

手把手教你如何入门Python3 网络爬虫

很多朋友学习Python都是先从爬虫开始&#xff0c;其原因不外两方面&#xff1a; 其一Python对爬虫支持度较好&#xff0c;类库众多&#xff0c;其二语法简单&#xff0c;入门容易&#xff0c;所以两者形影相随&#xff0c;不离不弃。 要使用python语言做爬虫&#xff0c;首先需…

python3 爬虫

一.网络爬虫&#xff08;Web Crawler&#xff09; 1.网络爬虫&#xff1a;是一种按照一定的规则&#xff0c;自动地抓取网上信息的程序或者脚本。 2.爬虫&#xff1a;为了获取网上大量的我们能看的到或看不到的数据 3.基本步骤&#xff1a;&#xff08;1&#xff09;定位要爬的…

python 爬虫

Python 爬虫教程(更新中) 目录 1. 简介 2. 注意 3. xpathselenium 4. xpathscarpy&#xff08;更新中&#xff09; 5. icrawler 【借助更加便捷操作的pip包】 1. 简介 爬虫主要有2种方式&#xff1a;API(报文)-静态、模拟鼠标点击形式-动态&#xff1b; Xpath Scrapy(…

【python】python爬虫

爬虫基础 HTTP协议 HTTP是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写&#xff0c;是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。 HTTP是基于TCP/IP通信协议来传递数据&#xff08;HT…

Python3 网络爬虫(一):初识网络爬虫之夜探老王家(2020年最新版)

一、前言 3年前&#xff0c;我在 csdn 写过 Python3 网络爬虫系列教程&#xff0c;经过三年的积累&#xff0c;累计阅读量近 90W。 同时&#xff0c;我也在 Github 开源了所有 Python3 网络爬虫代码&#xff0c;累积获得 10.3k 的 star&#xff0c;4.1k 的 fork。 可以说&…

Python3 爬虫快速入门攻略

一、什么是网络爬虫&#xff1f; 1、定义&#xff1a;网络爬虫&#xff08;Web Spider&#xff09;&#xff0c;又被称为网页蜘蛛&#xff0c;是一种按照一定的规则&#xff0c;自动地抓取网站信息的程序或者脚本。 2、简介&#xff1a;网络蜘蛛是一个很形象的名字。如果把互…