//game.h

#ifndef __GAME_H__

#define __GAME_H__


#define COLS 3

#define ROWS 3


void init_game(char arr[COLS][ROWS]);

void display_board(char arr[COLS][ROWS]);

void player_move(char arr[COLS][ROWS]);

void computer_move(char arr[COLS][ROWS]);

char check(char arr[COLS][ROWS]);



//test.c

#include <stdio.h>

#include "game.h"//引用game函数

#ifndef __GAME_H__

/*定义这两个宏是为了进行条件编译但是有时希望对

其中一部分内容只在满足一定条件才进行编译,

也就是对一部分内容指定编译的条件,

这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,

而当条件不满足时则编译另一组语句*/

#define __GAME_H__


#define COLS 3

#define ROWS 3


void init_game(char arr[COLS][ROWS]);//初始化数组

void display_board(char arr[COLS][ROWS]);//打印棋盘

void player_move(char arr[COLS][ROWS]);//玩家下棋

void computer_move(char arr[COLS][ROWS]);//电脑下棋

char check(char arr[COLS][ROWS]);//检查

int main()

{

char chess[COLS][ROWS];

char done = 0;

init_game(chess);

do

{

display_board(chess);

player_move(chess);

done = check(chess);

if (done != ' ')

{

break;

}

computer_move(chess);

done = check(chess);

} while (done == ' ');

if ('X' == done)

{

printf("玩家赢\n");

}

else if ('O' == done)

{

printf("电脑赢\n");

      }


return 0;

   }

//game.c

#include "game.h"

#include <stdio.h>

//第一个函数初始化数组

void init_game(char arr[COLS][ROWS])//初始化数组

{

int i = 0;

int j = 0;

for (i = 0; i < COLS; i++)

{

for (j = 0; j < ROWS; j++)

{

arr[i][j] = ' ';

}

}

}

//第二个函数打印棋盘

void display_board(char arr[COLS][ROWS])//打印棋盘

{

int i = 0;

for (i = 0; i < COLS; i++)

{

printf(" %c | %c | %c \n", 

arr[i][0],arr[i][1],arr[i][2]);

if (i != 2)

printf("---|---|---\n");

}

}

//第三个函数玩家输出旗子

void player_move(char arr[COLS][ROWS])

{

int x = 0, y = 0;

flag:

printf("请输入坐标>:");

scanf("%d%d", &x, &y);//玩家输入坐标


x = x - 1;

y = y - 1;

if ((x < 3) && (y < 3))

{

if (arr[x][y] == ' ')//判断如果坐标为空,则对应坐标点的值为x

{

arr[x][y] = 'X';

}

else

{

printf("坐标有误,请重新输入\n");//如果对应点的坐标已经被占用,则显示输入有误

goto flag;

//player_move(arr);

}

}

else

{

printf("坐标有误,请重新输入\n");//如果输入对应的坐标点(x>=3,y>=3)超出棋盘范围,则也显示坐标有误

goto flag;//转到flag再次重新输入

         //player_move(arr);

}

}

//第四个函数电脑输入棋子

void computer_move(char arr[COLS][ROWS])//

{

int i = 0;

int j = 0;

for (i= 0; i < COLS; i++)

{

for (j = 0; j < ROWS; j++)

{

if (arr[i][j] == ' ')//遍历数组如果存在空格,则给输入的坐标点赋值为0

{

arr[i][j] = '0';

goto flag;//否则转到flag继续重新输入

}

}

}

flag:

if (i*j == 9)

{

printf("平局\n");

}

}

//第五个函数检查是否有赢家产生

char check(char arr[COLS][ROWS])//检查函数当出现某一行或者某一列,或者对角线上有三个连续相同的x或0的时候则游戏结束

{

int i = 0;

for (i = 0; i < COLS; i++)

{

if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2])

{

return arr[i][0];

}

}

for (i = 0; i < ROWS; i++)

{

if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i])

{

return arr[0][i];

}

}

if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2])

{

return arr[0][0];

}

if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0])

{

return arr[1][1];

}

return ' ';

}