三子棋本该在扫雷之前完成,但是做的时候觉得扫雷比较炫酷就先完成了扫雷,然后发现三子棋和扫雷实现过程还是有一定不同的.
与扫雷一样,三子棋也有几个步骤.
1.创建二维数组作为棋盘,三子棋只有九个格子所以创建3*3的棋盘就好了.
2.初始化棋盘,将棋盘全部初始化为’ '.
3.玩家输入坐标落子,这一步当中要判断坐标是否越界以及想要落子的坐标是否以及有子.
4.判断玩家落子后游戏是否结束.
5.电脑落子.这里要注意我们让电脑落子的方式是srand生成随机坐标,所以电脑下的每一个子之间是没有什么逻辑关联的,纯乱下,想让电脑获胜显得比让我们获胜更难.所以这种方式要是放在五子棋游戏中就会显得天花乱坠.
6.判断游戏是否结束
7.循环3至6步
代码实现:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_ROW 3
#define MAX_COL 3
void Init(char board[MAX_ROW][MAX_COL]){
for (int row = 0; row < MAX_ROW; ++row){
for (int col = 0; col < MAX_COL; ++col){
board[row][col] = ' ';
}
}
srand(time(NULL));
}
void Print(char board[MAX_ROW][MAX_COL]){
printf(" ---|---|---\n");
for (int row = 0; row < MAX_ROW; ++row){
printf("| %c | %c | %c |\n",
board[row][0], board[row][1], board[row][2]);
printf(" ---|---|---\n");
}
}
void PlayMove(char board[MAX_ROW][MAX_COL]){
while (1){
printf("请输入坐标(row col):\n");
int row = 0;
int col = 0;
scanf("%d %d", &row, &col);
if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL){
printf("您的输入有误!\n");
continue;
}
if (board[row][col]!=' '){
printf("这个位置已经有子了,请重新落子!\n");
continue;
}
board[row][col] = 'x';
break;
}
}
void ComputerMove(char board[MAX_ROW][MAX_COL]){
while (1){
int row = rand() % MAX_ROW;
int col = rand() % MAX_COL;
if (board[row][col] != ' '){
continue;
}
board[row][col] = 'o';
break;
}
}
int IsFull(char board[MAX_ROW][MAX_COL]){
for (int row = 0; row < MAX_ROW; ++row){
for (int col = 0; col < MAX_COL; ++col){
if (board[row][col] == ' '){
return 0;
}//棋盘没有满返回0
}
}
return 1;
}
char IsWin(char board[MAX_ROW][MAX_COL]){
for (int row = 0; row < MAX_ROW; ++row){
if (board[row][0] == board[row][1]
&& board[row][0] == board[row][2]
&& board[row][0] != ' '){
return board[row][0];
}
}
for (int col = 0; col < MAX_COL; ++col){
if (board[0][col] == board[1][col]
&& board[0][col] == board[2][col]
&& board[0][col] != ' '){
return board[0][col];
}
}
if (board[0][0]==board[1][1]
&&board[0][0]==board[2][2]
&&board[0][0]!=' '){
return board[0][0];
}
if (board[0][2] == board[1][1]
&& board[0][2] == board[2][0]
&&board[0][2] != ' '){
return board[0][2];
}
if (IsFull(board)){
return '=';
}
return ' ';
}
int main(){
char chess_board[MAX_ROW][MAX_COL];
Init(chess_board);
char result = ' ';
while (1){
Print(chess_board);
PlayMove(chess_board);
result = IsWin(chess_board);
if (result != ' '){
break;
}
ComputerMove(chess_board);
result = IsWin(chess_board);//判定游戏是否结束
if (result != ' '){
break;
}
}
if (result == 'x'){
Print(chess_board);
printf("Winner!\n");
}
else if (result == 'o'){
Print(chess_board);
printf("Loser!\n");
}
else{
Print(chess_board);
printf("卢本伟牛逼!\n");
}
system("pause");
return 0;
}