1、完成三子棋程序
2、程序:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void Init();
void PrintfChessBoard();
void PlayerMove();
void ComputerMove();
char CheckWinner();
int IsFull();
#define MAX_ROW 3
#define MAX_COL 3
char chess_board[MAX_ROW][MAX_COL];//用来定义棋盘的初始化
char winner;
int main()
{
//1、初始化一个3*3的期盼,用空格表示
Init();
while (1)
{
//2、打印当前的棋盘
PrintfChessBoard();
//3、玩家落子,输入坐标(用x表示玩家落子)
PlayerMove();
//4、判断胜负,打印棋盘
winner = CheckWinner();
if (winner != ' ')
{
break;
}
PrintfChessBoard();
//5、电脑随机落子(用o表示玩家落子)
ComputerMove();
//6、判断胜负
//用'x'表示玩家赢,用'o'表示电脑赢,用' '(空格)表示胜负未分,用q表示和棋
winner = CheckWinner();
if (winner != ' ')
{
break;
}
}
//7、回到第二步
PrintfChessBoard();
if (winner == 'x')
{
printf("恭喜你,你赢了!\n");
}
else if (winner == 'o')
{
printf("很遗憾,你输了!\n");
}
else
{
printf("和棋!\n");
}
system("pause");
return 0;
}
void Init()
{
int i, j;
for (i = 0; i < MAX_ROW; i++)
{
for (j = 0; j < MAX_COL; j++)
{
chess_board[i][j] = ' ';
}
}
}
void PrintfChessBoard()
{
for (int i = 0; i < MAX_ROW; i++)
{
printf("+---+---+---+\n");
printf("| %c | %c | %c |\n", chess_board[i][0], chess_board[i][1], chess_board[i][2]);
}
printf("+---+---+---+\n");
}
void PlayerMove()
//两种情况:一种是输入越界,另一种是输入有子,需重新输入
{
printf("请玩家落子!\n");
while (1)
{
int row = 0, col = 0;
//row表示行,col表示列
scanf("%d %d", &row, &col);
if (row < 0 || row > MAX_ROW || col < 0 || col > MAX_COL)
{
printf("输入有误,请重新输入!\n");
continue;//跳出当前这一次的循环,进入下一次循环
}
if (chess_board[row][col] != ' ')
{
printf("输入位置有子,需重新输入!\n");
continue;
}
chess_board[row][col] = 'x';
break;
}
}
void ComputerMove()
{
printf("电脑落子!\n");
while (1)
{
int row = 0, col = 0;
//种子数
srand((unsigned int) time( 0));
row = rand() % MAX_ROW;
col = rand() % MAX_COL;
//row表示行,col表示列
if (chess_board[row][col] != ' ')
{
//printf("输入位置有子,需重新输入!\n");
//无需提醒电脑输入有误!
continue;
}
chess_board[row][col] = 'o';
break;
}
}
char CheckWinner()
{
//1、检测所有行
for (int row = 0; row < MAX_ROW; row++)
{
if (chess_board[row][0] != ' '
&&chess_board[row][0] == chess_board[row][1] && chess_board[row][0]==chess_board[row][2])
{
return chess_board[row][0];
}
}
//2、检测所有列
for (int col = 0; col < MAX_COL; col++)
{
if (chess_board[0][col] != ' '
&&chess_board[0][col] == chess_board[1][col] && chess_board[0][col]==chess_board[2][col])
{
return chess_board[0][col];
}
}
//3、检测对角线元素
if (chess_board[0][0] != ' '
&&chess_board[0][0] == chess_board[1][1] && chess_board[0][0]==chess_board[2][1])
{
return chess_board[0][0];
}
if (chess_board[2][0] != ' '
&&chess_board[2][0] == chess_board[1][1] && chess_board[2][0]==chess_board[0][2])
{
return chess_board[0][0];
}
//4、和棋
else if (IsFull())
{
return 'q';
}
return ' ';
}
int IsFull()
{
//和棋返回1,否则返回0
for (int row = 0; row < MAX_ROW; row++)
{
for (int col = 0; col < MAX_COL; col++)
{
if (chess_board[row][col] == ' ')
{
return 0;
}
}
}
return 1;
}
3、结果: