注:玩家输入和电脑输入不要写在一个函数之内,否则不容易判断玩家输入是否赢以及电脑输入是否赢。所以我们将分别写两个函数Playermove和Computermove。
//geme.h
#ifndef __GAME_H__
#define __GAME_H__
#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
void menu();
void game(char arr[ROW][COL],int row,int col);
void Playermove(char arr[ROW][COL], int row, int col);
void Displaygame(char arr[ROW][COL], int row, int col);
char isWin(char arr[ROW][COL], int row ,int col);
int is_full(char arr[ROW][COL], int row, int col);
void Computermove(char arr[ROW][COL], int row, int col);
#endif //__GAME_H__
//test.c
#define _CRT_SECURE_NO_WARNINGS 1
//|---|---|---|
//| | | |
//|---|---|---|
//| | | |
//|---|---|---|
//| | | |
//|---|---|---|
#include "game.h"
#define ROW 3
#define COL 3
int main()
{
char arr[ROW][COL] = { 0 };
int input = 0;
srand((unsigned int )time(NULL)); //获取随机值,前提
do
{
menu(); //打印菜单
printf("玩游戏:1;退出游戏:0;>>\n");
scanf("%d", &input);
switch (input)
{
case 1:
game(arr,ROW,COL);
break;
case 0:
exit(1); //退出系统
break;
default:
printf("输入错误,请重新输入:>>\n");
}
} while (input);
system("pause");
return 0;
}
//game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
printf("****************************************\n");
printf("********** 1. play **********\n");
printf("********** 0. exit **********\n");
printf("****************************************\n");
}
int is_full(char arr[ROW][COL], int row, int col) //判断平局
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (arr[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
char isWin(char arr[ROW][COL], int row, int col) //判断谁赢
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][2]!=' ')
{
return arr[i][0];
}
}
for (i = 0; i < col; i++)
{
if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[2][j]!=' ')
{
return arr[0][j];
}
}
if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && arr[2][2] != ' ')
{
return arr[0][0];
}
else if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && arr[2][0] != ' ')
{
return arr[0][2];
}
else if (is_full(arr,ROW,COL) == 1)
{
return 'P';
}
else
{
return ' ';
}
}
void Displaygame(char arr[ROW][COL], int row, int col) //打印棋盘
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
printf("|---|---|---|\n");
for (j = 0; j < col; j++)
{
printf("| %c ", arr[i][j]);
}
printf("|");
printf("\n");
}
printf("|---|---|---|\n");
}
void Playermove(char arr[ROW][COL], int row, int col) //玩家走
{
int x = 0;
int y = 0;
printf("玩家走:>>");
scanf("%d%d", &x, &y);
if ((x >= 1 && x <= row) && (y >= 1 && y <= col))
{
while ((arr[x - 1][y - 1] != ' '))
{
printf("该坐标已被占用请重新输入坐标!>>");
scanf("%d%d", &x, &y);
while ((x<1 || x>row) || (y<1 || y>col))
{
printf("坐标非法\n");
printf("请重新输入坐标!>>");
scanf("%d%d", &x, &y);
}
}
arr[x - 1][y - 1] = '0';
}
else
{
while ((x<1 || x>row) || (y<1 || y>col))
{
printf("坐标非法\n");
printf("请重新输入坐标!>>");
scanf("%d%d", &x, &y);
while ((arr[x - 1][y - 1] != ' '))
{
printf("该坐标已被占用请重新输入坐标!>>");
scanf("%d%d", &x, &y);}
}
arr[x - 1][y - 1] = '0';
}
printf("\n");
}
void Computermove(char arr[ROW][COL], int row, int col) //电脑走
{
printf("电脑走:>>\n");
int a = rand() % 3;
int b = rand() % 3;
while (arr[a][b] != ' ')
{
a = rand() % 3;
b = rand() % 3;
}
arr[a][b] = 'X';
}
void game(char arr[ROW][COL], int row, int col)
{
memset(arr, ' ', row*col); //memset对数组初始化
Displaygame(arr, row, col);
char res = 0;
do
{
Playermove(arr, ROW, COL);
Displaygame(arr, row, col);
res = isWin(arr, row, col);
if (res != ' ') //判断玩家输入,如果返回不为空格则跳出循环
{
break;
}
Computermove(arr, ROW, COL);
Displaygame(arr, row, col);
res = isWin(arr, row, col); //在此判断电脑输入返回值
} while (res == ' ');
if (res == 'X')
{
printf("电脑赢\n");
}
else if (res == '0')
{
printf("玩家赢\n");
}
else if (res == 'P')
{
printf("平局\n");
}
}