三子棋,顾名思义,就是三个子连成一串就算赢。
个人认为,三子棋的实现大概分为以下几个步骤:
1.你得搞一个棋盘。
棋盘其实很简单,首先定义一个数组(最好初始化为空格),printf一个漂亮的棋盘外围,然后把数组的各个元素也搬到printf里面就行了,我是这样实现的:
当然肯定不止这一种实现方法,具体根据自己喜好弄就行了。
2.玩家落子
玩家落子就是输入一个坐标,然后将坐标对应的数组元素改为x,o这种的,当然也可以用数字表示,我下一个字对写个1,也行。
当然这里面有一些注意的点,比如说数组的下标一边从0开始,但玩家一般没这习惯,就需要在代码里面做一些改变,比如说玩家不一定会按照你想的输入左边,输入个10 20 啥的。这都是一些具体的点,这里就不一一罗列了,我希望写出来的是整体的思想,框架,具体的点可以写的时候自己注意,也算是锻炼智慧。
3.判断输赢。
这个就是按照三子棋的具体规则来写了,我是这样写的,可能有些复杂,参考一下就好
char DetermineResult(char arr[ROW][COL]) { for (int i = 0; i < ROW; i++) { if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ') { return arr[i][0]; } } for (int i = 0; i < ROW; i++) { if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != ' ') { return arr[0][i]; } } if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ') { return arr[0][0]; } if (arr[2][0] == arr[1][1] && arr[1][1] == arr[0][2] && arr[2][0] != ' ') { return arr[2][0]; } for (int i = 0; i < ROW; i++) { for (int q = 0; q < COL; q++) { if (arr[i][q] == ' ') { return ' '; //继续。 } } }return 'A'; //和棋。 }
反正莫名其妙写了这么多,但是我估计也简化不了太多了。
值得注意的是,不要把所以的内容写到一个循环里面,不然很容易出现问题(这是我开始的时候犯的错误)。
4.电脑落子.
电脑落子涉及到的最重要的函数就是rand函数,也就是求随机数的函数,具体用法如下
srand(time(NULL));
rand()% t;
t是自己定的,比如说要求0-10,t就是10,srand是随机数的种子,rand函数其实是根据种子来进行一系列的计算得来的,所以种子一定不能相同,所以用的是时间戳,但是记得用时间戳得加上头文件time.h。
其他的就也是一些注意事项了,具体实现的时候自己把握就行。
5.再次判断输赢.
这五步都实现了以后就是其他的注意事项了,比如说什么,没什么好说的,看代码就知道了。
#define ROW 3 //行 #define COL 3 //列 #define _CRT_SECURE_NO_WARNINGS #include#include void Player(char arr[ROW][COL]) { while (1) { int t = 0; int m = 0; scanf("%d %d", &t, &m); if (t <= 0 || t >= 4 || m <= 0 || m >= 4) { printf("重新输入!n"); } else if (arr[t - 1][m - 1] != ' ') { printf("上面有棋子了!n"); } else { arr[t - 1][m - 1] = 'o'; break; } } } void InitBoard(char arr[ROW][COL]) { for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { arr[i][j] = ' '; } } } void ShowBoard(char arr[ROW][COL]) { printf(" | 1 | 2 | 3 |n"); int i = 0; for (; i < ROW; i++) { printf("__+__+___+___+n"); printf("%d | %c| %c | %c |n", i + 1, arr[i][0], arr[i][1], arr[i][2]); } } char DetermineResult(char arr[ROW][COL]) { for (int i = 0; i < ROW; i++) { if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ') { return arr[i][0]; } } for (int i = 0; i < ROW; i++) { if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != ' ') { return arr[0][i]; } } if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ') { return arr[0][0]; } if (arr[2][0] == arr[1][1] && arr[1][1] == arr[0][2] && arr[2][0] != ' ') { return arr[2][0]; } for (int i = 0; i < ROW; i++) { for (int q = 0; q < COL; q++) { if (arr[i][q] == ' ') { return ' '; //继续。 } } }return 'A'; //和棋。 } int PrintResult(char a, int* p) { if (a == 'o') { printf("你赢了!n"); return 1; } else if (a == 'x') { printf("电脑赢了!n"); *p = 0; } else if (a == 'A') { printf("你和电脑五五开!n"); return 1; } } void Computer(char arr[ROW][COL]) { int tmp = 1; while (tmp) { srand((unsigned)time(NULL)); int s = rand() % 3; int n = rand() % 3; if (arr[s][n] == 'o') { tmp = 1; } else if (arr[s][n] == 'x') { tmp = 1; } else { arr[s][n] = 'x'; tmp = 0; } } } int main() { printf("************************n"); printf("****** 1.开始游戏 ******n"); printf("****** 2.退出游戏 ******n"); printf("************************n"); char arr[ROW][COL]; InitBoard(arr); //初始化棋盘元素为空格。 int a = 0; scanf("%d", &a); if (a == 1) { ShowBoard(arr); //展示棋盘,供玩家选择。 printf("请选择坐标,用空格隔开,直接点是不行滴,小黑框框没那能力...n"); int count = 1; while (count) { printf("玩家落子n"); Player(arr); char c = DetermineResult(arr); //判断输赢,并返回赢家。 ShowBoard(arr); if (PrintResult(c, &count) == 1) break; printf("电脑落子n"); Computer(arr); ShowBoard(arr); char b = DetermineResult(arr); //判断输赢,并返回赢家。 PrintResult(b, &count); //输出输赢。 } } else if (a == 2) { printf("游戏结束!n"); } else { printf("功能简单,不知道您的意思!n"); } }
最后,这个使用vs实现的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)