c语言游戏1-三子棋

153 阅读2分钟
  • 准备阶段:

创建3个文件("game.c","text.c","game.h")

  1. game.c用来存放函数的定义(实现)

  2. text.c用来存放主函数和主程序

  3. game.h用来存放函数的声明和各种库函数的头文件

    (在.c文件中包含该.h文件,.c文件使用库函数则不需要再次引用头文件)

    🔴每使用一个函数,需要声明一次,否则会发出警告

    🔴未定义函数时,使用函数,需要把函数定义(实现)放在它前面

各种函数的含义 text():游戏入口

Menu() :菜单

Game() :游戏步骤

Initboard() :初始化棋盘 (初始化一个二维数组,让里面的值全为' ')

Displayboard() :打印棋盘的形状

 //   |   |   
 //---|---|---
 //   |   |   
 //---|---|---
 //   |   |

Iswin() :判断游戏进行程度

(每一次落子都需要判断)

Isfull() :判断棋盘是否满了(平局或继续)

🔻"C"表示继续(continue)

🔻”Q“表示停止(quit)

 text.c
 ​
 #include"game.h"
     
 void Menu()
 {
     printf("***************************\n");
     printf("*****1.play     0.esit*****\n");
     printf("***************************\n");
     printf("请选择>>\n");
 }
 -------------------------------------------------
 void test()
 {
     int input;
     do
     {
         Menu();
         scanf_s("%d", &input);
         switch (input)
         {
         case 1:
             Game();
             break;
         case 0:
             printf("退出游戏");
             break;
         default:
             printf("重新选择");
             break;
         }
     } while (input);
 }
 -------------------------------------------------
 void Game()
 {
     char ret = 0;//用一个变量来接收返回值(判断局势(胜,负,平,继))
     char board[ROW][COL] = { 0 };
     Initboard(board, ROW, COL);
     Displayboard(board, ROW, COL);
     while (1)//下棋,无限循环
     {
         MANgo(board, ROW, COL);
         //打印并判断
         Displayboard(board, ROW, COL);
         ret = Iswin(board, ROW, COL);
         if(ret !='C')
         {
             break;
         }
         AIgo(board, ROW, COL);
         //打印并判断
         Displayboard(board, ROW, COL);
         ret = Iswin(board, ROW, COL);
         if(ret !='C')
         {
             break;
         }
     }
     //break跳出循环,得出游戏结论
     if(ret=='#')
     {
         printf("电脑胜利\n");
     }
     else if (ret == '*')
     {
         printf("玩家胜利\n");
     }
     else
     {
         printf("平局\n");
     }
 }
 -------------------------------------------------
 int main()
 {
     test();
     return 0;
 }
 game.c
 ​
 #include"game.h"
 ​
 void Initboard(char board[ROW][COL], int R, int C)
 {
     int i, j = 0;
     for (i = 0; i < R; i++)
     {
         for (j = 0; j < C; j++)
         {
             board[i][j] = ' ';
         }
     }
 }
 -------------------------------------------------
 void Displayboard(char board[ROW][COL], int R, int C)
 {
     int i, j = 0;
 //循环3次双打印
     for (i = 0; i < R; i++)  
     {
 //先打印"   |   |   "
         for (j = 0; j < C; j++)
         {
             printf(" %c ", board[i][j]);
             //保证只有两个"|""
             if (j < C - 1)
                 printf("|");
         }
         printf("\n");
 ​
 //再打印"---|---|---"
         //保证只有两个"---|---|---"
         if(i<C-1)
         {
         for (j = 0; j < C; j++)
         {
             printf("---");
             //保证只有两个"|"
             if (j < C - 1)
                 printf("|");
             }
             printf("\n");
         }
     }
 }
 -------------------------------------------------
 void AIgo(char board[ROW][COL], int R, int C)
 {
     int x, y = 0;
     printf("电脑回合\n");
     Sleep(250);
     while (1)
     {
     //srand与rand结合使用,用time来表示随机值(s)
         srand((unsigned int)time(NULL));
         //rand()取随机值,rand()%ROW/COL取0-2的值
         x = rand() % ROW;
         y = rand() % COL;
         if(board[x][y]==' ')
         {
             board[x][y] = '#';
             break;
         }
     }
 }
 -------------------------------------------------
 int Isfull(char board[ROW][COL], int R, int C)
 {
     int x, y;
     for (x = 0; x < ROW; x++)
     {
         for (y = 0; y < COL; y++)
         {
 ​
             if (board[x][y] == ' ')
                 return 0;
         }
     }
     return 1;
 }
 -------------------------------------------------
 char Iswin(char board[ROW][COL],int R,int C)
 {
     int i=0;//判断胜利的4种可能
 //横三
     for (i = 0; i < ROW; i++)
     {
         if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][2]!= ' ')
         {
             return board[i][0];
         }
     }
 //竖三
      for (i = 0; i < COL; i++)
      {
          if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[2][i]!= ' ')
          {
              return board[0][i];
          }
         }
 //斜三
         if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[2][2]!= ' ')
             return board[0][0];
 //斜三
         if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[2][0]!= ' ')
             return board[0][2];
 ​
 //当一方未胜利时
 //判断棋盘是否满了(平局),或者棋盘未满,继续游戏
         if (Isfull(board, ROW, COL))
             //返回0,为假,返回其他,为真
         {
             return 'Q';//平局
         }
             return 'C';//继续游戏
 ​
 }
 game.h
 ​
 #pragma once
 ​
 #include<stdio.h>
 #include <stdlib.h>
 #include<time.h>
 ​
 #define ROW 3
 #define COL 3
     
 void Displayboard(char board[ROW][COL], int R, int C);
 void Initboard(char board[ROW][COL], int R, int C);
 void MANgo(char board[ROW][COL], int R, int C);
 void AIgo(char board[ROW][COL], int R, int C);
 char Iswin(char board[ROW][COL], int R, int C);
 int Isfull(char board[ROW][COL], int R, int C);