长阳网站建设,长沙百度网站推广公司,手机网站关键词优化软件,一站式做网站平台注#xff1a;
想慢慢学习的同学可以看我的 《python 入门到游戏实战专栏》#xff08;更新中#xff09; 想学 C 的同学可以看《大话系列之C语言》#xff08;基本更新完#xff09; 想学 C 的同学可以看《大话C》#xff08;更新中#xff09; 想做习题的可以看《大学…注
想慢慢学习的同学可以看我的 《python 入门到游戏实战专栏》更新中 想学 C 的同学可以看《大话系列之C语言》基本更新完 想学 C 的同学可以看《大话C》更新中 想做习题的可以看《大学生C语言作业、习题100例白话详解》
作者简介
作者名1_bit
简介CSDN博客专家2020年博客之星TOP5蓝桥签约作者。15-16年曾在网上直播带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息迷茫的你会找到答案。系列教程将会在流量降低时转为付费位置流量多时将不会各位抓紧时间学习哟~
学习开始
小媛小 C我想学做游戏了有什么速成的办法吗
小C没有谢谢。
小媛我看他们都可以直接做一个飞机大战说是一下子就学会了。
小C你是想先大概过一遍内容吗还是具体的全面的学
小媛我想先有一点体验感自己学的舒服玩一下也行。
小C那就可以1小时搞定。
小媛这么快那刚刚你又说不行。
小C你不是全面学只学基础核心就没啥问题。一个小时搞定还是可以做点东西的。
小媛那就赶紧开始吧。
小C那我们就学 python 吧你觉得怎么样
小媛可以呀做出来游戏就可以了。
小C你电脑我记得有环境和编辑器我们就用原本的就好了。
小媛原本的是啥
小C那个 vscode我们用的库是 pygame。
小媛唔懂了。
01 hello world
小C那我们就从头开始学吧首先打开我们的 vscode 创建一个文件叫做 game.py 进行代码的测试吧。 小媛了解我已经新建好了。
小C那我们首先写一个 hello world 吧。
小媛hello world 是什么
小C是一个经典的计算机程序就是程序运行的时候会显示 hello world。
小媛懂了那怎么做呢
小C首先你要知道编程其实就是使用不同的“魔法指令”在计算机中创造不同的东西python 用来显示内容的指令就是 print()你用 print() 要显示什么字符串就在里面加上去就可以了。
小媛这样吗
print(helloworld)小C在这里需要跟你提一点在 python 中字符串是需要使用双引号引起来的。
小媛懂了你的意思是这样。
print(helloworld)小C对的这个时候我们点击运行按键就可以看到结果了。 小媛出现结果了在这里。
02 变量
小C那我们继续往下讲。我们接下来学一个容器用来存储值。
小媛存值的内容有什么意义吗
小C有呀你想想在游戏之中其实你的血量都是存在一个容器之中还有你的昵称不然你觉得没有东西存那这东西怎么显示
小媛哈哈哈之前不懂现在懂了。
小C变量也是超级简单我们直接给变量起个名字用个等于号就可以存值了。你现在创建一个变量你想起什么名字呢
小媛那就起一个名字叫做 a 就好了。
小C那你想在这个变量 a 里面存什么值呢
小媛那就存一个 10 吧。
小C那么代码就可以这样写。
a10小媛就这样
小C是的我们创建一个变量直接一个名字在这个变量名右边用一个等于号连接一个值那么这个值就会存储到这个变量中。
小媛真简单。
小C那你知道怎么存储一个字符串吗
小媛知道呀就这样。
a1_bit小C为什么要这样写呢
小媛因为 a 是一个变量名用一个等于号就可以把等于号右边的值存到左边的变量中然后最开始你说在 python 中字符串是需要双引号标记那就是这样写咯。
小C不错理解透彻那我们开始显示变量里面所存储的内容吧。
小媛这个就不会了怎么显示呢
小C很简单也是使用 print()直接在 print() 的括号内填写变量名就可以了。
小媛这样吗
a1_bit
print(a)小C是的。
小媛结果出来了。 小C使用 print() 可以显示很多的内容例如你想用字符串连接在一起显示可以使用逗号进行分隔首先我们创建多个变量。
a1_bit
b2_bit
c3_bit小媛这样就可以创建几个变量了吗
小C是的python 的代码是一行行的从上往下书写这个切记。每一句结束后就需要换到下一行去进行编写。
小媛懂了。
小C那我们同时显示这几个变量的内容直接使用 print() 就可以了。在 print() 元你括号内填入几个变量使用逗号进行隔开就行。
a1_bit
b2_bit
c3_bit
print(a,b,c)小媛我运行后显示出来了。 小C你还可以在 print() 中填入其他的字符串当作值进行输出显示。
小媛那意思就是说使用引号把字符串引起来就可以了吧然后使用逗号隔开
小C是的这样字符串也是值只要填入就可以输出显示。
小媛代码是这样我运行出来了。
a1_bit
b2_bit
c3_bit
print(分别输出 a b c 的值a,b,c)03 变量运算
小C其实我们的变量是可以进行相加减的例如以下代码和结果。
a11
b2
c31
print(ab)
print(a-b)
print(a*c)小媛明白了跟日常生活中的一样。
小C其实只是基础运算大致相同我们可以看看下面这个示例。
a11
b2
c31
print(ab)
print(ab)
print(ac)小媛为什么会这样呢
小C因为两个字符串之间做加法这个加法指的是将两个字符串进行连接因为字符串和数字是两个类型。带双引号的 11 是字符串的 11而不是数字的 11你得明白这一点。
小媛哈哈哈懂了。就是说数字也是字符看不同形态下的表现。
小C是的。
04 逻辑判断
小C接下来我们可以看下逻辑判断了这个是非常重要的知识点。
小媛是不是在游戏中用的很多
小C逻辑判断你要做啥其实都用的很多。
小媛那我就认真学习。
小C其实逻辑判断就像你登录游戏时需要判断你的帐号密码一样判断帐号密码是否正确正确就登录游戏错误就退出游戏就是这个意思。
小媛懂了。
小C逻辑判断在 python 中使用的是 if。我们可以把这个 if 当作是一句魔法我们在需要逻辑判断的时候就把这个打上就可以了。
小媛明白就跟念咒语一样。
小C是的。我们打上 if 后在 if 后面加上一个条件然后使用冒号结束就像下面一样。
a11
if a11:print(a是等于11)小媛嗯首先你是创建一个变量 a 存储 11 这个值然后使用 if 语句给了一个条件这个条件是 a11然后冒号结束。不过我想问一下你在这里打了两个等于号是不是你打错了
小C这个没有。在 python 中是使用两个等于号进行判断左右两边是否相等也就是判断两个等于号的坐标 a 是否等于右边的 11。
小媛明白了那为什么下一句 print() 前面要空几个格呢
小C你想想如果条件正确了是不是就执行一句话条件错误了就应该执行另外一条代码
小媛是的。
小C其实在这里是如果这个条件正确就执行冒号后的下一行 print(a是等于11)。前面使用几个空格的意思是将表示这条代码属于 if 这个判断结构内和其他代码不是一个结构的东西这样只要条件错误就不会执行 if 结构内的了如果你放在外面就会被执行了。
小媛懂了你意思这样就可以标识是这个 if 结构内的东西了是 if 这个结构内部的。
小C是的运行后将会显示结果。 小媛我修改了 a 的值他就不会显示出来了啥也没显示。
a111
if a11:print(a是等于11)小C其实我们 if 语句内可以打很多代码的因为编程是灵活的例如这个示例
a11
if a11:print(a是等于11)print(a是等于11)print(a是等于11)print(a是等于11)print(a是等于11)小媛是不是都要空相同的空格呀
小C是的这样才表示是同一个层级。如果你乱空空格会出错的。
小媛明白。
小C如果这个时候我们想知道判断错误我们可以添加一个 else 语句这样错误的话就是显示 else 语句内部的代码了。
a111
if a11:print(a是等于11)print(a是等于11)print(a是等于11)print(a是等于11)print(a是等于11)
else:print(判断错误)print(判断错误)print(判断错误)小媛明白了这个 else 语句一定要紧跟着在 if 语句结束后吗而且他是顶头的没有进行空格。
小C是的因为 if 和 else 是同级如果你也空格了那不就是在 if 语句判断对后才能执行吗这样永远就不会执行 else 语句了并且这样写也是错误的else 还可以紧跟在 elif 后面当我们多条件的时候就可以使用 elif 语句。
小媛那就举个例子吧。
小C那你看下面。
a2
if a11:print(a是等于11)print(a是等于11)print(a是等于11)print(a是等于11)print(a是等于11)
elif a2:print(a是等于2)print(a是等于2)print(a是等于2)
elif a3:print(a是等于3)print(a是等于3)print(a是等于3)
else:print(判断错误)print(判断错误)print(判断错误)小媛elif 后面跟着的就是条件吗例如 a2 和 a3
小C是的当 if 条件判断错误后会依次进行判断哪一个条件判断正确就执行那个条件内的代码如果所有条件错误那么就执行 else 部分。
小媛明白了还有多少才能学完基础
小C已经学完一半了超级快的哈哈哈。
小媛好请继续。
小C其实 if 还可以进行嵌套例如下面这个代码。
a2
b3
if a2:if b3:print(完全符合要求)
else:print(第一项要求都没符合耶)小媛嵌套的意思就是在 if 里面再有一个 if 吗
小C是的但是里面的 if 也有层级要表示是里面 if 内的代码还是需要使用几个空格间隔依次往里缩。
小媛明白了。
05 循环
小C接下来我们学习循环。当你想重复运行某一条或者某一段代码时我们可以使用循环节省我们的代码编写时间例如下面这段代码。
i0
while i10:print(你好)ii1小媛你首先创建了一个变量 i然后我就不懂了。
小Cwhile 是一个循环就跟你使用 if 一样使用 while 表示要开始循环了while 之后的是一个条件也就是满足这个条件才会循环 while 循环内的代码这个条件使用冒号结束是不是感觉 while 的形式跟 if 语句很像呢
小媛是的感觉很相同然后最后的两个在前面空了几个格并且使用了相同的空格是表示是 while 循环结构内的代码吧
小C是的这个是就会执行循环每次循环都会执行 print(你好) 和 ii1。由于条件是 i10 i 每次循环都会加 1第一次循环 i 是 0第二次循环 i 是 1然后依次类推肯定会超过 10的这个时候就不循环了。下面就是结果。 小媛明白了。循环也可以进行嵌套吧
小C是的不过我们暂时不用讲由于是速成所以我们在之后的游戏制作之中再做讲解。
小媛好的。
06 列表
小C接下来我们讲一个列表。我们在进行存储值的时候使用变量是存储一个值那么我们使用列表就可以存储多个值了。
a[99,6,7,85,2,3]
print(a)
print(a[0])
print(a[4])
a[0]你好
print(修改后的值是,a)小C在这里这个 a 就是列表然后使用一个等于号将我们想要存储的值放到一个中括号内并且值与值之间使用逗号进行分隔这个时候就可以创建一个列表了。
小媛明白了感觉挺简单的。然后 print(a) 就是显示这个列表的值了吧
小C是的然后 print(a[0]) 意思就是输出这个 a 列表内的第一个元素。在列表中 0 就表示第一个元素 99然后 1 就表示第二个元素 6然后以此类推我们在输出的时候使用一个变量名然后后面使用方括号在方括号内写上你想显示第几个元素就可以取到这个元素然后将值进行显示输出了。
小媛懂了然后 a[0]你好 的意思就是给这个位置重新赋值
小C是的这个时候我们可以看到最后输出所有值的时候第一个元素的内容发生了改变。
07 列表与 for 循环
小C其实我们还可以使用一个循环使我们的列表一个个值进行显示这个循环叫做 for 循环。
小媛循环还有内容没学完吗
小C是的还有一个 for 循环没进行学习你看下面的代码示例。
a[99,6,7,85,2,3]
for v in a:print(v)小媛每一个值都一个个输出显示了。
小C是的代码 for v in a: 中的 for 表示开始使用 for 循环接下来的 v in a 你可以理解成直接在这里创建一个变量 v然后这个变量 v 进到 a 这个列表中一个个去取值首先会取到最开始的值然后每次循环就会跳到下一个值这个时候我们就可以把这个值取出使用 print() 就可以进行显示了。
小媛原来是这么回事理解了。
08 自定义函数
小C接下来我们开始编写自定义的工具了其实 print() 我们可以称为函数函数我们可以理解成一个工具或者说一个功能。我们需要用到这些功能的时候字节拿过来用就可以了现在我们要编写一个菜单功能每次用到菜单就不用自己去写那么多代码直接使用就可以。
小媛那这样我不是可以节省很多时间了
小C是的这个就叫做自定义函数自己编写一个函数。你可以看下面的代码示例。
def menu():print(这是一个菜单你可以进行查看)print(1.进入系统)print(2.退出系统)print(3.删除系统)print(4.退出帐号)print(5.关闭软件)menu()小媛这个时候不会是上面的 print 直接显示的内容吗
小C不会我先解释一下这个的意思吧。我们可以看到 defdef 表示你开始创建一个自定义函数def 后就是一个函数名之后使用一个括号这是定义函数的一种形式之后的话我们使用冒号进行结束就可以了。
小媛例如我想创建一个函数叫做 abc那么是不是可以这样写。
def abc():小C是的然后在冒号下一行开始编写这个函数的代码就可以了一样的需要使用空格表示这个代码是属于这个函数内的内容。
小媛明白了。
小C调用函数就是使用函数的意思直接使用函数名加一对圆括号就可以使用此时就等于运行了函数内的代码这个时候就显示出了内容。
小媛意思说如果不使用就不会起作用
小C是的是这个意思。
小媛明白了。
小C其实函数还可以接受参数就像你使用 print() 一样需要往里面传入数据才能显示。你自己创建一个函数也可以接受一下参数参数其实就像你生活中用电饭锅做饭需要有米才可以煮饭这个米就是这个电饭锅功能的参数。
小媛懂了那怎么做呢
小C很简单在自定义函数的圆括号内创建变量如果是多个就使用逗号进行间隔就可以了。
小媛你的意思是说这样
def abc(a,b):小C是的例如下面这个代码。
def abc(a,b):print(ab)abc(1,2)小媛这个时候 1 就等于存到 a 里面然后 2 就等于存到了 b 里面是吧
小C是的如果你只想函数作为计算不输出我们可以使用一个叫做 return 的进行值的返回。例如以下代码。
def abc(a,b):return abcabc(1,2)
print(c)小媛你的意思是 return 会把 ab 的结果给返回出去
小C是的这个时候 c 就可以进行接收abc(1,2) 计算后就等于了 3最后输出 c 的内容就可以看到等于 3 了。
小媛明白了。
09 类和对象
小C我们接下来需要学习的是面向对象。
小媛面向对象是什么呀我没有对象。
小C其实面向对象不是说你要有对象其实就是我们可以创建一个类型这个类型实例化后就是对象。
小媛不懂好难。
小C其实不难的你看下面的示例。
class human:nameage0def say(self):print(hello)def myInfo(self):print(myName:,self.name,myAge:,self.age)小媛完全看不懂啊好难。
小C我一个个解释给你听吧。在上面代码中的 class 就是表示现在要创建一个类别human 就是这个类别的名称。
小媛你的意思就是 class 是关键字后面就是这个类型的名称时候吧
小C是的在这个 human 类型中有两个属性一个属性叫做 name另外一个属性叫做 age。
小媛就跟正常变量一样一个 name 存储的是空字符串一个 age 存储的是年龄。
小C是的在这里 name 就用来存储名称age 用来存储年龄接下来就由两个方法一个叫做 say 一个叫做 myInfo。
小媛这两个是自定义函数吧那参数为什么是个 self 呢
小C这个 self 我们可以理解成当前这个类型之中的意思家长自定义函数的参数之中我们可以当做表示这个自定义函数是属于这个类。
小媛你的意思就是加了 self 才表示是当前这个类型的方法
小C对的规定是这样做的。你可以看这句代码 print(myName:,self.name,myAge:,self.age)self就是表示当前这个类型self.name 就表示是当前这个类型中的 name 这个变量我们可以理解那个小数点为 “的” 的意思self.name 就是当前类型中的 name 变量。
小媛明白了。
小C我们接着看一下下面的使用方法。
class human:nameage0def say(self):print(hello)def myInfo(self):print(myName:,self.name,myAge:,self.age)xiaoMhuman()
xiaoM.say()
xiaoM.myInfo()
xiaoM.nameXiaoMing
xiaoM.age18
xiaoM.myInfo()小CxiaoMhuman() 就是创建一个 human 对象。例如我们人是一个类型那么具体到一个人就是一个对象现在 human 这个类型创建到了一个具体对象存储在 xiaoM 这个变量之中。
小媛唔明白了有了类型才能创建到一个具体的对象。
小C嗯然后我们可以通过这个对象使用这个类型的方法因为这个对象就属于这个类型。例如 xiaoM.say() 就表示使用这个类型中的 say() 方法然后 xiaoM.myInfo() 也是当然我们也可以使用 xiaoM.nameXiaoMing 去赋予这个对象中这个 name 属性值然后在使用 myinfo 进行输出这个时候值就改变了。 小媛唔全明白了哈哈哈。
10 开始做游戏 pygame
小C接下来我们开始编写一个小游戏吧。
小媛这么快
小C是的已经可以去写了的。首先我们需要做的是准备工作我们在命令窗口中使用 pip 命令安装 pygame 这个游戏库你的电脑已经有 pygame 了那我们就不需要这一步了。
pip install pygame小媛嗯。
小C接下来我们的第一步是将 pygame 引入。
import pygame小Cimport 就像你的一只手然后 pygame 就是一个工具名连起来就是将这个工具拿过来用。
小媛明白了。
小C接下来我们就需要进行初始化。初始化就像你玩游戏需要创建一个角色一样这就是初始化。
import pygamepygame.init()
screenpygame.display.set_mode((600,800))
pygame.display.set_caption(这是一个飞机游戏)小C上面代码中的第二条 init 就是初始化的意思。
小媛那个小数点是不是就表示 pygame 中的 init 方法直接使用就可以初始化
小C是的pygame.display.set_mode((600,800)) 这句代码我们可以理解成 pygame 这个工具中有一个工具叫做 displaydisplay 有一个g功能就是创建窗口名叫 set_mode我们在 set_mode 中传入这个屏幕的宽高并且使用括号括起来宽高就可以创建出一个屏幕了其中 600 是宽 800 是高之后创建了屏幕后将这个屏幕给予一个变量之后就可以通过这个变量对这个屏幕进行操作。
小媛简单理解起来容易。
小C接下来那一句代码 pygame.display.set_caption(这是一个飞机游戏) set_caption 是 display 的另外一个功能可以设置标题直接将字符串当作参数传入 set_caption 就可以了。
小媛懂了。
11 游戏主循环
小C接下来我们需要开始游戏主循环的内容所有游戏都是通过一个循环去监听你在游戏中做了什么事这个时候我们可以使用 while 循环给予一个 True 做条件True 就表示永远条件正确。
小媛你的意思就是需要创建一个循环还一直看玩家按了什么键做了什么事
小C对的你看下面代码。
import pygamepygame.init()
screenpygame.display.set_mode((600,800))
pygame.display.set_caption(这是一个飞机游戏)while True:for event in pygame.event.get():if event.typepygame.QUIT:exit()小C在 while 循环内有一个 for 循环用来取游戏中发生的所有事件。pygame.event.get() 将会获取到玩家做了所有的事情通过 for 循环一个个去取event 这个变量就分别每次取得这些内容使用 if 判断 event 的类型 type 如果是 pygame 游戏中的退出 QUIT 那么就执行 exit() 退出整个程序。
12 游戏素材添加
小媛唔那也可以检测上下左右按键吧这样就可以实现移动了
小C是的不过现在我们需要往这个游戏里面添加背景和角色这些都是图片我们可以通过加载图片资源创建背景和主角对象我们都可以称这些元素为精灵。
小媛精灵好听的名字。
小C你看下面的代码。
import pygamebgpygame.image.load(rE:\2dsrc\src\img\bg.png)
heropygame.image.load(rE:\2dsrc\src\img\hero1.png)
enemypygame.image.load(rE:\2dsrc\src\img\enemy1.png)
enemy_boompygame.image.load(rE:\2dsrc\src\img\enemy1_down1.png)
bulletpygame.image.load(rE:\2dsrc\src\img\bullet1.png)heroX250
heroY680pygame.init()
screenpygame.display.set_mode((600,800))
pygame.display.set_caption(这是一个飞机游戏)while True:screen.blit(bg,(0,0))screen.blit(hero,(heroX,heroY))for event in pygame.event.get():if event.typepygame.QUIT:exit()小C上面的代码 pygame.image.load 就表示使用 pygame 中的 image 工具的 load 功能load 就是加载图片的意思在 load 方法中传入图片的路径就可以了我在这里分别加载了 5 个图片一个是背景图、一个是主角图、一个是敌人图、一个是敌人被击中后的爆炸图、一个是子弹图片。 小媛我电脑上你是放在同样的路径下吧
小C是的如果没有图片可以私聊 bit 哥博主 https://blog.csdn.net/A757291228他会统一发的。
小媛明白。
小C我们接着看 screen.blit(bg,(0,0)) 代码和 screen.blit(hero,(heroX,heroY)) 代码这两句代码都是用 blit 方法blit 方法 是 screen 的功能之一也就是可以在屏幕中画出我们加载的图片blit 的第一个参数是图片参数第二个参数是整个屏幕的 x 和 y 坐标也就是从哪里开始画x 越大越靠右y 越大越靠下。
小媛那为什么我运行了代码后是一片黑屏 小C那是因为我们需要刷新每次循环完我们都需要刷新整个界面否则是不会呈现画完的效果的。你在 while 循环最后加一个代码pygame.display.update()就如下所示。
import pygamebgpygame.image.load(rE:\2dsrc\src\img\bg.png)
heropygame.image.load(rE:\2dsrc\src\img\hero1.png)
enemypygame.image.load(rE:\2dsrc\src\img\enemy1.png)
enemy_boompygame.image.load(rE:\2dsrc\src\img\enemy1_down1.png)
bulletpygame.image.load(rE:\2dsrc\src\img\bullet1.png)heroX250
heroY680pygame.init()
screenpygame.display.set_mode((600,800))
pygame.display.set_caption(这是一个飞机游戏)while True:screen.blit(bg,(0,0))screen.blit(hero,(heroX,heroY))for event in pygame.event.get():if event.typepygame.QUIT:exit()pygame.display.update()小媛出来了耶。 13 控制角色移动
小C那么接下来我们来控制这个飞机左右移动吧。
小媛期待。
小C我们创建一个函数用来检测用户是否按下了上下左右。
import pygamebgpygame.image.load(rE:\2dsrc\src\img\bg.png)
heropygame.image.load(rE:\2dsrc\src\img\hero1.png)
enemypygame.image.load(rE:\2dsrc\src\img\enemy1.png)
enemy_boompygame.image.load(rE:\2dsrc\src\img\enemy1_down1.png)
bulletpygame.image.load(rE:\2dsrc\src\img\bullet1.png)heroX250
heroY680
stepX0 #此部分新增
stepY0 #此部分新增pygame.init()
screenpygame.display.set_mode((600,800))
pygame.display.set_caption(这是一个飞机游戏)def keydown_envent(event,stepX,stepY):#此部分新增if event.key pygame.K_RIGHT:stepX5elif event.key pygame.K_LEFT:stepX-5elif event.key pygame.K_UP:stepY-5elif event.key pygame.K_DOWN:stepY5return stepX,stepYwhile True:heroXheroXstepXheroYheroYstepYscreen.blit(bg,(0,0))screen.blit(hero,(heroX,heroY))for event in pygame.event.get():if event.typepygame.QUIT:exit()if event.typepygame.KEYDOWN:#此部分新增stepX,stepYkeydown_envent(event,stepX,stepY)pygame.display.update()小C以上代码我在新增部分添加了注释主要添加了一个 keydown_envent 方法用来检测按下事件后的处理。我们可以看到在 for 循环事件遍历中使用 if event.typepygame.KEYDOWN: 检测用户是否按下键随后我们通过这个事件传入到 keydown_envent 方法中做处理判断用户按下的是否是右键 K_RIGHT、左键 K_LEFT、上键 K_UP、下键 K_DOWN。如果是右键那么就增加下次绘制图片的 x 坐标值下键就增加 y 坐标值这样依次类推所以在 while 循环中就有了下面这个代码。
heroXheroXstepX
heroYheroYstepY小媛感觉有点像那个在书上画画r案后翻动页码每次看到图都不一样画上去的人物就可以动了。
14 增加敌机
小C是的就是这个原理我们接着添加敌人。
import pygame,randombgpygame.image.load(rE:\2dsrc\src\img\bg.png)
heropygame.image.load(rE:\2dsrc\src\img\hero1.png)
enemypygame.image.load(rE:\2dsrc\src\img\enemy1.png)
enemy_boompygame.image.load(rE:\2dsrc\src\img\enemy1_down1.png)
bulletpygame.image.load(rE:\2dsrc\src\img\bullet1.png)heroX250
heroY680
stepX0
stepY0 enemy_speed2#此部分新增
enemy_objs[]#此部分新增pygame.init()
screenpygame.display.set_mode((600,800))
pygame.display.set_caption(这是一个飞机游戏)def keydown_envent(event,stepX,stepY):if event.key pygame.K_RIGHT:stepX5elif event.key pygame.K_LEFT:stepX-5elif event.key pygame.K_UP:stepY-5elif event.key pygame.K_DOWN:stepY5return stepX,stepYdef enemy_show(enemy_objs,startY-40):#此部分新增if len(enemy_objs)5:while len(enemy_objs)5:enemy_Xrandom.randint(0,500)enemy_pos[enemy_X,startY]screen.blit(enemy,enemy_pos)enemy_objs.append(enemy_pos)else:i0for pos in enemy_objs:screen.blit(enemy,pos)enemy_objs[i][pos[0],pos[1]enemy_speed]ii1return enemy_objswhile True:heroXheroXstepXheroYheroYstepYscreen.blit(bg,(0,0))screen.blit(hero,(heroX,heroY))enemy_objsenemy_show(enemy_objs) #此部分新增for event in pygame.event.get():if event.typepygame.QUIT:exit()if event.typepygame.KEYDOWN:#此部分新增stepX,stepYkeydown_envent(event,stepX,stepY)pygame.display.update()小C以上代码中添加了一个 enemy_show 方法enemy_show 方法传入了一个 enemy_objs 列表用来记录创建的敌人对象enemy_show 方法接收两个参数还有一个是默认的 Y 坐标。在 enemy_show 中如果敌机数量小于 5 个那么就直接使用 while 循环进行创建并且把创建对象的 X 和 Y 值存储到 enemy_objs 列表中之后我们只需要控制每个敌机的位置坐标就可以控制 敌机移动了。
if len(enemy_objs)5:while len(enemy_objs)5:enemy_Xrandom.randint(0,500)enemy_pos[enemy_X,startY]screen.blit(enemy,enemy_pos)enemy_objs.append(enemy_pos)小媛你的意思是控制敌机移动只需要控制记录出现的坐标点进行绘制那么就等于敌机在移动
小C是的。如果已经创建了 5 个 敌机n阿么只需要根据他们的位置坐标进行 y 轴坐标的增加就可以了也就是 enemy_show 方法中 else 部分的内容。
def enemy_show(enemy_objs,startY-40):#此部分新增if len(enemy_objs)5:while len(enemy_objs)5:enemy_Xrandom.randint(0,500)enemy_pos[enemy_X,startY]screen.blit(enemy,enemy_pos)enemy_objs.append(enemy_pos)else:i0for pos in enemy_objs:screen.blit(enemy,pos)enemy_objs[i][pos[0],pos[1]enemy_speed]ii1return enemy_objs小媛唔原来如此那么 enemy_speed 加多少就表示速度了吧我看你在前面定义这个值是 5。
小C是的。你可以运行代码试一试。
小媛敌机下来了呢真棒。
15 加子弹
小C我们现在开始添加子弹吧其实子弹添加也很简单只需要知道我们这个主角的位置然后使子弹在这个位置头部绘制绘制后每次刷新后的距离都 -10 这样子弹就可以飞上去了呢。
小媛是的我感觉会写了。
小C我们接着看代码吧我们设置空格键就是子弹发射按键这个时候我们在事件方法中添加空格事件的响应然后绘制出一个子弹就可以了。
import pygame,randombgpygame.image.load(rE:\2dsrc\src\img\bg.png)
heropygame.image.load(rE:\2dsrc\src\img\hero1.png)
enemypygame.image.load(rE:\2dsrc\src\img\enemy1.png)
enemy_boompygame.image.load(rE:\2dsrc\src\img\enemy1_down1.png)
bulletpygame.image.load(rE:\2dsrc\src\img\bullet1.png)heroX250
heroY680
stepX0
stepY0
bullets_pos[]#此部分新增
enemy_speed2
enemy_objs[]pygame.init()
screenpygame.display.set_mode((600,800))
pygame.display.set_caption(这是一个飞机游戏)def keydown_envent(event,stepX,stepY,hero_pos):bullet_pos[]#此部分新增 if event.key pygame.K_RIGHT:stepX5elif event.key pygame.K_LEFT:stepX-5elif event.key pygame.K_UP:stepY-5elif event.key pygame.K_DOWN:stepY5elif event.key pygame.K_SPACE:#此部分新增bullet_pos[hero_pos[0],hero_pos[1]10]return stepX,stepY,bullet_posdef enemy_show(enemy_objs,startY-40):if len(enemy_objs)5:while len(enemy_objs)5:enemy_Xrandom.randint(0,500)enemy_pos[enemy_X,startY]screen.blit(enemy,enemy_pos)enemy_objs.append(enemy_pos)else:i0for pos in enemy_objs:screen.blit(enemy,pos)enemy_objs[i][pos[0],pos[1]enemy_speed]ii1return enemy_objswhile True:bullet_pos_[]#此部分新增heroXheroXstepXheroYheroYstepYscreen.blit(bg,(0,0))screen.blit(hero,(heroX,heroY))enemy_objsenemy_show(enemy_objs) i0for v in bullets_pos:#此部分新增 bullets_pos[i][v[0],v[1]-10]screen.blit(bullet,(bullets_pos[i][0]45,bullets_pos[i][1]))distance_b[bullets_pos[i][0]45,bullets_pos[i][1]]ii1for event in pygame.event.get():if event.typepygame.QUIT:exit()if event.typepygame.KEYDOWN:#此部分新增stepX,stepY,bullet_pos_keydown_envent(event,stepX,stepY,[heroX,heroY])if len(bullet_pos_)0:bullets_pos.append(bullet_pos_)pygame.display.update()小C我们在响应按键的方法中添加了响应空格的处理我们将记录当前主角所在的目标位置 bullet_pos[hero_pos[0],hero_pos[1]10]然后做为返回值返回返回之后判断 bullet_pos_ 接收值后长度是否大于 1大于则表示已经按下空格则记录在 bullets_pos 列表中之后使用循环遍历每个子弹的位置然后在 Y 轴上减去 一个值即可发射子弹。
i0
for v in bullets_pos:#此部分新增 bullets_pos[i][v[0],v[1]-10]screen.blit(bullet,(bullets_pos[i][0]45,bullets_pos[i][1]))distance_b[bullets_pos[i][0]45,bullets_pos[i][1]]ii1小媛那 45 是啥意思呢
小C因为我们的飞机会占据一定宽度45 是为了保持子弹在飞机头位置中间进行发射。
小媛明白了我的子弹出来了。 16 添加击中摧毁
小C我们接下来开始添加击中摧毁吧。击中摧毁其实就是判断子弹与敌机的距离我们使用欧氏距离就可以了编写一个方法。
def distance(bx,by,ex,ey):abx-exbby-eyreturn math.sqrt(a*ab*b)小媛不懂怎么办。
小C哈哈哈这个问题不是本篇的内容不懂公式的大家搜索一下就可以了或者直接使用这个方法。
小媛问题不大。
小C接着我们在子弹移动时添加距离计算如果子弹移动后与敌机小于一定距离那么就在敌机位置显示出爆炸图片就可以了。
i0
for v in bullets_pos:bullets_pos[i][v[0],v[1]-10]screen.blit(bullet,(bullets_pos[i][0]45,bullets_pos[i][1]))distance_b[bullets_pos[i][0]45,bullets_pos[i][1]]ei0for ep in enemy_objs:#此部分新增 if distance(distance_b[0],distance_b[1],ep[0],ep[1])60:screen.blit(enemy_boom,(ep[0],ep[1]))enemy_objs[ei][random.randint(0,500),-50]eiei1ii1小C其实就是移动后我们去循环每一辆敌机的位置如果距离达到了我们就在那个位置显示爆炸图片并且更改这个位置到初始位置重新掉落。
小媛哈哈哈可以了。 小C那我们这个就做完了其他内容就不说了。
小媛行嘞多谢小C。
小C完整代码如下改动了一下的。
import pygame,random,mathbgpygame.image.load(rE:\2dsrc\src\img\bg.png)
heropygame.image.load(rE:\2dsrc\src\img\hero1.png)
enemypygame.image.load(rE:\2dsrc\src\img\enemy1.png)
enemy_boompygame.image.load(rE:\2dsrc\src\img\enemy1_down1.png)
bulletpygame.image.load(rE:\2dsrc\src\img\bullet1.png)pygame.init() #初始化
screenpygame.display.set_mode((600,800))
pygame.display.set_caption(这是一个飞机游戏)heroX250
heroY680
stepX0
stepY0enemy_speed2
enemy_objs[]
enemy_objs1[]
enemy_objs2[]
enemy_objs3[]
bullets_pos[]
bullet_speed[]def enemy_show(enemy_objs,startY-40):if len(enemy_objs)5:while len(enemy_objs)5:enemy_Xrandom.randint(0,500)enemy_pos[enemy_X,startY]screen.blit(enemy,enemy_pos)enemy_objs.append(enemy_pos)else:i0for pos in enemy_objs:screen.blit(enemy,pos)enemy_objs[i][pos[0],pos[1]enemy_speed]ii1return enemy_objsdef screen_border(X,Y):#左右屏幕if X0:X0elif X500:X500#上下屏幕if Y0:Y0elif Y700:Y700return X,Ydef distance(bx,by,ex,ey):abx-exbby-eyreturn math.sqrt(a*ab*b)def keydown_envent(event,stepX,stepY,hero_pos):bullet_pos[]if event.key pygame.K_RIGHT:stepX5elif event.key pygame.K_LEFT:stepX-5elif event.key pygame.K_UP:stepY-5elif event.key pygame.K_DOWN:stepY5elif event.key pygame.K_SPACE:bullet_pos[hero_pos[0],hero_pos[1]10]print(space:,bullet_pos)return stepX,stepY,bullet_poswhile True:bullet_pos_[]heroXheroXstepXheroYheroYstepYheroX,heroYscreen_border(heroX,heroY)screen.blit(bg,(0,0))screen.blit(hero,(heroX,heroY)) enemy_objsenemy_show(enemy_objs) #enemy_objs1enemy_show(enemy_objs1,-300)#enemy_objs2enemy_show(enemy_objs2,-600)#enemy_objs3enemy_show(enemy_objs3,-900)print(bullets_pos)i0for v in bullets_pos:bullets_pos[i][v[0],v[1]-10]screen.blit(bullet,(bullets_pos[i][0]45,bullets_pos[i][1]))distance_b[bullets_pos[i][0]45,bullets_pos[i][1]]ei0for ep in enemy_objs:if distance(distance_b[0],distance_b[1],ep[0],ep[1])60:print(\n\n\n\n\n\n\n\n\n\n\n\n boom)screen.blit(enemy_boom,(ep[0],ep[1]))enemy_objs[ei][random.randint(0,500),-50]eiei1ii1for event in pygame.event.get():if event.typepygame.QUIT:exit()if event.typepygame.KEYDOWN:stepX,stepY,bullet_pos_keydown_envent(event,stepX,stepY,[heroX,heroY])if len(bullet_pos_)0:bullets_pos.append(bullet_pos_)pygame.display.update()