Eva'Sudoku-0.1新鲜出炉啦~~

呵呵,经过将近一个星期的对pygame的了解与熟悉,我终于磕磕绊绊地把数独的基础界面做出来啦。当然啦,完全不出意思的是,很丑,所有的东西都是自己一笔一画画出来的,没有对话框,没有菜单栏,更别提什么精美的画面了。不过我却因此更了解界面编程的实质了。再复杂的界面,底层应该也是这样子画出来的吧?就跟android里面的canvas那样。同时也了解到了一个概念,叫FPS,frame per second,就是说一秒钟里面对画面进行多少次重画。pygame程序的框架大概是这样:
pygame.init()	#初始化pygame,为使用硬件做准备
clock = pygame.time.Clock()

#...

while True:
	for event in pygame.event.get():
		#各种事件处理,包括:
		if event.type == QUIT:
			#退出程序	
		elif event.type == KEYDOWN:
			#处理键盘事件
		elif event.type == MOUSEMOTION:
			#鼠标移动
		elif event.type == MOUSEBUTTONDOWN:
			#按下鼠标
		
		#各种重画界面:事件处理过程影响了数据的状态,
		#重面界面的函数通过分析数据的状态来决定界面的呈现
		
		#...

		#重画的过程应该是发生在显卡的缓冲区里的
		#直到update才真正发生在显示器上

		pygame.display.update()

		#就是在这里,我们设置了FPS,从而决定了屏幕的更新频率
		#如果不设置的话,好像是默认一个循环更新一次
		#也就是程序可能会浪费你的CPU
		clock.tick(FPS)	


关于pygame的学习,推荐大家一个很好的博客:http://eyehere.net/2011/python-pygame-novice-professional-index/,我所有用到的pygame的资料基本都是从这看到的。

虽然很丑,不过我还是决定让大家看看我丑丑的界面(这只是v0.1而已,别急着吐嘈哈~):
新游戏:



选中一个可选的格子后,输入列表中一些格子变成紫色,为合法输入



完成数独后的彩色画面:



使用到的元素包括:
Grid:即数独的里的小格子了。每个格都是一个Rect,同时记录了该格里填的数字(None, 1~9)以及当前状态下该格的合法输入,另外还有一个状态标记,说明了该格是空白还是填了数字,填的数字是自己填的,还是初始局面就有的,还是通过电脑解得到的;另外一些标记位说明了该格当前是否被选中,或是有鼠标停留在上面。
具体状态如下:
S_BLANK = 0 #空白
S_FILLED = 1 #初始局面就已经填了的
S_FOCUS = 2 #鼠标当前停留在该格上
S_SELECTED = 4 #选中当前格
S_ANSWER = 8 #用户填入
S_ANSWER_BY_COMP = 16 #通过solve得到的解
CellAns:即旁边那些用于点击输入到Grid中的格。除了该格代表的数字外,还用一个bool变量来说明该数字对于当前选中的Grid是否是合法输入。由此可见,只有在当前有选中的格子的情况下,这些CellAns才有事件响应。
CellMenu:即上面的那两个按钮。以后或许可以把事件响应也写到里面去。
别看这些现在都很丑,等以后用图片为背景美化一下,也是可以做到挺漂亮的。不过目前的核心还是应该在功能的实现上。
至于主函数,其实就是上面那个框架下的各种事件处理及画图。
现在实现的功能包括有:
(1)创建新游戏
(2)计时
(3)解当前数独
(4)判断数独是否已经完成

接下来的重点将是研究不同难度等级的数独的特征以及相应的产生算法。不过,,,下个星期要看论文了。。。。下下个星期再开始吧~!




猜你喜欢

转载自philoscience.iteye.com/blog/1542283