Reflekt

2012/05/19 · python · project

公司之前有做过类似Q卡的项目,现在不做了,于是闲置下来很多机器,就是一般挂在电梯里或者便利店里的那种。于是团队决定拉回来几个放在办公室玩玩。

机器有上下两个屏幕,下面的可触摸,系统是Ubuntu,我便想在这个上面可以玩点什么。想到之前在iOS上玩过一个叫Reflekt的游戏,属于消除类,移动方块使得与镜面中的元素一致即可消除。而我们的机器有两个屏幕,正好可以当作镜面,于是我就想模拟一个出来放在上面玩玩。

写Linux上的游戏我自然想到Pygame,一个Python的2D游戏库,使用起来颇为简单,而且游戏本身也不复杂,所以实现起来还算容易。

唯一复杂的部分在于,游戏窗口一般无法使用多线程来实现多窗口,只能通过多进程的方式,于是我需要开启两个相同的进程,一个作为主窗口,处理输入,并将相应的命令传递个另外一个窗口。而处理用户输入与发送命令之间需要异步操作,因此主进程中要开一个单独的线程来发送命令。将主进程接收的命令并传递到发送线程,采用Python内置的Queue队列实现,于是一个小小的程序,因为要多一点点多进程的交互,变得稍显复杂了起来。大致框架如下

 +----------------------------+         +-----------------------------+
 |        Main Process        |         |       Mirror Process        |
 +----------------------------+         +-----------------------------+
 |     +----------------+     |         |                             |
 |     |   User Input   |     |         |                             |
 |     +-------+--------+     |         |                             |
 |             |              |         |                             |
 |             | Queue        |         |                             |
 |             v              |         |                             |
 |     +----------------+     |         |     +-----------------+     |
 |     |                |     |         |     |                 |     |
 |     |                |     | socket  |     |                 |     |
 |     | Sender Thread  +-------------------> | Receiver Thread |     |
 |     |                |     |         |     |                 |     |
 |     +----------------+     |         |     +-----------------+     |
 +----------------------------+         +-----------------------------+

目前还不完善,接下来要实现自动识别游戏结束,加入无尽模式。放在Github上,有兴趣可以瞧一瞧。