- 准备阶段:
创建3个文件("game.c","text.c","game.h")
-
game.c用来存放函数的定义(实现) -
text.c用来存放主函数和主程序 -
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);