适用对象:有一定Scratch基础或小学高年级和初中的零起点学生
与非学堂
专注青少年信息技术教育,探讨少儿编程的教与学,交流技巧、分享资源。
1. 游戏与编程
相信没有人会拒绝玩游戏。
伟大的革命家李大钊先生说“要学就学个踏实,要玩就玩个痛快”。今天我们就把玩和学放到一起,既能学又能玩,那就是通过编程。
编程可以有很多入门的方法。
今天我们要给大家讲的是如何用Python编程,用Python这门计算机语言编写一个游戏。
这个单词Python,读起来像是“派神”。大家只要记得,这个Python,它确实非常有派头,非常神就对了!
这里也许你曾经学习过Scratch,也许没有,都没有关系。我们尽量用大家都能明白的话,讲解清楚用Python编写游戏程序到底是怎么一回事儿。
大家说说自己喜欢的游戏吧!
(七嘴八舌)
曹老师也曾经统计过,现在同学们喜欢玩的游戏大概有这样一些:
我的世界(Minecraft)
逃跑吧少年
王者荣耀
……
要是把所有同学们喜欢的游戏都列出来,那么这个列表将会变得非常长。没办法,我们只能把其中最常见、最受欢迎的游戏放在这里。
在这些游戏中,同学们有时可以砰砰射击,有时可以打打杀杀,有时可以驾车,有时可以跳伞,有时可以游泳,有时可以奔跑,有时可以迎救公主,有时可以寻找宝藏,有时可以……
相信玩得厉害的同学都希望有朝一日能设计一款自己的游戏,有没有?
当我们有这样的想法的时候,恭喜大家,你真正晋级了!
比起在游戏里通关晋级,有了这种想法的晋级,更胜一筹。
为什么这么说呢?
因为不知道哪位名人说过,制造和使用工具,是人和动物的本质区别。
这句话在游戏这个行当里,可以这样理解:把游戏看成是我们玩的工具。那能够制造一款游戏,与只能够玩别人做出来的游戏,是有根本不同的。
当你有心要造出来一个东西时,你的思维,你的视角,就不一样了!你将不再是被动地去用这个东西,你将是一个创造者!
老师希望同学们是一个真正的创造者!
为什么这么说呢?因为从远古至今天,人类所取得的一切成就,无一不是创造出来的。没有创造,就没有我们今天的美好生活。
所以咱们这个课程,表面上看,它是教大家学Python的课,实际上,它是一门创作课;表面上看它是一门让大家学习的课,实际上,它是一门鼓励大家在玩中增长知识,在玩中创造未来的课!
来到这门课的同学,不用说,缺的并不是这种认识这种想法,缺少的是一种方法,一种机会。
那咱们这个课,就是要给大家这样的一种机会,教给同学们一种方法,如何把自己的想法,一步一步转化为现实。
其实这个事情并不难,难的是如何开头!
其他的也不多说了。我们直接来想,怎么开始做一个游戏。今天把这个头给大家开了,让大家看到,编写一个游戏程序,也不过如此!
2. 认识Python和Arcade
大家要安装Python和Arcade游戏库。相信现在同学们的电脑上都已经安装好这两样东西了。如果没有安装好的,请看老师之前的视频。
Python是我们编写游戏程序时用的一种特殊的“语言”,有点像英语,但是它里面有很多特殊的“语法”,这些在遇到的时候老师会经常提醒大家。
其实大家不要把“Python语言”想得太复杂,说白了,它就是一种规定计算机如何完成某件事的说明、指令、要求。
我举一个例子。曹老师有个学生,叫小V,他在母亲节当天制作了一个的神秘礼物。这里我给大家展示一下。请搜索视频号 AllyM:母亲节的惊喜#mother's day
大家可以看到,小V同学写在纸片上的话,是不是可以告诉妈妈一步一步应该做什么呀?
其实这种步骤的说明,也可以看作一门特殊的“语言”——用来告诉妈妈应该每一步做什么的,照着做了就能得到相应的结果。
那么如果我们把这个纸片上的话,告诉计算机的话,那么就是一段用“汉语”这种“语言”编写的“程序”了。
只不过我们现在编写的程序基本不是汉语的。并不是说汉语不能用来编程,只是说有其他的“语言”,可以比汉语更能让计算机懂我们的意思。这些“语言”就是计算机语言。
Python就是这些语言中的一种。
而Arcade又是什么呢?Arcade其实是用来帮助我们快速用Python编写游戏程序的一套模板。
这怎么理解呢?语文课上大家写作文,如果把Python对应为“汉语”的话,那么Aracde可以认为是一套优秀的汉语作文模板。
你没有这套模板,就得自己从头到尾写这篇作文的每一细节,有了这个模板,就能非常方便地写出一篇作文了。尽管可能一点中规中矩,但毕竟比自己去照顾每一个细节,完成得要快不知道多少倍。
那我们一开始刚开始学习编程,有这个模板,大家完成游戏程序的速度会更快,所以用模板比不用模板更好些。后面大家都学得炉火纯青了,就可以抛开这个模板,自创一套模板了。
3. 捡金币游戏初体验
现在,我们就真正开始用Python和Arcade来完成一个游戏吧!
当然我们也不能一开始就做一个非常复杂的游戏。饭要一口一口吃,因此老师先以一个简单的游戏来作为例子,讲解如何一步一步实现它!
这个游戏是老师精心挑选的,名字叫做“捡金币”。我们一起来玩吧!
游戏很简单,玩家需要控制角色移到旁边的金币上,角色捡到金币时,游戏成功。
大家是不是感觉太小儿科了!
不要着急!虽然这个游戏非常简单,但是它却是“麻雀虽小,五脏俱全”。
在这个小游戏里,我们有可以操作的角色,有游戏听辅助角色(金币),还有文字显示。
整个游戏就是下面的30行代码。
import arcade
class MyGame(arcade.Window):
def __init__(self):
super().__init__(800,600,"捡金币")
arcade.set_background_color(arcade.color.BLUE)
self.player = arcade.Sprite("me.png",0.5)
self.player.center_x = 400
self.player.center_y = 300
self.coin = arcade.Sprite("coin.png", 0.25)
self.coin.center_x = 100
self.coin.center_y = 100
self.result = "Gaming..."
def on_draw(self):
arcade.start_render()
self.coin.draw()
self.player.draw()
arcade.draw_text(self.result, 10, 20, arcade.color.WHITE, 14)
def on_mouse_motion(self, x, y, dx, dy):
self.player.center_x = x
self.player.center_y = y
def on_update(self, delta_time):
if arcade.check_for_collision(self.player,self.coin):
self.result= "You win!"
window = MyGame()
arcade.run()
我们看着这30行代码,确实有点多对不对。但是老师来告诉大家,怎么看这30行代码。
记得刚才我们说过吗?我们是用一个模板来实现的游戏!模板体现在哪些地方呢?这里老师将每个游戏程序中不变的那些东西都给同学们画出来了。
我们理解代码,不应该一个字一个字地看,而应该一段一段地看,每一段里再一行一行地看。先理解一整段的功能,再逐步细化到每一行的功能。
这里老师来告诉大家,这些段分别是什么意思。
凡是空行的地方,就表示一段结束了。那么如果按这个标准的话,同学说我们的程序一共有多少段?
可以数出来,有7段。有的段只有一行,有的段却有好多行。
每一段是什么意思,什么作用呢?我们大概来看一下。
第一段,import arcade,这个表示告诉计算机,我要用arcade这个游戏库来编程了。
第二段,class MyGame(arcade.Window):
这里是要告诉计算机,我正在设定游戏窗口的内容。
但是这第二段并不完整,后面紧跟着的4段,都用def开头对不?并且前面都还空了4个空格。所以说第二段一直到第六段,其实是一个真正的大段。这个大段表示设定游戏窗口里的内容。
而从第三到第六段,这些以def开头的句子,表示什么意思呢?
def __init__(self):
这一段,表示的是游戏一开始运行时,要处理的一些事情。如果学过Scratch的同学,可以更好地理解了,它是当鼠标点击小绿旗后,真正的游戏代码还没有开始运行前,需要进行的一些初始化设置。
def on_draw(self):
这一段,只要同学们认识这个单词draw,就能知道这一段代码大概的用处了。它是用来在屏幕上画东西,让这些角色、文字显示出来的。
def on_mouse_motion(self, x, y, dx, dy):
这一段,我们这里有三个单词非常关键:on、mouse、motion,它们分别是“当”、“鼠标”、“运动”的意思,因此合起来就是要处理当鼠标在屏幕上运动时需要做什么。
最后一段每七段,
window = MyGame()
arcade.run()
表示把刚才的设置生效,并且让程序运行起来。
总结一下刚才的方法。这段代码虽然只有30行,但是对同学们来说,一下子掌握还是比较困难。不过我们可以提纲挈领,先理解每一段的大概意思、作用,再理解每一段中的。
后面所有的游戏程序,都是用类似今天这节课这样的模板来写的。
同学们看到,在这些代码中,有好多是英文单词。为了真正学会这些内容,咱们一定得知道这些单词才行。
这里为了方便大家理解,老师把重要的单词给大家列在这里了。(列出一段代码中用到的单词,也可以用编程的方法完成哦!以后我们会学到。)
(展示单词表)
import 导入、引用
arcade (一种类型的)游戏
class (编程语言中的)类
my 我的
game 游戏(通称)
window 计算机中的窗口(窗体)
def/define 定义
init/initialize 初始化
self 自身
super 超级、父类
set 设定、设置
background 背景
color 颜色
blue 蓝色
white 白色
player 玩家
sprite 角色精灵
center 中心
coin 金币
result 结果
on 当
draw 绘制、画
start 开始
render 渲染
text 文本
mouse 鼠标
motion 运动
update 更新
delta 希腊字母Δ,一般表示增量、改变量
time 时间
if 如果
check 检查
for 为……目的
collision 碰撞
you 你
win 赢
run 运行
在课前老师给同学们发过了,以后也会这样,每节课需要用到什么单词,老师都会提前几天发给大家,希望同学们能够查一查,背一背,搞懂这些单词的意思。
当然大家一下子记不住那么多单词,也没关系,只要将这个词表放在一旁,老师讲到某个单词的时候你不知道,直接看一看,加深印象,多来这么几次,相信大家都会熟悉起来的!
4. 步步为营
为了让同学们也能写出来刚才的捡金币游戏,我们可以将游戏采用分步的方式实现。
第一步:设置窗口
第二步:显示角色
第三步:让角色动起来
第四步:添加金币
第五步:判断角色是否碰到金币,更新游戏状态
第一步:设置窗口
import arcade
class MyGame(arcade.Window):
def __init__(self):
super().__init__(800,600,"捡金币")
arcade.set_background_color(arcade.color.BLUE)
def on_draw(self):
arcade.start_render()
window = MyGame()
arcade.run()
请同学们跟着老师把上面的代码输入。注意在写的时候,def的前面有四个空格,跟def在同一段里的下面的行,前面有八个空格。这是Python语言的语法规定。
这里的代码仍然分为三个大段:import、class、run三个部分。只不过游戏窗口的部分只有两个def。
我们看代码里,800是窗口的宽,600是窗口的高,"捡金币"是窗口标题的名字。
现在我们运行代码,可以得到一个窗口,背景是蓝色的。
(查看运行图片)
这里老师要让同学们改一个宽1200,高900的窗口,也没有问题吧?
如果要改一下背景的颜色,只需要将BLUE换成你能说出来名字的颜色单词就可以了。注意要大写,比如RED、ORANGE、PINK都没问题。
第二步:显示角色
好,刚才有了窗口的基础了,这里我们接着在上面添加上角色。角色其实是一个图片,这个图片我们要把它放到咱们跟代码在同一个文件夹下才行,名字就叫me.png。
import arcade
class MyGame(arcade.Window):
def __init__(self):
super().__init__(800,600,"捡金币")
arcade.set_background_color(arcade.color.BLUE)
self.player = arcade.Sprite("me.png",0.5)
self.player.center_x = 400
self.player.center_y = 300
def on_draw(self):
arcade.start_render()
self.player.draw()
window = MyGame()
arcade.run()
我们在添加背景颜色后面,加了三行代码,分别表示生成一个角色,用me.png的图片,大小为原图的0.5倍也就是一半,它的x和y坐标分别为400、500。
但这时运行程序仍然不会显示出角色。这是因为在Arcade程序里,任何的角色都需要手动用代码让它显示。这里需要在on_draw下面添加这样一行:self.player.draw()。
有了这一行代码后,再运行,就能看到角色了!
(查看运行图片)
第三步:让角色动起来
刚才的角色是显示出来了,但是还不能动,于是我们要让它动起来。
要达到这个目的,我们需要在on_draw下边新增加一个def。
def on_mouse_motion(self, x, y, dx, dy):
self.player.center_x = x
self.player.center_y = y
注意在写的时候,def 要与上面的def对齐,前面四个空格不能多也不能少。
这段代码就相当于定义了在鼠标运动时,角色的x和y坐标要分别跟着鼠标的x和y坐标走。
运行之后,就能看到效果了。
(查看运行图片)
第四步:添加金币
这时我们用同样的方法,添加金币。
import arcade
class MyGame(arcade.Window):
def __init__(self):
super().__init__(800,600,"捡金币")
arcade.set_background_color(arcade.color.BLUE)
self.player = arcade.Sprite("me.png",0.5)
self.player.center_x = 400
self.player.center_y = 300
self.coin = arcade.Sprite("coin.png", 0.25)
self.coin.center_x = 100
self.coin.center_y = 100
def on_draw(self):
arcade.start_render()
self.player.draw()
self.coin.draw()
def on_mouse_motion(self, x, y, dx, dy):
self.player.center_x = x
self.player.center_y = y
window = MyGame()
arcade.run()
上面添加金币的代码,接在添加玩家的角色代码后。on_draw下面也要使用self.coin.draw()将金币画出来才可以看到。
运行后效果就有了。
(查看运行图片)
第五步:判断角色是否碰到金币,更新游戏状态
这一步我们要判断角色在移动过程中,是否碰到了金币,如果碰到了,就更新一下游戏状态:从“Gaming...”(游戏进行中……)到“You Win!”(你赢了!)。并且这个状态要在屏幕上显示出来。(不设置字体时只能用英文)
在创建角色的代码下面,我们添加游戏结果显示,一开始为Gaming:
self.result = "Gaming..."
要判断角色与金币是否碰到,我们需要添加一个新的def:
def on_update(self, delta_time):
if arcade.check_for_collision(self.player,self.coin):
self.result= "You win!"
有了这一段代码后,就能判断两个角色什么时候碰到了。如果想让self.result中的英语显示出来,还需要在on_draw里用一行代码把它显示出来:
arcade.draw_text(self.result, 10, 20, arcade.color.WHITE, 14)
这里括号中有5个参数,第一个是要显示的内容,第二个是要显示位置的x坐标,第三个是要显示位置的y坐标,第四个是显示的文字用什么颜色,第五个是字体大小。
这时完整的代码如下:
import arcade
class MyGame(arcade.Window):
def __init__(self):
super().__init__(800,600,"捡金币")
arcade.set_background_color(arcade.color.BLUE)
self.player = arcade.Sprite("me.png",0.5)
self.player.center_x = 400
self.player.center_y = 300
self.coin = arcade.Sprite("coin.png", 0.25)
self.coin.center_x = 100
self.coin.center_y = 100
self.result = "Gaming..."
def on_draw(self):
arcade.start_render()
self.coin.draw()
self.player.draw()
arcade.draw_text(self.result, 10, 20, arcade.color.WHITE, 14)
def on_mouse_motion(self, x, y, dx, dy):
self.player.center_x = x
self.player.center_y = y
def on_update(self, delta_time):
if arcade.check_for_collision(self.player,self.coin):
self.result= "You win!"
window = MyGame()
arcade.run()
点击运行,程序出来的效果就跟我们一开始展示的一样了。
(查看运行图片)
5. 结语
今天课程的主要目的是让同学们知道Python编程是怎么一回事儿。
大家照着老师的代码,写出了自己的游戏,非常了不起!虽然很多地方还似懂非懂,但没关系,后面我们会一点一点地给大家细化。
老师不希望同学们一开始就进入太多的细节不能自拔,慢慢来!
为了学好Python,建议大家一定要下功夫把打字的速度提高,把每节课提前发的英语单词表拼写会,搞懂意思。
好,咱们下次课再见!
参考资料:
2. 建议收藏!Scratch与Python Arcade对比整理,解锁Python入门正确姿势
3. Python Arcade Library官网:https://arcade.academy/
— OVER —
与非学堂
专注青少年信息技术教育,探讨少儿编程的教与学,交流技巧、分享资源。
公众号
公众号对话框回复「HELP」更多精彩
喜欢就请「分享」「点赞」「在看」吧!