首页 > 代码库 > 纸牌project
纸牌project
- 用range[0,8)的列表表示牌,这些数字要出现两次。我们建议你通过连接两个range[0,8)的列表来创建这个list.利用Docs来安排列表串联操作
- 写一个draw handler啥样的draw handler呢?用for循环来迭代Memory deck,并用draw_text在画布上画出表示每个卡片的数字。结果应该是一个水平均等间隔的数字序列画在画布上
- 用random.shuffle()来洗牌。在洗牌之前记得消灭你canvas drawing代码的bug,这样的话消灭bug会比较容易一点
- 然后,修改draw handler来或者画一个空白的绿色矩形或者卡片数值。为了执行这个行为,我们建议你建立第二个叫做exposed的list。在这个exposed列表里面,这个ith应该是True如果ith卡片朝上,并且它的值是可见的;值是False如果ith卡片朝下并且它的值是隐藏的。我们建议你初始化exposed在一些已知的数值当测试你的drawing代码用这种修饰
- 现在,添加函数来确定你已经用鼠标点击了哪张卡片。添加一个鼠标点击event handler,这个函数有鼠标点击的位置并在控制台打印出你已经点击的纸牌的索引。为了简单的确认你已经点击了哪张卡片,我们建议用标准的画布,这样的话这一系列的卡片可以完整的填充画布。
- 修改鼠标点击的event handler以达到根据鼠标点击的位置来翻转卡片的目的。如果玩家点击第i张卡片,你可改变exposed[i]的值,从False改成True。如果卡片已经揭露了,你应该忽略鼠标点击。在这一点上,这就是这个游戏的基本构造。
- 现在你要添加游戏逻辑到鼠标点击handler里面为了选择两种卡片并确认他们是否是一对。我们建议跟随模板里面的游戏逻辑。状态0对应游戏开始的状态,在状态0,如果你点击一个没被揭露的卡片,那卡片就被揭露了,并且你转换到状态2.状态2对应一个turn结束了。在状态2,如果你点击一个没被揭露的卡片,那卡片就被揭露了并且你转换到状态1.
- 记得在状态2的情况下,你也要决定是否之前的两对卡片是一对的或者不是一对的。如果他们不是一对的,你要把它们翻转回去,这样的话他们就被隐藏起来了在移动到状态1.我们建议你使用两个全局变量来存储每两张卡片的索引,啥索引呢,我们之前的turn点击
- 添加一个计数器干啥的呢?用来跟踪回合次数并用set_text来更新这个计数器作为一个控制面板里面的标签。
- 最后,执行new_game()功能(如果你还没)这样的话“Reset"按钮可以洗牌,重置回合计数器并重新开始游戏。开始的时候所有的卡片是隐藏的。
- (可选)你可以替换 draw_text对每张卡片通过draw_image用一个里面的8个不同图片。
一旦按了开始按钮,游戏应该开始。你不用按”Reset"来开始。一旦游戏结束,你要按“Reset"来重新开始游戏。
尽管这个游戏开始可能觉得挺难的,我们完整的代码包含注释和空格不到100行。如果你觉得有难度,集中注意到第六步。我们的经验是,在这个点上,你将开始看的你的游戏组装起来了,接下来就更简单了。
评分标准
- 1 pt - 游戏正确的在画布中画出16张卡片(水平,或者栅格)。使用图像代替文本数字比较好,但是提交者有责任确保能加载图片
- 1 pt - 卡片是8对
- 1 pt - 游戏忽略点击已经揭示的卡片
- 1 pt - 游戏开始的时候,点击一张卡片,卡片可以被揭示
- 1 pt - 如果一张没配对的卡片被揭开了,点击第二张没被揭示的卡片,这第二张卡片应该被显露出来
- 1 pt - 如果两个没配对的卡片被揭露出来,点击一个没被揭露出来的卡片,这张卡片可以被揭露出来并且没配对的两张卡片翻转过去。
- 1 pt - If all exposed cards are paired, a click on an unexposed card exposes the card that was clicked on and does not flip any other cards.如果所有的卡片都配对了,点击到一个没配对的卡片会揭露这张被点击的卡片,其他已经配对的不会被翻过去。
- 1 pt - .配对的卡片通过一个循环里面的两次点击以被揭露的状态保留知道开始下一次游戏。
1 pt - 游戏 在控制区域以标签的形式 正确的更新并显示当前的游戏回合次数。计数器要在一个回合里面增加在第一或者第二张卡片翻转过来
- 1 pt - 这个游戏包含一个“Reset"按钮,这个Reset按钮可以重置回合计数器并且重置这个游戏
- 1 pt - 每次按Reset,8个数字序列也要洗牌,所以每次纸牌顺序都不
Tip #1
你们许多人想要使用16个if语句来控制每个可能的卡片位置在画布上。别那么做。学习如何使用for loops循环,例如,下面的代码是一个比较好的开端来画卡片
for c in cards: canvas.draw_text(str(c), pos, ....) pos[0] += ...
Joe WarrenINSTRUCTOR· 20 days ago
Tip #2
在你的鼠标点击handler里面,你要确定你已经点击了哪张卡片。不要在这使用一个长长的 if/elif/else陈述。通过pos[0]//50计算卡片的序列.你之后也可以利用这个序列,当操作显露出来的list,显露出来的list是永康控制是否一个卡片被画出或者没被画出。
Joe WarrenINSTRUCTOR· 20 days ago
Tip #3
但你接近完成这个项目的时候,当你从状态2过度到状态1的时候你将需要决定是否两张卡片是一对。这的关键是记录两张卡片的目录,啥呢,最后一个回合里面点击的(在两个独立的变量)所以你可以在下一个回合里面测试是否他们的数字是相等的
def draw(canvas):
cards = range(0,8)
cards.extend(cards)
random.shuffle(cards)
for c in cards:
canves.draw_text(str(c), (pos[0],50), 12, "White")#canvas少写了个a
pos[0] += 50#报错了,用简化模式试试看
下面的好的
def draw(canvas):
cards = range(0,8)
cards.extend(cards)
random.shuffle(cards)
pos = [10, 70]
for c in cards:
canvas.draw_text(str(c), (pos), 60, "White")
pos[0] += 50
线宽50--48
我画出了第一个绿色矩形,如何画16个呢,画出来了但是不清楚是否正确,我的边缘是黑色的,而且数字在一直闪
==========================================================================================
def draw(canvas):
cards = range(0,8)
cards.extend(cards)
random.shuffle(cards)
pos = [10, 70]
posa = 25
exposed = [True, False,False, False,False,False, False,False,False, False,False,False,False,False,False, False]
for c in cards:
canvas.draw_text(str(c), (pos), 60, "White")
pos[0] += 50
canvas.draw_line((posa, 0),(posa, 100), 48, "Green")
posa += 50
===============================
根据参考答案,数字不闪了
这个任务估计是做不完了,因为没时间,为啥没时间?因为上周的时间都被浪费了,有很多意外,都有啥意外?
昨晚头痛(接到猎头电话高兴过头了?);调部门的事情也让我心情不太好,周日去姑姑那没学习,约会3次。补考勤的事情也花了很长时间。有一天健身花了一个多小时。看北大的课程刷了一整晚,明天要去爬山,
这一周经常感觉看视频的进度很慢,在quiz上浪费了太多时间。
下周该怎么做呢?这个任务该怎么办呢?
首先,上午的时间一定要安排给coursera,尽量排除其他事情的干扰,我能漂亮的完成一门课程已经不错了,不要好高骛远。即使是紧急的事情也要清楚我的最重要的任务是什么。用最好的时间研究视频,跟着视频敲代码,一段段的敲,不要全部看完再敲,会忘记的,迅速过一遍视频,然后做quie,quize不要花太多时间,超过80分就赶快着手mini project
对于本次任务,我已经提交了一个狗屎版本,我一定要自己写出来,
我又一次fail了,但是我还要挣扎,还要再次站起来
纸牌project