reversi-cli - 跟风做的一个黑白棋小游戏

2016-07-14 321 次浏览 我的项目

最近几天听说有一些实训的小伙伴的项目是做一个黑白棋游戏,于是我也跟风去凑个热闹,权当练练手,锻炼一下写个小项目的能力。断断续续做了两天(因为还有比赛),只做好了基本功能,没有来得及学习 AI 方面的东西,所以实现只能人人对战。


设计思路

由于没有做过这种能玩的小游戏,一开始是一脸懵逼的。不过突然想到以前看公开课时候老师有提到 MVC 设计模式,于是决定用这个来尝试一下(理解不深请轻拍)。

程序的框架如下:
Model:负责游戏数据的存储、开局设置、计时器、下棋、规则判断、响应 Controller 中按键事件、更新 View 视图等。
View:负责在命令行中根据 Model 中的数据绘图,显示棋盘界面。
Controller:负责接收用户按键,并传给 Model 做处理。


实现细节

  • Model

    • 数据存储。通常我们很容易想到用一个二维数组存储整个棋盘。这里我设置了一个结构体 grid 用来存储每个格点的信息。其中的 color 变量,黑棋为 -1,白棋为 1,空为 0。另外我还设置了其他几个成员变量,用来存储一些附加状态,例如当前格点是否被光标选中、是否为下一步可以下棋的格点等等。另外,记录当前轮到谁下、双方棋子个数的变量也是必需的。
    • 规则判断。对于黑白棋来说,需要设计算法的主要是计算下一步可以下的位置和下棋之后的颜色反转。这里的判定方法有很多种,我的算法是从要判断的格点出发,遍历全部的 8 个方向,通过 while 循环找寻连续的颜色相反的棋子,直到遇到非反色棋子时退出循环,若此时是同色的棋子,则将中间的棋子全部标记。
    • Turn。我为这个变量设置了 -1 或 1 两种值来表示当前是轮到黑棋还是白棋,这样,对局的轮换只需要将 turn * -1 即可实现。而且规则判断函数中无需判断当前轮到谁,只需要判断颜色相同或相反即可。
  • View

    • 棋盘绘制。棋盘的边框可以利用制表符号绘制,格点内的数据则根据 Model 中的数据绘制。
  • Controller

    • 按键事件。由于我是在 Linux 平台下编写的,所以实现方法和 Windows 平台有所差别,基本思路是关闭终端回显和光标,并且通过 read() 读取按键,对于方向键需要做特殊处理。另外,由于修改了终端属性,因此程序结束时要将设置修改回默认,并且应考虑到 SIGINT 信号并作出相应处理。在Windows 下可以利用 getch() 函数实现相关功能。

程序信息

平台:
macOS/Linux

文件列表:
── controller.cpp
── main.cpp
── main.h
── model.cpp
── view.cpp

编译命令:
g++ main.cpp model.cpp view.cpp controller.cpp -o reversi-cli

运行命令:
./reversi-cli

按键说明:
方向键或 WASD 控制光标,回车键下棋,ESC 键退出游戏。


运行截图

screenshot


Talk is cheap. Show me the code.

由于碰巧想起来了有 GitHub 这种平台,迟迟没有去用,于是这次决定去接触一下它(若干年后这个一定会成为黑历史),遂把这个黑白棋小项目开源在 GitHub。大家轻拍...
地址:https://github.com/dreamerblue/reversi-cli


如若本文有任何错误或疏漏,欢迎指正。


bLue 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。
本文地址:https://dreamer.blue/blog/post/2016/07/14/reversi-cli.dream

还不快抢沙发

添加新评论