课程全名:An Introduction to Interactive Programming in Python,来自 Rice University

授课教授:Joe Warren, Scott Rixner, John Greiner, Stephen Wong

工具:http://www.codeskulptor.org/, simplegui 模块

第5周讲述

1. simplegui模块中鼠标的控制方式

2. list的各种操作, append, pop, extend, index, remove, reverse, sort

3. Iteration,迭代器,遍历对象方式 for x in lst:… 或者列表生成式 [exp for x in lst]

[exp for x in lst] # 迭代器,遍历x中的所有元素x执行exp的操作,返回一个计算完整的列表

(exp for x in lst) # 生成器,也是一种迭代器,返回一个迭代对象,不计算所有结果,只提供当前需要访问的next元素,所以生成器只能迭代一次。好处是节省内存

4. dictionaries, python中的字典dict, {},键值对

字典中只有immutable对象可以做key,value可以是任意的

例如:d = {(1,2):[1,2,3], True:{1:2}, "123":(1,2), 4:5}

immutable 对象: string, int, float, tuple, bool,(值类型)

mutable 对象: list, dictionary, set,(自定义类型,引用类型)

其他的就是浅拷贝和深拷贝的问题:

当进行a=b赋值操作,如果是immutable对象,a作为b的一个拷贝创建,a和b独立。如果是mutable对象,a作为b的一个引用创建,a和b共享。

浅拷贝---构造一个新的复合对象,使用原来对象元素的引用,(对于immutable类型相当于拷贝)填充新对象。

深拷贝---构造一个新的复合对象,同时递归拷贝对象所包含的所有元素。

copy模块中

copy.copy(x) # return a shallow copy of x

copy.deepcopy(x) # return a deep copy of x

5. simplegui模块中图像的载入,load_image

本周的游戏:

完成一个数字记忆相关游戏,界面如下

游戏的规则:

1. 共有16个数字,他们是成对的0-7共8组,随机分布在16个格子里。

2. 初始都是cover状态,通过鼠标点击卡牌可以uncover查看对应的数字。

3. 如果连续两次点击为相同数字,那么数字会保留uncover状态。

4. 如果连续两次的点击为不相同数字,当点击第三个数字,原先卡牌uncover状态将恢复成cover

5. Turns记录每轮点击次数,并且重复点击已经点开的卡牌没有效果,reset重置游戏。

游戏框架:

def new_game() # 游戏初始化

1. 思考关于游戏逻辑,需要记录那些属性,至少有个list用来记录16个数字,命名为memory_list好了。还要有个list记录哪些牌需要翻开哪些牌是不翻开的,命名为exposed。需要初始化turns,turns为一个数值记录当前次数。需要一个list命名prev_card_id用来记录先前翻开的牌。还需要state变量,记录当前处于游戏的哪个状态,0表示处于初始状态,1表示已经翻开一张牌

2. 初始化memory_list,直接生成0-16然后对8取模,在进行shuffle

memory_list = [i%8 for i in range(16)]
random.shuffle(memory_list)

def mouseclick(pos) # 鼠标交互事件

1. 鼠标点击,得到了什么?鼠标点击的坐标位置,那需要什么?点了哪张牌。so,for循环枚举每张牌的左右两条竖线(x方向信息),判断点击牌序号存在card_id

2. 如果当前牌是uncover,或者点击极限位置没找到牌(可能么?)的那么就不管他,否则,进入游戏规则2、3、4的逻辑判断。

需要注意就是,在状态0时候,要先把prev_card_id里面的卡牌状态翻转成未翻开

if state == 0:
for i in prev_card_id:
exposed[i] = False
prev_card_id = [card_id]
exposed[card_id] = True
turns += 1
state = 1
label.set_text("Turns = " + str(turns))
else:
exposed[card_id] = True
state = 0
if memory_list[prev_card_id[0]] == memory_list[card_id]:
exposed[card_id] = True
prev_card_id = []
else:
prev_card_id.append(card_id)

def draw(canvas) # 界面绘制事件

界面就负责绘制,800的宽度分成16份

第i个的宽度分别是i*50, (i+1)*50

1.如果exposed[i]是True,翻开就绘制Text

2.否则,未翻开就绘制polygon

for i in range(len(exposed)):
if exposed[i]:
canvas.draw_text(str(memory_list[i]), (i*50+10, 100/1.75), 50, 'White')
else:
canvas.draw_polygon([(i*50, 0), ((i+1)*50, 0), ((i+1)*50, 100), ((i*50), 100)], 1, 'Red', 'Green')

完整代码如下:

# implementation of card game - Memory

import simplegui
import random # helper function to initialize globals
def new_game():
global exposed, prev_card_id, turns, memory_list, state
# init variables
exposed = [False]*16
turns = state = 0
label.set_text("Turns = " + str(turns))
prev_card_id = []
memory_list = [i%8 for i in range(16)]
random.shuffle(memory_list) # define event handlers
def mouseclick(pos):
global state, prev_card_id, exposed, turns
# find the clicked card's id
card_id = -1
for i in range(len(exposed)):
if pos[0] >= i*50 and pos[0] < (i+1)*50:
card_id = i if (card_id != -1) and (exposed[card_id] is False):
# state logic processed
if state == 0:
for i in prev_card_id:
exposed[i] = False
prev_card_id = [card_id]
exposed[card_id] = True
turns += 1
state = 1
label.set_text("Turns = " + str(turns))
else:
exposed[card_id] = True
state = 0
if memory_list[prev_card_id[0]] == memory_list[card_id]:
exposed[card_id] = True
prev_card_id = []
else:
prev_card_id.append(card_id) # cards are logically 50x100 pixels in size
def draw(canvas):
for i in range(len(exposed)):
if exposed[i]:
canvas.draw_text(str(memory_list[i]), (i*50+10, 100/1.75), 50, 'White')
else:
canvas.draw_polygon([(i*50, 0), ((i+1)*50, 0), ((i+1)*50, 100), ((i*50), 100)], 1, 'Red', 'Green') # create frame and add a button and labels
frame = simplegui.create_frame("Memory", 800, 100)
frame.add_button("Reset", new_game, 200)
label = frame.add_label("Turns = 0") # register event handlers
frame.set_mouseclick_handler(mouseclick)
frame.set_draw_handler(draw) # get things rolling
new_game()
frame.start() # Always remember to review the grading rubric

Mini projects #5 ---- Memory的更多相关文章

  1. Mini projects #8–RiceRocks

    课程全名:An Introduction to Interactive Programming in Python,来自 Rice University 授课教授:Joe Warren, Scott ...

  2. Mini projects #7 ---- Spaceship

    课程全名:An Introduction to Interactive Programming in Python,来自 Rice University 授课教授:Joe Warren, Scott ...

  3. Mini projects #6 ---- Blackjack

    课程全名:An Introduction to Interactive Programming in Python,来自 Rice University 授课教授:Joe Warren, Scott ...

  4. Mini projects #3 ---- Stopwatch: The Game

    课程全名:An Introduction to Interactive Programming in Python,来自 Rice University 授课教授:Joe Warren, Scott ...

  5. Mini projects #4 ---- Pong

    课程全名:An Introduction to Interactive Programming in Python,来自 Rice University 授课教授:Joe Warren, Scott ...

  6. Thinking Clearly about Performance

    http://queue.acm.org/detail.cfm?id=1854041 The July/August issue of acmqueue is out now acmqueue is ...

  7. 【NX二次开发】NX内部函数,libugui.dll文件中的内部函数

    本文分为两部分:"带参数的函数"和 "带修饰的函数". 浏览这篇博客前请先阅读: [NX二次开发]NX内部函数,查找内部函数的方法 带参数的函数: bool A ...

  8. memory prefix mini mono multi out _m 5

      1● mini 小 迷你   2● mono 单一 ,单   3● multi 多

  9. All the Apache Streaming Projects: An Exploratory Guide

    The speed at which data is generated, consumed, processed, and analyzed is increasing at an unbeliev ...

随机推荐

  1. centos 6.5 查看、开启,关闭 端口

    查看所有端口   netstat -ntlp   1.开启端口(以80端口为例)         方法一:            /sbin/iptables -I INPUT -p tcp --dp ...

  2. 常见绘图框架-(Charts)

    swift 出来后有很多优秀的第三方绘图.动画框架,最近项目需要使用了 Charts Github: https://github.com/danielgindi/Charts 因为是在Object- ...

  3. socket网络通信

    1.socket通常也称作"套接字",用于描述IP地址和端口.在internet上的主机一般运行了多个服务软件,同时提供几种服务,每种服务都打开一个socket,并绑定到一个端口上 ...

  4. Data import/export of Netezza using external table

    Introduction External table is a special table in Netezza system, which could be  used to import/exp ...

  5. php 快速排序

    快速排序是以其中一个数为比较标准,其他比较的数分块处理,应用递归按相同想法处理数据 比如:4 3 6 2 1 7 8 以4为比较对象 排序为 3 2 1 6 7 8 左边为 3 2 1 右边 为 6 ...

  6. javascript for循环练习

    有一对幼兔,幼兔1个月后长成小兔,小兔1个月后长成成兔并生下一对幼兔,问几年后有多少对兔子,幼兔.小兔.成兔对数分别是多少. 幼兔 1 小兔 0 成兔 0幼兔 0 小兔 1 成兔 0 幼兔 1 小兔 ...

  7. Hibernate一对多(注解)

    <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hi ...

  8. 苗子sale record

    2016年7月11日 橘白/阳光 发广州 220  中通 719373064939 成功2016年7月11日 横纹RA    发潮州 250  中通 719373064940 成功2016年7月18日 ...

  9. mysql学习(4)-mysqldump备份和恢复数据

    背景 最近在公司做数据迁移方面的工作,使用mysql数据库在测试环境模拟数据迁移,在迁移测试的过程中需要做数据备份和恢复 mysql数据备份和恢复比较简单,可以选择mysqldump工具,这里简单提一 ...

  10. POJ 3057 Evacuation 二分图匹配

    每个门每个时间只能出一个人,那就把每个门拆成多个,对应每个时间. 不断增加时间,然后增广,直到最大匹配. //#pragma comment(linker, "/STACK:10240000 ...