1.创建一个头文件，两个源文件

game.h中放包含的头文件和自定义函数的声明，game.c中放游戏的算法实现，test.h中放游戏逻辑地实现。

2.为游戏设计一个简单的菜单

`void menu(){  printf("*********************\n");  printf("***1.play   0.exit***\n");  printf("*********************\n");}`

`void test(){  int input = 0;  do  {    menu();    printf("请输入：>");    scanf("%d/n", &input);    switch (input)    {    case 1:      game();      break;    case 0:      printf("退出游戏\n");      break;    default:      printf("选择错误，请重新选择\n");      break;    }  } while (input);}int`

3.打印棋盘，并将棋盘初始化

`//初始化棋盘，变成空白void IntiBoard(char board[ROW][COL], int row, int col){  int i = 0;  int j = 0;  for (i = 0; i < row; i++)  {    for (j = 0; j < col; j++)    {      board[i][j] = ' ';    }  }}//打印棋盘void DisplayBoard(char board[ROW][COL], int row, int col){  int i = 0;  for (i = 0; i < row; i++)  {    int j = 0;    for (j = 0; j < col; j++)    {      //打印一行数据      printf(" %c ",board[i][j]);      if (j < col - 1)        printf("|");    }    printf("\n");    //打印分隔行    if (i < row - 1)    {      for (j = 0; j < col; j++)      {        printf("---");        if (j < col - 1)          printf("|");      }    }    printf("\n");  }}`

`void PlayerMove(char board[ROW][COL], int row, int col){  int x = 0;  int y = 0;  printf("玩家走:>\n");  while (1)  {    printf("请输入要下的坐标:>");    scanf("%d %d", &x, &y);    //判断坐标合法性    if (x >= 1 && x <= row && y >= 1 && y <= col)    {      if (board[x - 1][y - 1] == ' ')      {        board[x - 1][y - 1] = '*';        break;      }      else      {        printf("坐标被占用\n");      }    }    else    {      printf("坐标非法，请重新输入:>\n");    }  }}`

`void ComputerMove(char board[ROW][COL], int row, int col){  int x = 0;  int  y = 0;  printf("电脑走:>\n");  while (1)  {    x = rand() % row;    y = rand() % col;    if (board[x][y] == ' ')    {      board[x][y] = '#';      break;    }  }}`

//玩家赢   '*'

//电脑赢   '#'

//平局     'Q'     棋盘满了

//继续     'C'

`//返回1棋盘满了//返回0棋盘没满int  IsFull(char board[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 (board[i][j] == ' ')      {        return 0;      }    }  }  return 1;   //满了}char IsWin(char board[ROW][COL], int row, int col){  int i = 0;  //判断三行  for (i = 0; i < row; i++)  {    if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')    {      return board[i][1];    }  }  //判断三列  for (i = 0; i < col; i++)  {    if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')    {      return board[1][i];    }  }  //判断对角线  if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')  {    return board [1][1];  }  if (board[2][0] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')  {    return board[1][1];  }  //判断平局  if (1 == IsFull(board, ROW, COL))  {    return 'Q';  }  return 'C';}`

test.c

`#include <stdio.h>#include "game.h"void menu(){  printf("*********************\n");  printf("***1.play   0.exit***\n");  printf("*********************\n");}void game(){  char ret = 0;  char board[ROW][COL] = { 0 };  //初始化棋盘  IntiBoard(board, ROW, COL);  //打印棋盘  DisplayBoard(board, ROW, COL);  while (1)  {    //玩家走    PlayerMove(board, ROW, COL);    DisplayBoard(board, ROW, COL);    //判断玩家赢    ret = IsWin(board,ROW,COL);    if (ret != 'c')    {      break;    }    //电脑走    ComputerMove(board, ROW, COL);    DisplayBoard(board, ROW, COL);    //判断电脑赢    ret = IsWin(board,ROW,COL);    if (ret != 'c')    {      break;    }  }  if (ret == '*')    printf("玩家赢\n");  else if (ret == '#')    printf("电脑赢\n");  else    printf("平局\n");}void test(){  int input = 0;  srand((unsigned int)time(NULL));  do  {    menu();    printf("请输入：>");    scanf("%d/n", &input);    switch (input)    {    case 1:      game();      break;    case 0:      printf("退出游戏\n");      break;    default:      printf("选择错误，请重新选择\n");      break;    }  } while (input);}int main(){  test();  return 0;}`

game.h

`#include <stdio.h>#include <stdlib.h>#include <time.h>//函数声明void IntiBoard(char board[ROW][COL], int row, int col);void DisplayBoard(char board[ROW][COL], int row, int col);void PlayerMove(char board[ROW][COL], int row, int col);void ComputerMove(char board[ROW][COL], int row, int col);//玩家赢   '*'//电脑赢   '#'//平局     'Q'//继续     'C'char IsWin(char board[ROW][COL], int row, int col);`

game.c

`#include "game.h"//初始化棋盘，变成空白void IntiBoard(char board[ROW][COL], int row, int col){  int i = 0;  int j = 0;  for (i = 0; i < row; i++)  {    for (j = 0; j < col; j++)    {      board[i][j] = ' ';    }  }}//打印棋盘void DisplayBoard(char board[ROW][COL], int row, int col){  int i = 0;  for (i = 0; i < row; i++)  {    int j = 0;    for (j = 0; j < col; j++)    {      //打印一行数据      printf(" %c ",board[i][j]);      if (j < col - 1)        printf("|");    }    printf("\n");    //打印分隔行    if (i < row - 1)    {      for (j = 0; j < col; j++)      {        printf("---");        if (j < col - 1)          printf("|");      }    }    printf("\n");  }}void PlayerMove(char board[ROW][COL], int row, int col){  int x = 0;  int y = 0;  printf("玩家走:>\n");  while (1)  {    printf("请输入要下的坐标:>");    scanf("%d %d", &x, &y);    //判断坐标合法性    if (x >= 1 && x <= row && y >= 1 && y <= col)    {      if (board[x - 1][y - 1] == ' ')      {        board[x - 1][y - 1] = '*';        break;      }      else      {        printf("坐标被占用\n");      }    }    else    {      printf("坐标非法，请重新输入:>\n");    }  }}void ComputerMove(char board[ROW][COL], int row, int col){  int x = 0;  int  y = 0;  printf("电脑走:>\n");  while (1)  {    x = rand() % row;    y = rand() % col;    if (board[x][y] == ' ')    {      board[x][y] = '#';      break;    }  }}//返回1棋盘满了//返回0棋盘没满int  IsFull(char board[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 (board[i][j] == ' ')      {        return 0;      }    }  }  return 1;   //满了}char IsWin(char board[ROW][COL], int row, int col){  int i = 0;  //判断三行  for (i = 0; i < row; i++)  {    if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')    {      return board[i][1];    }  }  //判断三列  for (i = 0; i < col; i++)  {    if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')    {      return board[1][i];    }  }  //判断对角线  if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')  {    return board [1][1];  }  if (board[2][0] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')  {    return board[1][1];  }  //判断平局  if (1 == IsFull(board, ROW, COL))  {    return 'Q';  }  return 'C';}`