前段时间用C语言和小组成员一起写了一个五子棋的小项目
我写的代码基本被毙了 惨 但也学到很多
总结一下
五子棋项目简要介绍:
1.用光标控制棋子运动及下棋
2.控制台输出 没用gui
3.有悔棋功能
4.只有人人对战 无ai 人机对战(之后可能会升级 并加入联机操作)
5.其他和一般五子棋一样
6.采用简单的栈进行棋子数据的存储,实现下棋,悔棋功能
代码分析:
大体分几个模块:
一个欢迎界面
一个游戏界面
游戏模块:下棋悔棋
判断胜负模块
main函数
每个模块含义一些细小的控制细节
1.棋子 定义为结构体
typedef struct {
int x;
int y;
int type;//棋子颜色 黑或白
}ChessMan;
棋盘:二维数组 直接用中文“十”填充
//初始化棋盘
void InitChessBoard() {
for(int i = 0; i < BOARD_SIZE ; i ++) {
for(int j = 0; j < BOARD_SIZE; j ++) {
ChessBoard[i][j] = "十";
}
}
}
下棋即用黑子或白子直接覆盖即可
例:
ChessBoard[chessArray[i].y][chessArray[i].x] = "●";
2.用链栈存储棋子数据 实现下棋 悔棋
下棋即入栈 悔棋即出栈
一开始我没找到棋子类型与光标相互匹配的方法,因为用光标控制,之前没尝试过,搜到的光标控制方法有设置横纵坐标,与棋子横纵坐标有些重复,后来队友用了更好的光标控制方法解决此问题。
光标控制方法:
此控制方法也有借鉴网上找到的控制方法
用到API函数:
SetConsoleCursorPosition 以此设置光标位置
具体使用方法详见:https://blog.csdn.net/xiexievv/article/details/7475848
https://blog.csdn.net/qq_38241045/article/details/69941464
/**设置游戏光标*/
void SetPosition(int x,int y)
{
HANDLE winHandle;//句柄 ?存疑
COORD pos={
x,y};//坐标x,y
winHandle=GetStdHandle(STD_OUTPUT_HANDLE);调用函数
//设置光标的坐标
SetConsoleCursorPosition(winHandle,pos);//调用函数
}
下棋模块代码:
具体见注释
int counts = 0;//记录落子数 步数
int i = 0;
void Play() {
InitChessBoard();//初始化棋盘
ShowGameInterface();
HANDLE hwnd = GetStdHandle(STD_OUTPUT_HANDLE);
COORD coord;
coord.X = 41;
coord.Y = 9;//设置初始光标位置
SetConsoleCursorPosition(hwnd,coord);
while (1) {
//进入下棋
switch(getch() ) {
case 27://esc 退出 回到欢迎界面
return 0;
break;
case 32: {
loopout(hwnd, coord);
int X=coord.X-27,Y=coord.Y-2;
counts++;
int n=225;//总步数
ChessMan chessArray[n];//棋子结构数组
chessArray[i].x = X/2; //棋子坐标 横坐标变化两个单位 棋盘上移动一格
chessArray[i].y =Y;
chessArray[i].type = counts%2;