找回密码
 立即注册
搜索
热搜: 活动 交友
查看: 955|回复: 10

中A:ppball项目

[复制链接]

27

主题

73

回帖

420

积分

超级版主

积分
420
发表于 3-13-2025 21:34:25 | 显示全部楼层 |阅读模式
本帖最后由 liuyi 于 3-13-2025 21:55 编辑

Pong是人类最早的电子游戏,是Nolan Bushnell于1972年设计的(软件加硬件)
Pong就说美式英语乒乓球,英国人说table tennis,显然我们翻译的美语哈哈



甚至因此他成立了人类第一个电子游戏公司:Atari雅达利


然后呢

这个公司的第40名员工是上图这位先生

后来他拉着他的好伙伴做了Pong的升级版:打砖块(上图)

再后来和这位好伙伴Stephen Gary Wozniak创办了苹果公司


我们中A的核心项目ppball,就是向经典致敬的一款游戏


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

27

主题

73

回帖

420

积分

超级版主

积分
420
 楼主| 发表于 3-13-2025 21:54:13 | 显示全部楼层
本帖最后由 liuyi 于 3-15-2025 12:36 编辑

ppball V0.8的代码看着挺长,其实不长。
因为绝大部分代码是基于初级班最后一棵的Animation程序,所以本质上是复习。



上面是代码,虽然看着多,但其实大部分甚至可以直接从初级班程序中直接copy,尤其第一个函数可以一点不改。
作业:
现在ball是有顺时针旋转效果,请想办法让ball旋转的方向和水平运动方向匹配:
如果spdX > 0, ball向右,那么顺时针旋转
如果spdX < 0, ball向左,那么逆时针旋转
提示:顺时针旋转效果就是当前每次绘制ball的时候,actList的下标是012301230123......
如果要逆时针,那就应该是321032103210......

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

27

主题

73

回帖

420

积分

超级版主

积分
420
 楼主| 发表于 3-20-2025 13:16:22 | 显示全部楼层
本帖最后由 liuyi 于 4-3-2025 21:23 编辑



from V0.8 to V0.9
请一定关注两段代码的异同
比如那个画点阵的函数,一点都没改
但是每个小球的字符串点阵,结尾的赋值代码,稍微有改动
还有很多细节.....代码在下面





V0.9OK啦

然后就可以向V1.0进发啦
V1.0算正式版,那就一定可以接球

请自己想办法完成:就写好ball.collide函数里的if语句即可

当前这个if语句里还没写具体条件,永远都是False,条件永远不成立,当然就永远接不到球......
所以,请认真理解ppt中的内容,理解”游戏里的各种判断,主要就是对坐标的计算和判断”


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

27

主题

73

回帖

420

积分

超级版主

积分
420
 楼主| 发表于 3-28-2025 13:09:06 | 显示全部楼层
ppball V1.0

V0.9~1.0,增加的是碰撞处理,具体在方法函数ball.collide的if中添加
在这个函数中,self就是ball
所以是两个矩形之间的“是否互相碰上”的判断:
self.x, self.y, self.w, self.h
pad.x, pad.y, pad.w, pad.h
矩形4元组(x,y,w,h)的含义分别是:左上角坐标(x,y), 矩形宽度w,矩形高度h
注意计算机坐标系左上角(0,0), y轴向下。

但是具体做游戏的时候,要考虑到ball的spdX,因为比如spdX = 2, 那么上一秒还有距离1,下一秒又重叠了1,永远没有“紧挨着”的状态。
考虑到实现“球拍击球”功能后,如果没有接住球,还要增加“新开一局”功能,都在V1.0中实现。
具体代码:

注意增加了碰撞精度ACCURACY变量,意思是:如果ball的右侧与pad的左侧具体在ACCURACY之内,就算打到。碰撞暂定为2,这个数值与spdX的最大值有关。
函数set_new_ball在没接住球,“死球”后调用。


ball.collide中的碰撞检测,坐标判断,注意考虑了ACCURACY


键盘event处理,增加“空格键重玩”。

这样ppball V1.0就OK啦!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

27

主题

73

回帖

420

积分

超级版主

积分
420
 楼主| 发表于 3-28-2025 13:27:10 | 显示全部楼层
本帖最后由 liuyi 于 3-28-2025 14:55 编辑

ppball V1.1
首先,请先做好版本管理:
*建立本项目专用文件夹ppball,new folder \ppball
*copy ppball V1.0 python file to folder \ppball
*new file ppball V1.1,文件名和注释都写清楚V1.1
*然后,我们在V1.0代码的基础上做V1.1

在V1.1版本里,我们做两件事:
1、重力引擎,物理学来啦!
2、音效、文字。
先来重力引擎吧
从物理学角度来讲:需要引入重力加速度acceleration of gravity

L7的G= 0.01, G就是重力加速度
为什么要用大写字母呢?因为编程的世界里,纯大写字母的变量表明“这是个常量”
为什么是0.01(不是9.8)呢?因为这是个科幻世界呀,这里的物理量标准不是meter、second,而是pixel, FPS......
先用0.01吧,等你程序OK了,物理学掌握了,再自己修改着玩吧
SPEED_Y_MAX = 3, 意味着ball的Y向速度有上限。为什么有上限呢?因为雨滴从10000米高空落地也不会砸伤人,对吧


这些代码,其实就是ball.move里增加3句:
单位时间内速度的变化就是加速度:  self.spdY += G
Y向速度要有上限:if self.spdY > SPEED_Y_MAX: #add in V1.1
                                 self.spdY = SPEED_Y_MAX
注意,原有的:self.y += self.spdY 还在

现在运行程序试试看,能不能看到小球在空中划出抛物线?
发现了吗,只是增加了一个加法:spdY += G, 就画出了曲线!


下一步,就是把V1.1做完整:音效和文字
首先,非常重要,请再次确定,你有本项目专用的文件夹,folder \ppball
因为,每个project,都需要一个folder,就像Finger和Piano,那么ppball也不例外
以后,每一个新版本,new version,都是new file,从上一个version中增加、修改代码而来。
这样,就不会出现“我想增加功能,功能没加上,老代码也不正常了”,也不会出现“老师要增加的代码是在上一个版本基础上,但是和我现在的代码差别很大,找不到地方!”,等等情况

下载音效包pong.zip,里面有一堆音效
然后去找一个font文件copy到ppbal的folder里,可以直接用Finger项目里的simkai.ttf,更欢迎用自己喜欢的font。Windows的Font folder位置是:c:\windows\fonts\,Mac的请同学自己找,文件copy过来就可以
然后就是代码啦

增加函数RT_show_txt,这个函数看着眼熟吗?就是Finger里用过的


在主程序的while True前增加声音和字体的初始化,请先确保这些文件与Python程序文件在同一个folder


在draw_filed里增加一句


在ball的类定义里,ball.move中碰到挡板用pong2声音,ball.collide中接到球用pong4声音
还有几个声音留着以后备用。


V1.1就OK啦

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

27

主题

73

回帖

420

积分

超级版主

积分
420
 楼主| 发表于 4-3-2025 19:15:12 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

27

主题

73

回帖

420

积分

超级版主

积分
420
 楼主| 发表于 4-4-2025 10:20:45 | 显示全部楼层


先声明:这个V1.1a是一个“分支版本”,也就是说,我们的目的是在V1.1基础上做尝试,未来的正式版本并不含有这个“多小球”。
按照版本管理规则:new file,在V1.1基础上生成V1.1a的文件,文件名和程序开头的注释,都要说清楚。
有了面向对象,同学们可以看到,只有一套类定义class的代码,但是无论bList里有多少小球,都只添加少量代码,并且工作量完全一样。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

27

主题

73

回帖

420

积分

超级版主

积分
420
 楼主| 发表于 4-4-2025 10:42:09 | 显示全部楼层


游戏要有专业度,任何一款动作游戏,为了有“手感”,都必须在更多的地方依据物理学原理,比如引入“加速度”,因为“力是改变物体运动状态的原因”,而“力产生的是加速度,不是直接产生速度”,必须有一个从静止到慢到快的过程。
这就是ppball V1.2要做的事,球拍引入加速度,运动的时候有从静止到慢到快的过程,球拍还有摩擦系数,有摩擦力作用于小球上。这样就可以“微操”了。

首先,版本说明要做好


paddle的类定义新内容
ball.collide中,pad的速度会按照摩擦系数传递给ball


while True中的键盘操作,也要添加代码。

现在试试,移动球拍的时候,是不是更有手感?是不是可以精确地让球拍以某个速度“微操”击打小球?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

27

主题

73

回帖

420

积分

超级版主

积分
420
 楼主| 发表于 7 天前 | 显示全部楼层
本帖最后由 liuyi 于 4-5-2025 09:27 编辑




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

27

主题

73

回帖

420

积分

超级版主

积分
420
 楼主| 发表于 7 天前 | 显示全部楼层
#world cup 2022
import random

teamList = []
teamList.append(['卡塔尔', '巴西', '比利时', '法国',
                 '阿根廷', '英格兰', '西班牙', '葡萄牙'])
teamList.append(['墨西哥', '荷兰', '丹麦', '德国',
                 '乌拉圭', '瑞士', '美国', '克罗地亚'])
teamList.append(['塞内加尔', '伊朗', '日本', '摩洛哥',
                 '塞尔维亚', '波兰', '韩国', '突尼斯'])
teamList.append(['喀麦隆', '加拿大', '厄瓜多尔', '沙特',
                 '加纳', '澳大利亚', '哥斯达黎加', '威尔士'])


#world cup 2022
import random

teamList = []
teamList.append(['China', 'Brazil', 'Belgium', 'France',
                 'Argentina', 'England', 'Spain', 'Portugal'])
teamList.append(['Mexico', 'Netherlands', 'Denmark', 'Germany',
                 'Uruguay', 'Switzerland', 'United States', 'Croatia'])
teamList.append(['Senegal', 'Iran', 'Japan', 'Morocco',
                 'Serbia', 'Poland', 'South Korea', 'Tunisia'])
teamList.append(['Cameroon', 'Canada', 'Ecuador', 'Saudi Arabia',
                 'Ghana', 'Australia', 'Costa Rica', 'Wales'])

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RealDevClub ( 沪ICP备2024093864号-1 )

GMT+8, 4-12-2025 09:05 , Processed in 0.080047 second(s), 30 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表