Memory作业分析(基于CodeSculptor,python 2.7)

1、批作业中发现的一些函数用法

1、ord和chr
首先是ord()和chr(),它们俩正好有相反的作用。ord将字符转换为ASCII码的10进制数,chr将十进制数转换为字符
代码:
print ord('a')
print chr(97)
输出:
97
a
2、color的表示方法(http://en.wikipedia.org/wiki/Web_colors

#ffffff:共6位十六进制数表示某种颜色,每两位分别对应RGB,记得前面加#

代码:

import simplegui
message = "Welcome!"

# Handler to draw on canvas
def draw(canvas):
    canvas.draw_text(message, [50,112], 48, "#ffff00")

# Create a frame and assign callbacks to event handlers
frame = simplegui.create_frame("Home", 300, 200)
frame.set_draw_handler(draw)

# start the frame 
frame.start()


可以按如下方法产生随机的颜色:

print hex(random.randint(0, 16777215))
print "#" + hex(random.randint(0, 16777215))[2:]

其中1677215 == 256*256*256-1,是6位16进制数做能表示的最大整数

输出是随机的:

0x2ae5db
#698d07

2、发现的牛人的作业(http://www.codeskulptor.org/#user38_M3zf9pxi0U_6.py

牛人使用图片代替了原来的文本绘制,并且将牌变成了2排。

3、基于Class的Memory实现(http://www.codeskulptor.org/#exercises_classes_tile_selected_solution.py)

考虑再三,决定不吝啬时间对Exercise Practice中的Memory的实现做个总结,该实现不再是结构化的编程,而是基于Class的编程,很有启发意义。
该实现方案分2个部分1、Tile类的实现;2、事件触发;3、游戏逻辑;
1、Tile类

Tile类是表示一张牌的类,它的数据包括牌的数值、所处位置、翻开与否3种信息(都在init函数中初始化),能绘制自己(当牌翻开时绘制数字,反之绘制绿色背面),判断鼠标是否点中自己,令自己翻开或合上,有了这些信息,就可以通过游戏逻辑来使用这张牌了。下图给出了Tile的基本框架:

2、事件触发

1、建立frame,绘制游戏次数,

2、各种handler:注册游戏开始按钮,注册绘制图案handler,注册鼠标点击handler这几项,

3、对应这些handler是各种events:点击游戏开始按钮执行new_game(),绘制图案则执行draw(),点击鼠标执行mouseclick()。

new_game():构造16张随机的纸牌,有一个列表来保存起来,对他们初始化值和位置,它们一开始都是合上的,初始化游戏次数turns=0,游戏状态state=0,并将游戏次数显示出来。

draw():对保存纸牌的列表做循环,将16张牌绘制出来。

mouseclick():这是游戏的关键,点击一张纸牌后,首先判断点到的是哪一张纸牌,由于Tile可以根据鼠标的位置判断时候被选中,可以对纸牌列表做循环找出哪张纸牌被选中。然后根据当前情况翻开或合上以前的纸牌,具体内容在游戏逻辑中说明。

4、开始游戏:首先要new_game()一下,然后frame.start()

可以看看以下代码:





3、游戏逻辑

mouseclick()事件处理中,首先找出哪张纸牌被点中了,若该牌已经被翻开,则什么都不干,用return语句返回即可。

若该牌未被翻开,则首先将该牌翻开,然后查看state(保存了之前翻开几张牌的信息):

1、若(state==0)之前一张牌也没有翻开,则设置(state=1)状态为翻开了一张牌,并将这次翻出的牌保存给一个全局变量1,以备以后用;

2、若(state==1)之前翻过一张牌,则设置(state=2)状态为翻开了两张牌,并将游戏次数turns+1,将用文本输出;并将这次翻开的牌保存给另一全局变量2;

3、若(state==2)之前已经翻过2张牌,则设置(state=1)状态为翻开了一张牌,判断全局变量1、全局变量2是否相同,不相同则将那2张全局牌合起来;然后将这次的牌保存给全局变量1.

以上便完成了游戏逻辑,可以看看下面的代码:


4、总结
使用Tile类的好处是可以实现不同的游戏,而代码不需要全部重写,而且牌的翻开与否和数值都保存在一张牌里面,不会搞迷糊。
比如我可以将牌排成2行,并不需要重写Tile类,只需要在new_game()重新初始化牌的位置信息就可以了,当然判断选择哪张牌也要略微改一下。
或者我可以绘制牌的图片,而不是文本和颜色,这只需要在Tile类里改一下draw_tile()方法就可以了,也很方便。
此游戏的另一个难点是游戏的逻辑控制,这方面一方面要考智商,一方面要考做事的有条不紊,仔仔细细,这些都是今后的学习方向。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值