在这里面,用了while循环来实现玩家对下棋坐标的多组输入!
在该段代码,用if语句嵌套if语句,实现多组判断相互交错模式,简洁易懂!
玩家下棋,输入要下棋的坐标,将输入‘*’(字符星号)
下面将进行电脑下棋,电脑实现下棋,也是下在了数组里面!也不能实现坐标不合法,被占用现象....
但是电脑下棋需要进行判断,如果下一步就能赢得话,将会在哪儿下棋,如果下棋赢不了的话,那就得分析别人下棋可能会赢,如果发现别人下棋马上就要赢了,那首先就得堵别人,如果别人赢不了,我有机会赢得话,就得先自己下.............所以电脑要进行一些列的分析,然后才能进行正确的下棋!
但是要是进行如此去操作,将会将电脑设置的太复杂(阿尔法狗系列),暂时不是笔者想要的程度,笔者仅仅是想实现对电脑能够随机下棋就可以,因此就借助了时间戳:rand 和srand俩个函数,来实现对电脑上面唯一时刻保持变换的东西进行改变,从而实现电脑随机下棋的目的预判!
电脑随机下棋方法,用时间戳来将电脑在棋盘上哪里空着就在那里下棋!
下面是笔者进行电脑下棋的逻辑:
// //电脑随机下棋 // void computer_move(char board[ROW][COL], int row, int col) { printf("电脑下棋:>\n"); //0~32726 //%3-->0~2 while (1) { int x = rand() % row; int y = rand() % col; if (board[x][y] == ' ') { board[x][y] = '#'; break; } } }
在这里面,最为重要的就是while循环里面的代码块!
下面笔者来分析一下:
while (1) { int x = rand() % row; int y = rand() % col; if (board[x][y] == ' ') { board[x][y] = '#'; break; } }
while(1);1为非0,判断结果即为真,一直可以进行循环, int x = rand() % row; int y = rand() % col; 利用时间戳进行:行列坐标的输入,所输入的值一定比行列坐标小,并且还大于等于0;利用取余运算符,实现了对坐标输入是否合法性的判断;在循环中,if语句进行了判断,如果电脑随机生成的坐标为‘ ’空格,则进行输出‘#’(井号),如果不是‘ ’空格,将会再次进行循环,随机生成坐标,然后再次if语句判断.........一直进行下去,直到输入成功!!
在这里我们可以看出来,玩家跟电脑都已经下棋成功!
一直到此,棋盘已经下满,并且玩家已经赢了,第一行全部为玩家棋子,所以.......
下面将进行预判!
规则:
每一行,每一列,或者对角线都是一样的,一方将会赢!
一共四个状态:判断输赢(玩家赢,电脑赢),平局(棋盘满),游戏继续
设一个函数,来判断棋盘的情况!然后就这样..........
玩家赢输出‘*’(星号);
电脑赢输出'#'(井号);
平局了输出‘Q’;
游戏继续输出‘C’;
因此,总的方面已经概况,至于其他详细细节请参考总代码!
//如果棋盘满了,返回1 //不满,返回0 static int is_full(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++) { int j = 0; for (j = 0; j < col; j++) { if (' ' == board[i][j]) { return 0; } } } return 1; } char is_win(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++) { if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ') { return board[i][0]; } } for (i = 0; i < col; i++) { if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ') { return board[0][i]; } } if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ') { return board[1][1]; } if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ') { return board[1][1]; } //判断平局 if (is_full(board, row, col) == 1) { return 'Q'; } //继续 return 'C'; }
在这里面,实现了对以上情况的具体分析,因版本内容所致,笔者将不再进行过多的讲述,更多详细细节,请联系笔者!
对于上述截图,我想读者都能看出来,该游戏已经能够成功的实现出来,并且符合我们的要求!
下面将是玩三子棋小游戏是整个代码,以供读者参考借鉴
test.c文档内容
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void menu() { printf("*********************************\n"); printf("******** 1. play ********\n"); printf("******** 0. exit ********\n"); printf("*********************************\n"); } void game() { char ret = 0; //数据的存储需要一个3*3的二维数组 char board[ROW][COL] = { 0 }; init_board(board, ROW, COL); display_board(board, ROW, COL); //玩游戏 while (1) { player_move(board, ROW, COL); display_board(board, ROW, COL); ret = is_win(board, ROW, COL); if (ret != 'C') break; computer_move(board, ROW, COL); display_board(board, ROW, COL); ret = is_win(board, ROW, COL); if (ret != 'C') break; } if (ret == '*') { printf("玩家赢\n"); } else if (ret == '#') { printf("电脑赢\n"); } else if (ret == 'Q') { printf("平局\n"); } display_board(board, ROW, COL); } //玩家赢 - '*' //电脑赢 - '#' //平局了 - 'Q' //游戏继续 - 'C' int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请选择:>"); scanf_s("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("选择错误,重新选择!\n"); break; } } while (input); return 0; }
game.h文档内容
#pragma once #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROW 10 //行 ,可以自定义数值的大小 #define COL 10 //列 ,可以自定义数值的大小 //初始化棋盘 void init_board(char board[ROW][COL], int row, int col); //打印棋盘 void display_board(char board[ROW][COL], int row, int col); //玩家下棋 void player_move(char board[ROW][COL], int row, int col); //电脑下棋 void computer_move(char board[ROW][COL], int row, int col); //判断游戏状态 char is_win(char board[ROW][COL], int row, int col);
game.c文档内容
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void init_board(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { board[i][j] = ' '; } } } //void display_board(char board[ROW][COL], int row, int col) //{ // int i = 0; // for (i = 0; i < row; i++) // { // //数据 // printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]); // //---|---|--- // if(i<row-1) // printf("---|---|---\n"); // } //} void display_board(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++) { //数据 //printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]); int j = 0; for (j = 0; j < col; j++) { printf(" %c ", board[i][j]); if (j < col - 1) printf("|"); } printf("\n"); //---|---|--- if (i < row - 1) { //printf("---|---|---\n"); for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) printf("|"); } printf("\n"); } } } void player_move(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("玩家下棋:>\n"); while (1) { printf("请输入要下棋的坐标:>"); scanf_s("%d %d", &x, &y); //1.坐标的合法性 //2.坐标是否被占用 if (x >= 1 && x <= row && y >= 1 && 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) { printf("电脑下棋:>\n"); //0~32726 //%3-->0~2 while (1) { int x = rand() % row; int y = rand() % col; if (board[x][y] == ' ') { board[x][y] = '#'; break; } } } //如果棋盘满了,返回1 //不满,返回0 static int is_full(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++) { int j = 0; for (j = 0; j < col; j++) { if (' ' == board[i][j]) { return 0; } } } return 1; } char is_win(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++) { if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ') { return board[i][0]; } } for (i = 0; i < col; i++) { if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ') { return board[0][i]; } } if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ') { return board[1][1]; } if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ') { return board[1][1]; } //判断平局 if (is_full(board, row, col) == 1) { return 'Q'; } //继续 return 'C'; }
在这里笔者用了三个文件,一个头文件game.h ;两个源文件game.c,test.c来实现该三子棋的代码!
到此为止,该段已经结束!