当前课程知识点:Python 交互式程序设计导论 >  第4周 >  B 课程视频(键盘控制) >  “桌上冰球”游戏

返回《Python 交互式程序设计导论》慕课在线视频课程列表

“桌上冰球”游戏在线视频

“桌上冰球”游戏

下一节:游戏说明

返回《Python 交互式程序设计导论》慕课在线视频列表

“桌上冰球”游戏课程教案、知识点、字幕

Hi,同学们,大家好

欢迎来到python交互式程序设计导论mooc课堂

这一讲呢,给大家介绍第四周的游戏项目,桌上冰球

好的,桌上冰球呢是欧美年轻人特别喜欢玩的一种游戏

甚至每年都有专门的世锦赛,举行这个比赛

下面可以看一下在这个比赛场面

它这个游戏是怎么玩的

好了,我们来看一下如何来完成这个项目

首先,打开pycharm

然后呢,把我们给你提供的项目模板拷贝过来

建一个自己的python程序文件

拷贝过来以后我们看到提供的这些代码

大家先读一下

首先要导入四个python的包

第一个simpleguitk,第二个random

第三个math,第四个sleep

紧接着我们已经给大家提供了这些全局变量

下面看一下这些全局变量它的含义

首先是画板的宽度和高度

接下来是冰球的半径,40个像素

然后是球槌的半径

我们这个游戏当中有两个球槌

一个是由计算机来控制

一个是由玩家来控制

然后是桌边的宽度

下面是球门的半径

两边各有一个球门,左边和右边

然后是我们这个冰球的初始位置和初始速度

我们开始把它设成在画板的正中央

初始速度呢,是X轴和Y轴方向都是0

紧接着是第一个球槌

就是由计算机控制的球槌

在左侧,它的角度、角速度

注意这个角度指的是从画板的最左侧的正中央作为原点和这个原点构成角度

当然,角速度是指旋转,按这个原点作为起点它的旋转的速度

第三个呢是左侧球槌的线速度

就是由X分量和Y分量构成的一个速度

以及左侧球槌现在所在的位置

在我们程序运行的时候它的位置

它是在运动的

当然也是由X轴和Y轴,两个分量构成的

同样右侧的球槌,就是由玩家来控制的

也有这四个变量来决定它的各种各样的参数

然后我们有计算机得分和玩家得分的两个记录分值

然后还有一个变量来表示一局比赛、一场比赛是否结束

接下来,我们给大家提供了一些图片资源和音效资源

其中有球桌的图片,有冰球的图片,有球槌的图片

然后呢,还有0到7数字图片

这是用来计分用的,显示得分用的

我们把它放在一个列表里面

还有四个音效文件

一个是冰球和边框或者是和冰球发生碰撞以后发出的声音

还有一个是进球了以后发出的声音

还有一个是游戏结束,玩家失败了还要发出的声音

还有一个游戏结束,但是玩家赢了要发出的声音

好,总共这么些声音资源还有上面的图片资源大家可以熟悉一下

剩下的一些辅助函数我们在碰撞与检查那一讲里头

这个distance()函数是给大家讲过的

好,检查碰撞我们单独设计了一个函数来进行各种各样的一些检测碰撞

首先,玩家是不是进球了

就是球进了左边的门

计算机进球,那就球进了右边的门

然后是冰球碰撞了右壁,冰球碰撞了左壁

碰撞了下壁,碰撞了上壁

这些判断,这四种情况都要发生反弹

同时冰球和计算机控制的球槌发生了碰撞以后也要反弹

这个有点像我们在碰撞与检查中两个蓝球、红球发生碰撞的情况

一样,冰球和玩家的球槌发生碰撞以后也要按弹性碰撞的规则进行反射

一旦发生了上述碰撞,就这六种情况的碰撞

我们需要播放碰撞的音效

这个函数呢,是用来每一局开始

就是游戏第一次开始和我们点击重新开始这个按钮以后

让我们的程序生成一个从桌面正中央发出的一个冰球

new_game()这个函数呢 用来初始化全局变量

绘制函数,也就是屏幕刷新事件处理函数

完成整个游戏界面当中所有可控对象的绘制

键盘事件,我们有一个按下键盘和释放键事件来控制右侧球槌它是向上运动还是向下运动

当然沿着球门的弧线来运动

好,剩下的是注册事件处理函数,创建窗口

启动游戏的这些代码

好,首先看看怎么把这个桌面绘制出来

绘制桌面,好

可以直接用我们加载过来的图片绘制这个桌面

看一下效果

好,桌面就完全绘制好了

整个这个球门、球门线都已经绘制好了

当然可能有些同学用mac计算机

这个图片比较大,加载以后游戏的运行速度会慢一些

我们当然也可以手工来绘制这个桌面,看看怎么来绘制

手工来绘制这个桌面我们用draw_table()这个函数来绘制桌面

当然这个函数现在是不存在的,需要去定义它

前面定义一个绘制桌面的函数

这四行代码也可以直接放在这里,是一样的

看一看我们怎么来绘制这个桌面的

首先绘制一个多边形

实际上是绘制一个长方形

这个长方形的四个角的坐标给它以后

四个角的坐标从最左上角开始0,0

右边的角,右上角是画板的宽度

X轴画板的宽度,Y轴是0

右下角的坐标是画板的宽度作为X坐标,Y坐标是画板的高度

左下角的坐标,X轴是0,Y轴是画板的高度

然后我们线宽用20个像素,线的颜色是蓝色

中间填充的颜色是青色

好,运行一下

好,这样也可以绘制出一个桌面来

好,下面看如何来绘制这个球槌

有两个球槌,我们要求初始位置是在水平位置上呢是在球门弧线的顶部

两个球门弧线的顶部

垂直位置是在冰球桌面的正中央

也就是一个在这个位置,一个在这个位置

好,怎么来绘制

好,绘制左侧的球槌

我们用的是draw_image(),图像的对象是malle

就是球槌这个图片,前面定义过,球槌的图片

然后呢,这个图片它的大小是94乘94像素

因此它的正中央是47乘47像素

它的位置呢是我们在这个变量里声明过,这个变量就是左侧球槌的位置

看看左侧球槌的位置,左侧球槌的位置X坐标是球门的半径

X往右移200个像素,因为半径是200

而Y轴是画布的正中央

所以我们现在画出来以后它应该在什么位置大家应该也可以理解是吧

注意看一下,好,这是我们期望的位置,现在当然是静止的

同时可以把右边的球槌也画出来

也在右边球门弧的最左边正中央的位置

好,我们来绘制右侧的球槌

注意看右侧球槌,一样,图片还是同一个图片,大小依然是94乘94

当然这个图片原始的中心还是47乘47这个位置

但是位置我们用的是第二个球槌的位置

后面是图片在画板上画的大小,画板画的大小是它的半径乘以2

就是直径的位置,是正方形的

注意,第二个球槌它的位置我们前面怎么定义的,看一下

第二个球槌,X轴是画板的宽度减去球门的半径

Y轴依然是画板的高度除以二

现在运行,上下左右运动

如何让左边的球槌沿着球门弧线上下运动呢,我们来看

首先,在这个屏幕刷新函数里头

每调用一次,对它的角度进行更新

按照角速度来更新

角速度我们一直到前面定义过,是1度,每次更新1度

Pi是180,除以180,那就是1度

但仅仅更新了角度,我们需要的是线速度

仅仅更新了角度,这是没法来计算它的位置的

那么它的位置实际上发生的变化我们怎么来计算呢

当角度发射变化以后,左侧球槌的X坐标

我们可以用角度的cos,乘上半径

而左侧球槌的Y坐标,我们可以用这个公式来计算

就是画板高度的一半,减去角度的sin值乘上球门的半径

好,下面我们运行,看效果

好,它开始逆时针,顺着球门弧所形成的圆,进行运行

当然,这没有完全满足我们的需要

我们的要求是球槌逆时钟运行碰到桌边以后就开始顺时钟运行

在碰到下面的桌边以后又开始逆时钟运行

总之,这个左边的球槌不应该运行出我们的画板

好,怎么样做到这一点呢

需要在我们计算位置之前做一个判断

就是当角速度大于0,也就是逆时钟运转的时候

并且这个角度已经超过了90度减17

90度减17指的是运行到了上边的桌边了

这时候让角速度取反

原来逆时钟运转,现在顺时钟运转

同样如果往下运转,已经是顺时钟运转的

同时这个角速度已经超过了-90度,-90也就是270度

也就是碰到了下边的桌边,角速度也要取反

原来是正,现在就要变成负

好,现在来看这个效果

注意看,碰到上面就会回来,碰到下面就会回来

好,这样左边的这个,计算机控制的球槌就已经开始自动运转了

好,下面我们看一看,当我们有冰球开始在这个桌面上运行的时候

碰到四壁反弹,这个我们上一讲已经讲过

碰到运动的球槌也会发生弹性碰撞

如何来计算和球槌碰撞以后新的速度它应该朝哪个方向以多快的速度去运行

怎么来计算这个东西

为了实现这样一个计算,我们首先得回顾一下上一讲讲的内容

看一下,这是正弦函数和余弦函数在不同角度情况下它的值的变化情况

因为我们计算速度也会用到正弦和余弦

好,现在来看看这幅图

好,我们想用这个圆的右半部分

也就是KBF构成的这半个圆来表示左侧的球门弧

当然也可以用KGF,就是左侧的这半个圆来代表右侧的球门弧

就是玩家所把守的球门弧

好,我们假设计算机所控制的冰球槌以固定的速度在运动

这个速度呢,就是mallet1_angle_vel角速度

以这个角速度从H点运行到B点

现在在这个时候如果冰球按照箭头所指的方向运动过来

并且和球槌发生了碰撞

我们想计算碰撞后冰球的运动方向和速度

怎么来做到这一点,好,看下面的公式

V1’是碰撞后冰球的速度

V1是碰撞前冰球的速度

也就是碰撞的那一霎那间冰球的速度

我们已经知道V1的速度

就是冰球它在碰撞的那一霎那间的运动速度我们是知道的

为了计算碰撞后的速度

我们得知道冰球和球槌的质量

这上面m2是球槌的质量,m1是冰球的质量

由于球槌在真实的游戏当中,是由人手抓着它的

所以我们可以认为球槌的质量远大于冰球的质量

因此这里的m1就可以小到忽略不计

如果把它用0来代替

那么就是2*m2/m2,因此这个系数就是2

好的,为了计算冰球碰撞后的速度

我们要知道V1,也就是碰撞那一霎那间冰球的速度

这个是已经知道的

V2是碰撞那一霎那间,球槌的速度,这个我们现在是不知道的

还有X1是碰撞的那一霎那间冰球的圆心坐标,这个是知道的

X2是碰撞的那一霎那间球槌它的圆心的坐标,这个也是已知的

好,现在就是要计算这个V2,就是在碰撞的那一霎那间球槌的速度

如何来计算碰撞的那一霎那间球槌的速度呢

好,首先我们来看看

在碰撞的这一霎那间我们知道球槌它的角速度

通过这个角速度,可以看看由OBA构成的这个三角形

刚好这个锐角就是角速度,而OBA这个角度是直角

现在要计算AB,我们可以直接用哪个公式来计算呢

可以用tan,tan这个角度就等于直边比这个直边

而AB是我们要求的,OB刚好是圆的半径

圆的半径我们是知道的,就是球门弧的半径我们也是知道的

所以AB,这个碰撞这个时候它的速度,AB,speed等于AB,可以用tan来计算

这个很简单,能够计算出来

但是这个速度呢,是切线方向的速度

我们要把它投影到X轴上

还要投影到Y轴上,形成球槌的它的速度

X分量和Y分量

好,也就是AC和CB

现在要计算AC和CB

AB我们是已经知道的,因此要计算θ,θ如何来计算呢

我们可以把BA这个线段延长到和X轴相交的位置

同时把BC这个线段延长也到和X轴相交的位置,是E点

现在构成的三角形EDB,这个三角形

这里出现的θ和我们要求的θ是相等的

我们要计算这个θ,现在直接计算这个θ,也计算不出来

但是我们可以计算BOD这个角

BOD这个角怎么来计算呢

因为我们知道碰撞那一霎那间球槌它的位置

也就是X坐标和Y坐标

也就是知道OE,这是它碰撞那一霎那间X坐标

也知道它的Y坐标,碰撞那一霎那间的BE

因此我们OBE这个角度可以用atan来计算

为什么用画布的高度除2减去它的位置的Y轴呢

那是因为我们想把坐标下移到O点

也就是把整个坐标下移到球门弧的正中央,原点的那个位置

X方向上并不需要移动

因为X方向就是从0开始向右的

这样我们就计算出来BOE这个角度

有了BOE这个角度,θ和它的关系是什么呢

θ加BOE等于90度,因为这边是90度

那这两个加起来是90度

所以θ就可以等于90度减BOE

我们θ计算出来了,有了θ我就可以计算

AB是知道的,θ是知道的,现在当然可以计算AC和BC

这个就很简单了

AC等于,已经知道的AB乘上cosθ

AB是速度,一样的,CB等于速度乘上sinθ

这样我们就分别计算出了碰撞那一霎那间球槌的X方向速度和Y方向的速度

好的,现在有了这些值,我们就带到下面这个公式

就可以计算出碰撞以后冰球它的运动速度,X分量和Y的分量

下面这个公式要不要计算呢,就不需要计算了

也就是碰撞以后球槌它的速度要不要计算

我们是不需要计算的

因为球槌的质量远大于冰球的质量

因此发生碰撞以后我们认为球槌的速度不受影响

有了这些知识呢,我们想这个游戏呢,大家就没有问题,设计起来更熟

好,下面我们看一看最终完成的程序它的运行效果

好了,非常有趣的程序

这一讲呢,我们就讲到这里,咱们下次再见

Python 交互式程序设计导论课程列表:

第0周

-课程简介

--课程简介

-A 课程视频(算数操作符及表达式)

--绪论

--Python交互式解释器使用方法

--PyCharm集成开发环境介绍

--算数操作符及表达式

-B 课程视频(变量及赋值)

--变量

--项目提交

--“我喜欢Python”热身小项目

-C 辅助视频(计算机结构、Python开发环境安装)

--Windows平台安装Python开发环境

--Mac平台安装Python开发环境

-D 辅助视频(如何提交项目)

--项目提交

-第0周--小测验

-本周项目:"我喜欢Python"

--项目发布、完成、提交及评分流程

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

--项目提交

第1周

-A 课程视频(函数)

--函数

--其它操作符

--随机函数

-B 课程视频(逻辑及表达式)

--逻辑值和比较

--条件

--编程技巧

--“老虎杠子鸡虫”游戏

-第1周--小测验

-本周项目:“老虎杠子鸡虫”游戏

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

第2周

-A 课程视频(Python交互式应用)

--事件驱动编程

--事件可视化跟踪执行

--SimpleGUITk

--按钮

-B 课程视频(输入框、全局变量)

--输入框

--局部变量和全局变量

--编程技巧

--“猫咪藏在哪个房间”游戏

-第2周--小测验A

-第2周--小测验B

-本周项目:猫咪藏在哪个房间

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

第3周

-A 课程视频(画布绘图)

--画布和图形绘制

--字符串处理

--绘图和计时器可视化跟踪执行

--图片和音效

-B 课程视频(计时器)

--计时器

--交互式绘图

--“神奇时钟”游戏

--编程技巧

-第3周--小测验A

-第3周--小测验B

-本周项目:“神奇时钟”

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

第4周

-A 课程视频(列表)

--列表

--键盘输入

--列表及变化可视化跟踪执行

--碰撞和反射

-B 课程视频(键盘控制)

--速度控制

--运动

--编程技巧

--“桌上冰球”游戏

-第4周--小测验A

-第4周--小测验B

-本周项目:“桌上冰球”游戏

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

第5周

-A 课程视频(鼠标输入、列表进阶)

--鼠标输入

--Video

--Video

--Video

-B 课程视频(字典和图片)

--Video

--Video

--Video

--Video

-第5周--小测验A

-第5周--小测验B

-本周项目:“世界杯八强连连看”

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

第6周

-A 课程视频(类)

--面向对象编程(类和对象入门)

--面向对象编程(类和对象进阶)

--对象可视化跟踪执行

--华容道中的类

-B 课程视频(平铺图片)

--平铺图片

--理解对象

--编程技巧

--“华容道”游戏

-第6周--小测验A

-第6周--小测验B

-本周项目:“华容道”游戏

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

第7周

-A 课程视频(类进阶及文件操作)

--集合

--文件操作

--文字块类

--处理停止的文字块

-B 课程视频(游戏状态控制)

--游戏记分规则

--游戏结束的条件及处理

--编程技巧

--“决战三字经”游戏

-第7周--小测验A

-第7周--小测验B

-本周项目:决战三字经

--游戏说明

--程序说明

--编程步骤

--评分标准

--项目模板

第8周

-A、课程视屏(精灵集合)

--Video

--精灵类

--战士类

--编程技巧

-B、课程视屏(动画)

--精灵碰撞

--精灵动画

--编程技巧

--保卫家园游戏

-第8周--小测验

-本周项目:守卫家园

--游戏说明

--程序说明

--编程步骤

--评分标准

--项目模板

“桌上冰球”游戏笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。