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上,有兴趣可以瞧一瞧。