Mini projects #3 ---- Stopwatch: The Game
课程全名:An Introduction to Interactive Programming in Python,来自 Rice University
授课教授:Joe Warren, Scott Rixner, John Greiner, Stephen Wong
工具:http://www.codeskulptor.org/, simplegui 模块
这是第三次作业,前面两次主要是熟悉Python动手做起来都很简单,就不记录了。
作业需要完成一个关于手表的游戏,估计很多人也都玩过。初中和高中考试做完卷子,但离收卷还有很久,就折腾手上的电子表用来掐秒,锻炼反应力。这里要实现的游戏是一个道理,就是酱紫。
这个Mini project开始采用事件驱动(event-driven)的交互方式,所以先明确一些问题。
1. 界面canvas的drawing速率大概是 60 frams/sec
2. 每一个应用程序需要注册一个特殊的事件句柄叫做 draw handler
3. 在simplegui 模块中,创建和注册draw handler最后的绘制是在canvas中
4. 绘制的操作有很多种,例如线、圆、多边形等,这些都在simplegui模块里面定义,具体查看doc
canvas的布局如下,原点在左上角,第一个坐标是宽度,第二个坐标是高度

Stopwatch完成的结果如下:

Start开始游戏,Stop暂停,Reset重置。右上角记录 成功停在整数秒次数/尝试次数
需要的元素:
frame:主界面
start button, stop button, reset button.
timer: 计时
逻辑设计:
start button事件: 开始计时
def start_handler():
global is_running
if is_running is False:
timer.start()
is_running = True
stop button事件:停止计时,更新右上角记录
def stop_handler():
global num_stop, num_succ_stop, is_running
if is_running is True:
timer.stop()
num_stop += 1
if tick % 10 == 0 and tick != 0:
num_succ_stop += 1
is_running = False
reset button事件:停止计时,重置相关参数
def reset_handler():
global tick, num_stop, num_succ_stop, is_running
timer.stop()
num_succ_stop, num_stop, tick = 0, 0, 0
is_running = False
timer 事件:负责计时不断增加,每次0.1s
def timer_handler():
global tick
tick += 1
draw事件:界面元素绘制
def draw_handler(canvas):
canvas.draw_text(format(tick), [100, 100], 30, "Green")
canvas.draw_text(str(num_succ_stop) + "/" + str(num_stop), [250, 20], 20, "Green")
定义了一个辅助的方法format用来转换当前时间t为00:00.0格式
def format(t):
D = str(t % 10)
BC = t / 10 % 60
if BC < 10:
BC = '0'+str(BC)
else:
BC = str(BC)
A = str(t / 10 / 60)
return A + ":" + BC + "." + D
整体完整代码如下:
# template for "Stopwatch: The Game" import simplegui # define global variables
tick = 0
num_stop = 0
num_succ_stop = 0
is_running = False # define helper function format that converts time
# in tenths of seconds into formatted string A:BC.D
def format(t):
D = str(t % 10)
BC = t / 10 % 60
if BC < 10:
BC = '0'+str(BC)
else:
BC = str(BC)
A = str(t / 10 / 60)
return A + ":" + BC + "." + D # define event handlers for buttons; "Start", "Stop", "Reset"
def start_handler():
global is_running
if is_running is False:
timer.start()
is_running = True def stop_handler():
global num_stop, num_succ_stop, is_running
if is_running is True:
timer.stop()
num_stop += 1
if tick % 10 == 0 and tick != 0:
num_succ_stop += 1
is_running = False def reset_handler():
global tick, num_stop, num_succ_stop, is_running
timer.stop()
num_succ_stop, num_stop, tick = 0, 0, 0
is_running = False # define event handler for timer with 0.1 sec interval
def timer_handler():
global tick
tick += 1 # define draw handler
def draw_handler(canvas):
canvas.draw_text(format(tick), [100, 100], 30, "Green")
canvas.draw_text(str(num_succ_stop) + "/" + str(num_stop), [250, 20], 20, "Green") # create frame
frame = simplegui.create_frame('Stopwatch: The Game', 300, 200) # register event handlers
start_btn = frame.add_button('Start', start_handler, 200)
stop_btn = frame.add_button('Stop', stop_handler, 200)
reset_btn = frame.add_button('Reset', reset_handler, 200)
frame.set_draw_handler(draw_handler)
timer = simplegui.create_timer(100, timer_handler) # start frame
frame.start() # Please remember to review the grading rubric
其中is_running用来记录当前timer是否在运行,防止重复点击stop出现计数错误的问题。
整体逻辑也比较简单,课程挺有意思,声音听着超棒,锻炼听力挺不错。每个老师相当的负责和认真。感叹自己本科那时初学C的时候,授课的差距是那么大,也感慨现在有这么多好的资源可以利用。学无止境。
Mini projects #3 ---- Stopwatch: The Game的更多相关文章
- Mini projects #8–RiceRocks
课程全名:An Introduction to Interactive Programming in Python,来自 Rice University 授课教授:Joe Warren, Scott ...
- Mini projects #7 ---- Spaceship
课程全名:An Introduction to Interactive Programming in Python,来自 Rice University 授课教授:Joe Warren, Scott ...
- Mini projects #6 ---- Blackjack
课程全名:An Introduction to Interactive Programming in Python,来自 Rice University 授课教授:Joe Warren, Scott ...
- Mini projects #5 ---- Memory
课程全名:An Introduction to Interactive Programming in Python,来自 Rice University 授课教授:Joe Warren, Scott ...
- Mini projects #4 ---- Pong
课程全名:An Introduction to Interactive Programming in Python,来自 Rice University 授课教授:Joe Warren, Scott ...
- A Complete List of .NET Open Source Developer Projects
http://scottge.net/2015/07/08/a-complete-list-of-net-open-source-developer-projects/?utm_source=tuic ...
- Building Xcode iOS projects and creating *.ipa file from the command line
For our development process of iOS applications, we are using Jenkins set up on the Mac Mini Server, ...
- All the Apache Streaming Projects: An Exploratory Guide
The speed at which data is generated, consumed, processed, and analyzed is increasing at an unbeliev ...
- Golang优秀开源项目汇总, 10大流行Go语言开源项目, golang 开源项目全集(golang/go/wiki/Projects), GitHub上优秀的Go开源项目
Golang优秀开源项目汇总(持续更新...)我把这个汇总放在github上了, 后面更新也会在github上更新. https://github.com/hackstoic/golang-open- ...
随机推荐
- nosql数据库学习
1.MongoDB 介绍 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.主要解决的是海量数据的访问效率问题,为WEB应用提供可扩展的高性能数据存储解决方案.当数据量达到50GB以上 ...
- iOS开发中对RunLoop的个人心得
从接触iOS到现在也有将近两年了,对iOS中的RunLoop也有了一定的认识,下面讲讲个人对RunLoop的理解. 初识RunLoop RunLoops是与线程相关联的基础部分,一个Run Loo ...
- springmvc 学习笔记_1
一.回顾JavaWeb中的MVC设计模式 1)MVC这种设计模式,不光运用于Web领域,而且也能用于非Web领域 2)今天说的MVC特指一种表现层设计模式,不限于Java语言 二.回顾struts2+ ...
- Web服务器的工作原理
Web服务器的工作原理 Web服务器工作原理概述 很多时候我们都想知道,web容器或web服务器(比如Tomcat或者jboss)是怎样工作的?它们是怎样处理来自全世界的http请求的?它们在幕后做了 ...
- PowerShell全自动分配CPU
代码 $pro = Get-Process foreach ($n in $pro){ if($n.ProcessorAffinity -ne 255){ #continue } if($n.Id - ...
- Loaders
Android3.0之后引入了加载器,支持轻松在Activity和Fragment中异步加载数据.加载器具有以下特点: 1.可用于任何Activity和Fragment 2.支持异步加载数据 3.监控 ...
- EF MYSQL 不能选择实体框架版本
web.config文件里面加如下配置,然后编译 <provider invariantName="MySql.Data.MySqlClient" type="My ...
- vs2010 A selected drive is no longer valid
visual studio 2010重新安装添加组件,报A selected drive is no longer valid错误. 这个是由于已经安装了sp1,此时需要将sp1卸载掉,然后就可以安装 ...
- git资料图
- android中ColorStateList及StateListDrawable设置Selector
写过android的代码相信大家对Selector并不陌生吧,下面来看看这段xml文件是如何定义的 <?xml version="1.0" encoding="ut ...