首页 > 代码库 > Mini projects ---- Stopwatch: The Game

Mini projects ---- 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的布局如下,原点在左上角,第一个坐标是宽度,第二个坐标是高度

image

 

Stopwatch完成的结果如下:

image

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 variablestick = 0num_stop = 0num_succ_stop = 0is_running = False# define helper function format that converts time# in tenths of seconds into formatted string A:BC.Ddef 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 = Truedef 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 = Falsedef 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 intervaldef timer_handler():    global tick    tick += 1# define draw handlerdef 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 frameframe = simplegui.create_frame(Stopwatch: The Game, 300, 200)# register event handlersstart_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 frameframe.start()# Please remember to review the grading rubric

其中is_running用来记录当前timer是否在运行,防止重复点击stop出现计数错误的问题。

 

整体逻辑也比较简单,课程挺有意思,声音听着超棒,锻炼听力挺不错。每个老师相当的负责和认真。感叹自己本科那时初学C的时候,授课的差距是那么大,也感慨现在有这么多好的资源可以利用。学无止境。

Mini projects ---- Stopwatch: The Game