代码在电脑中存放时间有点久了,先把代码写一下,后边有空加图解与注释。
代码实现:
game.h文件:
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef _GAME_H_
#define _GAME_H_
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
enum OPTION
{
EXIT,
PLAY
};
#define COLS 3
#define ROWS 3
void init_board(char arr[ROWS][COLS], int row, int col);
void display(char arr[ROWS][COLS], int row, int col);
static int is_full(char arr[ROWS][COLS], int row, int col);
void play_move(char arr[ROWS][COLS], int row, int col);
void computer_move(char arr[ROWS][COLS]);
char is_win(char arr[ROWS][COLS], int row, int col);
#endif
game.c文件:
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void init_board(char arr[ROWS][COLS], int row, int col)
{
memset(arr, ' ', row*col);//函数用法不懂的可以在网上查找
}
void display(char arr[ROWS][COLS], int row, int col) //打印棋盘
{
int i = 0;
for (; i < row; i++)
{
printf(" %c | %c | %c \n", arr[i][0],\
arr[i][1], arr[i][2]);
if (i!=2)
{
printf("---|---|---\n");
}
}
}
static int is_full(char arr[ROWS][COLS], int row, int col) //初始化棋盘格子为空
{
int i = 0;
int j = 0;
for (; i < row; i++)
{
for (j= 0; j < col; j++)
{
if (arr[i][j] == ' ')
return 0;
}
}
return 'f';
}
void play_move(char arr[ROWS][COLS], int row, int col) //玩家下子
{
int i = 0;
int j = 0;
while (1)
{
printf("please local:");
scanf("%d%d", &i, &j);
if (((i >= 1) && (i <= 3)) && ((j >= 1) && (j <= 3))) //判断棋子的位置是不是为空
{
if (arr[i - 1][j - 1] = ' ')
{
arr[i - 1][j - 1] = 'X';
break;
}
else if (arr[i - 1][j - 1] = 'O')
{
printf("already...\n");
}
}
else
{
printf("error\n");
}
}
}
int check_full(char arr[ROWS][COLS]) //判是否棋盘满了
{
int i = 0;
int j = 0;
for ( i = 0; i < ROWS; i++)
{
for ( j = 0; j < COLS; j++)
{
if (arr[i][j] == ' ')
return 0;
}
}
return 1;
}
void computer_move(char arr[ROWS][COLS]) //电脑下子
{
printf("电脑下子位置;");
srand((unsigned)time(NULL));
while (1)
{
int i =( rand() % 3);
int j =( rand() % 3);
if (arr[i][j] == ' ')
{
printf("%d%d\n", i+1, j+1);
arr[i][j] = 'O';
break;
}
else
{
if (check_full(arr) == 0)
{
continue;
}
else
{
printf("平局了\n");
break;
}
}
}
}
char is_win(char arr[ROWS][COLS], int row, int col) //判赢
{
int i = 0; //玩家赢
for ( i = 0; i < row; i++)
{
if ((arr[i][0] == arr[i][1]) && \
(arr[i][1] == arr[i][2]) && \
(arr[i][1] != ' '))
return arr[i][0];
}
for (i = 0; i < col; i++)
{
if ((arr[0][i] == arr[1][i]) && \
(arr[1][i] == arr[2][i]) && \
(arr[0][i] != ' '))
return arr[0][i];
}
if ((arr[0][0] == arr[1][1]) && \
(arr[1][1] == arr[2][2]) && \
(arr[2][2] != ' '))
return arr[0][0];
if ((arr[0][2] == arr[1][1]) && \
(arr[1][1] == arr[2][0]) && \
(arr[2][0] != ' '))
return arr[1][1];
if (is_full(arr,row,col))
{
return 'f';
}
return ' ';
}
test.c文件:
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
#define program warning: C4013
void menu()
{
printf("****************************\n");
printf("*********0.EXIT ************\n");
printf("*********1.PLAY ************\n");
printf("****************************\n");
}
void game()
{
int ret = 0;
char arr[ROWS][COLS] = { 0 };
init_board(arr, ROWS, COLS);
display(arr, ROWS, COLS); //打印棋盘
srand((unsigned int)time(NULL)); //生成随机数,此处在这定义一个就可以了,不用放在循环中
while (1)
{
play_move(arr, ROWS, COLS);
if (ret = is_win(arr, ROWS, COLS) != ' ')
break;
display(arr, ROWS, COLS);
computer_move(arr);
if (ret = is_win(arr, ROWS, COLS) != ' ')
break;
display(arr, ROWS, COLS);
}
ret = is_win(arr, ROWS, COLS);
if (ret == 'X')
printf("恭喜玩家,你赢了\n");
if (ret == 'O')
printf("你好菜哦,你输了\n");
if (ret == 'f')
printf("平局\n");
display(arr, ROWS, COLS);
}
int main()
{
int input = 0;
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:game();
break;
case 0:
break;
default:
printf("error\n");
break;
}
} while (input);
return 0;
}