//三子棋2022.2.11
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
#include<time.h>
//如果要更改宏定义需要改whoWin();
#define ROW 3
#define COL 3
char whoWin(char board[ROW][COL], int row, int col) {
//判断输赢
for (int 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];
}else if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ') {
return board[0][i];
}else if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' '|| board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ') {
return board[1][1];
}
}
//平局
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (board[i][j] == ' ') {
return 'c';
}
}
}
//没有输赢也不能继续就是平局
return 'p';
}
void computer(char board[ROW][COL],int row,int col) {
int x;
int y;
srand((unsigned int)time(NULL));
while (1) {
x = rand() % row;
y = rand() % col;
if(board[x][y] == ' ') {
board[x][y] = '#';
break;
}
}
printf("电脑走>%d %d\n",x+1,y+1);
}
void player(char board[ROW][COL],int row,int col) {
int x;
int y;
//提示玩家输入坐标,得到坐标
while (1) {
printf("请玩家输入坐标 x,y >");
scanf("%d",&x);
scanf("%d",&y);
//检查坐标是否合法,修改棋盘
if (x >= 1 && x < row+1 && y >= 1 && y < col+1) {
if (board[x - 1][y - 1] == ' ') {
board[x - 1][y - 1] = '*';
break;
}else{
printf("请输入合法坐标\n");
}
}
else {
printf("请输入合法坐标\n");
}
}
}
void backGround(char board[ROW][COL],int row,int col) {
//打印数据行
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
printf(" %c ",board[i][j]);
if (j < col-1) {
printf("|");
}
}
printf("\n");
//打印分割行
if (i < row -1) {
for (int j = 0; j < col; j++) {
printf("___");
if (j < col - 1) {
printf("|");
}
}
}
printf("\n");
}
}
void new1(char board[ROW][COL],int row,int col) {
for (int i = 0; i < row;i++) {
for (int j = 0; j < col;j++) {
board[i][j] = ' ';
}
}
}
void game(char board[ROW][COL]) {
new1(board, ROW, COL);//初始化棋盘
backGround(board, ROW, COL);//打印棋盘
printf("坐标示例>1 1\n");
while(1){
player(board, ROW, COL);//玩家走
backGround(board, ROW, COL);//打印棋盘
if (whoWin(board, ROW, COL) != 'c') {
return;
}//判断是否继续
computer(board, ROW, COL);//电脑走
printf("电脑思考中...\n");
Sleep(1000);
backGround(board, ROW, COL);//打印棋盘
printf("坐标示例 (1 1)\n");
if (whoWin(board, ROW, COL) != 'c') {
return;
}//判断是否继续
}
return;
}
int main() {
int choose = 0;
int flag = 1;
int input = 0;
char board[ROW][COL];
while (flag) {
printf("------------------\n");
printf("----三子棋游戏----\n");
printf("----1、开始游戏---\n");
printf("----2、退出游戏---\n");
printf("------------------\n");
scanf("%d", &choose);
switch (choose) {
case 1:
game(board);
if (whoWin(board, ROW, COL) == '*') {
printf("玩家赢!\n");
}else if (whoWin(board, ROW, COL) == '#') {
printf("电脑赢!\n");
}else if(whoWin(board, ROW, COL) == 'p') {
printf("平局!\n");
}
flag = 0;
break;
case 2:
printf("退出游戏\n");
flag = 0;
break;
default:
printf("请输入正确的选择\n");
}
}
return 0;
}
01-14
204
07-05
523
11-24
560
10-01
412
10-03
488
10-04
523