适用对象:有一定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 arcadeclass 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 = 400self.player.center_y = 300self.coin  = arcade.Sprite("coin.png", 0.25)self.coin.center_x = 100self.coin.center_y = 100self.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 = xself.player.center_y = ydef 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 arcadeclass 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 arcadeclass 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 = 400self.player.center_y = 300def 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 arcadeclass 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 = 400self.player.center_y = 300self.coin  = arcade.Sprite("coin.png", 0.25)self.coin.center_x = 100self.coin.center_y = 100def 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 = xself.player.center_y = ywindow = 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 arcadeclass 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 = 400self.player.center_y = 300self.coin  = arcade.Sprite("coin.png", 0.25)self.coin.center_x = 100self.coin.center_y = 100self.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 = xself.player.center_y = ydef 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,建议大家一定要下功夫把打字的速度提高,把每节课提前发的英语单词表拼写会,搞懂意思。

好,咱们下次课再见!

参考资料:

1. Python Arcade游戏库特性介绍

2. 建议收藏!Scratch与Python Arcade对比整理,解锁Python入门正确姿势

3. Python Arcade Library官网:https://arcade.academy/

— OVER —

与非学堂

专注青少年信息技术教育,探讨少儿编程的教与学,交流技巧、分享资源。

公众号

一份自家广告,长期有效|咨询&合作


公众号对话框回复「HELP」更多精彩

喜欢就请「分享「点赞「在看」吧!

Python编程入门之Arcade游戏编程(一)相关推荐

  1. python游戏编程入门免费_python游戏编程入门 python游戏编程入门课

    python游戏编程入门 python游戏编程入门课 什么是python游戏编程入门?首先我们需要认识什么是Python Python既是一个软件工具包,也是一种语言.Python软件包包含了一个名为 ...

  2. python游戏编程入门源代码_python游戏编程入门源代码

    [实例简介] <Python游戏编程入门>的源代码,作者Jonathan S.Harbour 很好的资源,希望对学习python的同学有帮助,代码都可以运行 [实例截图] [核心代码] p ...

  3. python编程入门视频推荐_Python编程入门2021攻略,书籍推荐,视频推荐,每天更新...

    写这篇文章的初衷 2018年我大学毕业,和很多人一样.大学里的世界,我也是整天LOL.打了4年,确还只是个黄金守门员.恋爱也想都不敢想.不过,话说回来,我拿了三年的奖学金.真的不是因为我学习认真,而是 ...

  4. python游戏编程快速上手pdf_Python游戏编程快速上手 (斯维加特著) 中文pdf完整版[18MB]...

    Python是一种高级程序设计语言,因其简洁.易读及可扩展性日渐成为程序设计领域备受推崇的语言.Python游戏编程快速上手通过编写一个个小巧.有趣的游戏来教授Python编程,并且采用直接展示了游戏 ...

  5. Python程序设计入门32道基础编程题目与参考代码

    声明 本文仅在CSDN发布,其他均为盗版.请支持正版! 正版链接: https://blog.csdn.net/meenr/article/details/107095894 目录 概述 1.简单数值 ...

  6. python3编程入门解压码_Python编程入门(第3版) PDF|百度网盘下载内附提取码

    Python编程入门(第3版)是图文并茂的Python学习参考书,书中并不包含深奥的理论或者高级应用,而是以大量来自实战的例子.屏幕图和详细的解释,用通俗易懂的语言结合常见任务,对Python的各项基 ...

  7. pythonguitkinter编程入门_Python Tkinter GUI编程入门介绍

    一.Tkinter介绍 Tkinter是一个python模块,是一个调用Tcl/Tk的接口,它是一个跨平台的脚本图形界面接口.Tkinter不是唯一的python图形编程接口,但是是其中比较流行的一个 ...

  8. 电脑编程入门自学java_电脑编程入门自学Java指南

    随着Java近些年来的强劲发展,想要转行学习Java的初学者也越来越多了.然而,入门自学Java并不是一件轻松的事情.众所周知,万事开头难,尤其是没有编程语言基础的学习者,不仅仅需要付出更多的心血和汗 ...

  9. python 从入门到实践_Python编程从入门到实践日记Day15

    Python编程从入门到实践日记Day15 第5章 字典(三) 1.使用字典(三) -由类似对象组成的字典 在前面的示例中,字典存储的是一个对象(游戏中的一个外星人)的多种信息,但你也可以使用字典来存 ...

最新文章

  1. 基于SPI的数据报过滤原理与实现
  2. 程序员编程艺术:第二章、字符串是否包含问题
  3. centos7安装DHCP服务器
  4. PAT乙类1013 数素数 (20 分)
  5. 国外经典!架构师必备:《MongoDB实战》第2版
  6. XJOI 3866 写什么名字好呢
  7. 李宏毅机器学习homework0
  8. pd 生成mysql数据库sql时加上备注
  9. Python破解wifi密码
  10. python统计代码行数_使用Python简单快速实现统计代码行数
  11. 软件工程毕设项目 - 基于SSM的毕业设计管理系统(含源码+论文)
  12. Python 调用JSON接口实例
  13. HTTP报文(这篇讲得比较详细)
  14. linux maven yum安装,linux下yum安装maven
  15. ChatGPT,背后的核心是什么?
  16. 西医综合记忆手册(太强了,这帮狂人。真败给他们了~~~)
  17. HotSpot JVM -- 深度好文
  18. Java程序员高效学习的六个中肯建议
  19. 谈谈wxHOOK为什么会限制
  20. python图形界面设计代码_(八)Python 图形化界面设计

热门文章

  1. 基于微信小程序的短视频管理系统
  2. 【我上岸了】干了两年外包的我拿到阿里offer了,在此总结一下我从外包到阿里的经验吧
  3. 虚函数、纯虚函数、虚继承、多继承
  4. 2022中国眼博会,山东眼健康展,视力矫正仪器展,护眼产品展
  5. (软考高级)信息系统项目管理师过关经验
  6. 08 | QPaint绘图类
  7. Android 耳机驱动知识
  8. android10.0(Q) Launcher3 去掉抽屉
  9. 域名系统就是域名服务器吗,域名系统五个服务器有什么区别吗
  10. 13. Redis底层实现 List