一.思路分享(源码在最后)
首先从main函数开始
1)我们首先要打印菜单,可以参考我的菜单
void menu() { printf("******************\n"); printf("***** 1.开始 *****\n"); printf("***** 0.退出 *****\n"); printf("******************\n"); }
因为我们可能要玩多局,所以,我们需要循坏报括它
2)之后就是做选择了,我们需要switch来帮助判断,if也可以
int choose; do { menu(); scanf("%d", &choose); switch (choose) { case 0: printf("正在退出\n"); break; case 1:game(); break; default: printf("没有这个输入选项,请重新输入\n"); } } while (choose);
3)选择游戏之后我们就要开始写游戏的细节了
游戏首先需要棋盘,和棋子,棋子我建议用二维数组代替,一开始用空白格填充,那我们就需要一个函数初始化函数,初始化函数只要一个循坏嵌套就行了,参数需要数组和数组大小就能实现
void init(char arr[Row][Col], int row, int col) { int i, j; for (i = 0; i < row; i++) for (j = 0; j < col; j++) arr[i][j] = ' '; }
4)接下来就是打印棋盘了,棋盘格式自定,行,列和胜利时的棋子数的定义建议用宏定义,可以参考我的
#define Row 10//改变棋盘行数 #define Col 10//改变棋盘列数 #define Times 5//改变胜利棋子数 void menu1(char arr[Row][Col], int row, int col) { int i, j; for (j = 0; j < row; j++) { for (i = 0; i < col; i++) { printf(" %c ", arr[j][i]); if (i < row - 1) printf("|"); } printf("\n"); if(j<row-1) for (i = 0; i < col; i++) { printf("---"); if (i < col - 1) printf("|"); } printf("\n"); } }
效果如下
5) 接下来实现人下棋,实际就是给数组赋值(不为空,并且位于数组里面)
void playmove(char arr[Row][Col], int row, int col) { int x, y; while (1) { printf("玩家下棋->"); scanf("%d%d", &x, &y); printf("\n"); if (x < row + 1 && y < col + 1 && arr[x-1][y-1] == ' ') { arr[x-1][y-1] = '*'; break; } else printf("输入错误或者输入的位置已经被下过,请重新下棋\n"); } }
6)然后就是电脑下棋,用随机值赋值(要为空并且属于数组里面),随机值的设定可以参考我的文章
void computermove(char arr[Row][Col], int row, int col) { while (1) { int x = rand() % row; int y = rand() % col; if (arr[x][y] == ' ') { arr[x][y] = '#'; break; } } }
因为每下一步棋电脑和人都可能赢了,所以我们每下一部棋多要判断并打印棋盘
判断代码:如果棋盘满了返回Q(平局),C(继续),*(人胜利),#(电脑胜利)
我分了六个部分判断是否有人赢
第一个部分判断是否每一行有足够相同字符
for (i = 0; i < row; i++) { for (j = 0, flag = 0; j < col; j++) { if (arr[i][j] == arr[i][count]&&arr[i][count]!=' ') flag++; else { flag = 0; count = j; } if (flag == times)return arr[i][j]; }
第二个部分检查每一列
for (i = 0; i < col; i++) { for (j = 0, flag = 0; j < row; j++) { if (arr[j][i] == arr[count][j] && arr[j][i] != ' ') flag++; else { flag = 0; count = j; } if (flag == times)return arr[i][j]; } }
第三个部分
for (i=0; i < row; i++) { flag = 0; j = 0; count = 0; count1 = i; k = i; while (k < row && j < col) { if (arr[k][j] == arr[count1][count]&& arr[count1][count]!=' ') flag++; else { flag = 0; count = j; count1 = k; } if (flag == times)return arr[count1][count]; k++; j++; } }
第四个部分
for (i = 0; i < row; i++) { flag = 0; j = 0; count = col-1; count1 = i; k = i; while (k < row && j < col) { if (arr[k][j] == arr[count1][count]&&arr[k][j]!=' ') flag++; else { flag = 0; count = j; count1 = k; } if (flag == times)return arr[count1][count]; k++; j--; } }
第五个部分
for (i = 0, j = col - 1; j > 0; j--) { flag = 0; i = 0; count = j; count1 = 0; k = j; while (k < col && i<row) { if (arr[i][k] == arr[count1][count]&& arr[count1][count]!=' ') flag++; else { flag = 0; count = k; count1 = i; } if (flag == times)return arr[count1][count]; k--; i++; } }
第六个部分
for (i = 0,j=0; j < col; j++) { flag = 0; i = 0; count = j; count1 = i; k = j; while (i < row && k < col) { if (arr[i][k] == arr[count1][count]&&arr[i][k]!=' ') flag++; else { flag = 0; count = k; count1 = i; } if (flag == times)return arr[count1][count]; k++; i++; } }
7)最后遍历一次即可判断完成
for (i = 0; i < row; i++) for (j = 0; j < col; j++) if (arr[i][j] != ' ')count++; else break; if (count == row * col)return 'Q'; else return 'C';