接下来,我将会为大家简单介绍三子棋游戏的实现过程。
首先我们可以想到,在游戏开始前,需要菜单让人选择是否进行开始。(简易菜单实现如下)
void menu()
{printf("************************\n");printf("**** 1.paly *****\n");printf("**** 0.exit *****\n");printf("************************\n");
}void test()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:{game();break;}case 2:printf("退出游戏\n");break;default:printf("选择错误\n");break;}} while (input);}int main()
{test();return 0;
}
接下来,我们就可以完成游戏部分的有关代码了。
首先是游戏的基本框架,由于我们这次想写三子棋是一个长宽等长的棋盘模样,所以我们考虑到创建一个二维数组来,同时考存放棋组,同时考虑到之后我们会对于该棋盘进行长或宽的修改,我们可以将棋盘的长和宽定义为宏,放在头文件里,便于以后可能会进行的修改。(如下图)
其次,我们开始创建二维数组和进行初始化棋盘,并且对我们的棋盘的外型上进行修饰,再开始游戏。
游戏规则:由玩家和电脑进行交替下棋,直到有一方获胜,或者双方成平局停止游戏。
游戏板块的设计
1.完成棋盘的初始化和设计
由于游戏的实现需要往二维数组中存放相应的棋子,我们不妨将二维数组初始化为空格
void InitBorad(char board[ROW][COL], int row, int col)//二维数组的形参这样写
{int i = 0;int j = 0;for (i = 0; i < row; i++)//数据的行和列可能不是一样的,所以需要这样写,i打印行,j打印{for (j = 0; j < col; j++){board[i][j] = ' ';}}
}
之后我们要进行棋盘的设计,我的想法是将它设计为为这样(有横杠和竖杠隔开的模样)
由于我们的棋盘形状不确定,我们棋盘打印也应该写的比较灵活。
void PrintBrard(char board[ROW][COL], int row, int col)
{int i = 0, j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){printf(" %c ", board[i][j]);if (j < col - 1)printf("|");}printf("\n");//分隔行if (i < row - 1){for (j = 0; j < col; j++){printf("---");if (j < col - 1)printf("|");}printf("\n");}}
}
2.游戏环节过程的实现
本次的设计玩法为玩家和电脑轮流下棋,玩家输入相应的坐标,电脑则随机下棋。
玩家的回合
void player_move(char board[ROW][COL], int row, int col)
{printf("\n");printf("\n");printf("玩家下棋>");int x = 0;int y = 0;while (1){scanf("%d%d", &x, &y);if (x > 0 && x <= row && y > 0 && y <= col){if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '*';break;}else{printf("该位置已被占,请重新输入\n");}}else{printf("输入错误,请重新输入\n");}}
}
电脑的回合
//电脑下棋
void computer_move(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;printf("电脑下棋>\n");while (1){x = rand() % ROW;y = rand() % COL;if (board[x][y] == ' '){board[x][y] = '#';break;}}
}
注意事项:1.玩家或电脑输入坐标都需进行判断是为已被下棋或者超出棋盘范围。
2.采取生成随机坐标的方法,所以记得引头文件#include<time.h>和#include<stdlib.h>在test.c文件里生成时间戳。
srand((unsigned int)time(NULL));
3.游戏结束的判定
对于游戏的获胜的判定,我们知道当三行、三列或对角线连成相同的图案即为该图案拥有方获胜。对此,我采用了较为简单但也是相当直接的一种方式。
char is_win(char board[ROW][COL], int row, int col)
{int x = 0;//行的判断for (x = 0; x < row; x++){if (board[x][0] == board[x][1] && board[x][1] == board[x][2] && board[x][0] != ' ')return board[x][0];}//列的判断for (x = 0; x < col; x++){if (board[0][x] == board[1][x] && board[1][x] == board[2][x] && board[0][x] != ' ')return board[0][x];}//对角线判断if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')return board[0][0];if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')return board[0][2];if (1 == is_full(board, row, col)){return 'Q';}elsereturn 'C';
}
注意事项:需要排除三个空格相连获胜的情况。
好了,关于三子棋游戏的简单实现,我先讲到这里了,大家也可以自己动手试试看呢。
最后,欢迎大家找出错误和分享更加好的方法。