井字棋游戏

test.c

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include "game.h"
 4 //开始菜单
 5 void start()
 6 {
 7     printf("****************************\n");
 8     printf("**** 1. play     0.exit ****\n");
 9     printf("****************************\n");
10     printf("请选择:\n");
11 }
12 //游戏实现函数
13 void game()
14 {
15     char ret;
16     //利用二维数组创建棋盘
17     char board[ROW][COL] = { 0 };
18     //初始化棋盘,使棋盘刚开始的值为空格
19     InitBoard(board,ROW,COL);
20     //调用打印数组函数,display--显示
21     DisplayBoard(board,ROW,COL);
22     //开始下棋
23     while (1)
24     {
25         //玩家下棋
26         PlayerMove(board, ROW, COL);
27         DisplayBoard(board, ROW, COL);
28         //判断游戏状态
29         ret =IsWin(board,ROW,COL);
30         if (ret != 'C')
31         {
32             break;
33         }
34         //电脑下棋
35         ComputerMove(board, ROW, COL);
36         DisplayBoard(board, ROW, COL);
37         //判断游戏状态
38         ret =IsWin(board,ROW,COL);
39         if (ret != 'C')
40         {
41             break;
42         }
43     }
44     if (ret == '*')
45     {
46         printf("恭喜你赢了\n");
47     }
48     else if (ret == '#')
49     {
50         printf("很抱歉电脑赢了\n");
51     }
52     else
53     {
54         printf("旗鼓相当!\n");
55     }
56 }
57 int main()
58 {
59     int input = 0;//定义开始开关
60     srand((unsigned int)time(NULL));
61     do
62     {
63         start();//调用开始菜单
64         scanf("%d",&input);
65         switch (input)
66         {
67         case 1:
68             //printf("开始游戏\n");
69             game();//调用游戏
70             break;
71         case 0:
72             printf("退出游戏\n");
73             break;
74         default:
75             printf("请选择正确的选项\n");
76             break;
77         }
78 
79     } while (input);
80     return 0;
81 }

game.h

 1 //定义常量
 2 #define ROW 3
 3 #define COL 3
 4 //引入外部文件
 5 #include <stdio.h>
 6 #include <stdlib.h>
 7 #include <time.h>
 8 //申明初始化函数
 9 void InitBoard(char board[ROW][COL],int row,int col);
10 //申明打印数组函数
11 void DisplayBoard(char board[ROW][COL], int row, int col);
12 //申明玩家下棋函数
13 void PlayerMove(char board[ROW][COL],int row,int col);
14 //申明电脑下棋函数
15 void ComputerMove(char board[ROW][COL],int row ,int col);
16 //申明游戏状态函数
17 char IsWin(char board[ROW][COL],int row,int col);

game.c

  1 #define _CRT_SECURE_NO_WARNINGS
  2 
  3 #include "game.h"
  4 
  5 //初始化棋盘
  6 void InitBoard(char board[ROW][COL], int row, int col)
  7 {
  8     int i, j;
  9     for (i = 0; i < row; i++)
 10     {
 11         for (j = 0; j < col; j++)
 12         {
 13             board[i][j] = ' ';
 14         }
 15     }
 16 }
 17 //打印棋盘
 18 void DisplayBoard(char board[ROW][COL], int row, int col)
 19 {
 20     int i,j;
 21     for (i = 0; i < row;i++)
 22     {
 23         for (j = 0; j < col; j++)
 24         {
 25             printf(" %c ",board[i][j]);
 26             if (j < col - 1)
 27                 printf("|");
 28         }
 29         printf("\n");
 30         if (i < row - 1)
 31         {
 32             for (j = 0; j < col; j++)
 33             {
 34                 printf("---");
 35                 if (j < col - 1)
 36                 {
 37                     printf("|");
 38                 }
 39             }
 40         }
 41         printf("\n");
 42     }
 43 }
 44 
 45 //玩家下棋,棋子为*
 46 void PlayerMove(char board[ROW][COL], int row, int col)
 47 {
 48     int x,y;
 49     do
 50     {
 51         printf("请输入需要下棋的坐标:\n");
 52         scanf("%d%d", &x, &y);
 53         if ((x >= 1 && x <= 3 )&& (y >= 1 && y <= 3))
 54         {
 55             if (board[x - 1][y - 1] == ' ')
 56             {
 57                 board[x - 1][y - 1] = '*';
 58                 break;
 59             }
 60             else
 61             {
 62                 printf("您输入的位子已被占用,请从新输入\n");
 63             }
 64         }
 65         else
 66         {
 67             printf("您输入的位子不合法,请从新输入\n");
 68         }
 69     } while(1);
 70 }
 71 
 72 //电脑下棋
 73 void ComputerMove(char board[ROW][COL], int row, int col)
 74 {
 75     int x, y;
 76 
 77     printf("电脑走->\n");
 78     while (1)
 79     {
 80         x = rand() % row;
 81         y = rand() % col;
 82         if (board[x][y] == ' ')
 83         {
 84             board[x][y] = '#';
 85             break;
 86         }
 87     }
 88 }
 89 
 90 //判断游戏状态,'*'表示玩家赢,'#'表示电脑赢,'P'表示平局,'C'表示继续游戏
 91 char IsWin(char board[ROW][COL], int row, int col)
 92 {
 93     int i, j;
 94     //横三行
 95     for (i = 0; i < row;i++)
 96     {
 97         if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
 98             return board[i][1];
 99     }
100     //竖三列
101     for (i = 0; i < col; i++)
102     {
103         if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
104             return board[1][i];
105     }
106     //两条对角线
107     if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
108         return board[1][1];
109     if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
110         return board[1][1];
111     //继续游戏
112     for (i = 0; i < row; i++)
113     {
114         for (j = 0; j < col;j++)
115         {
116             if (board[i][j] == ' ')
117                 return 'C';
118         }
119     }
120     //平局状态
121     return 'P';
122 }

 

posted @ 2021-08-30 13:15  贞德窦  阅读(83)  评论(0)    收藏  举报