#include"game.h"//引用自己做的头文件,之后的函数引用都会在里面进行
void menu()//菜单函数
{
printf("###################################\n");
printf("#######1.play 0.east###########\n");
printf("###################################\n");
}
void game()//游戏实现的主体
{
char ret = 0;
char board[Row][Col] = { 0 };//创建一个数组
Initboard(board, Row, Col);//对棋盘进行初始化,为了再次游戏做准备
disboard(board, Row, Col);//打印棋盘
while (1)//玩家和电脑下棋
{
Playerboard(board, Row, Col);//玩家下棋
disboard(board, Row, Col);//下完棋之后我们是看不见的,所以又要打印棋盘
ret = iswin(board, Row, Col);//下完之后就得判断是否有人胜出
if (ret != 'c')//如果已经出现结果,跳出循环
{
break;
}
Computerboard(board, Row, Col);//电脑下棋
disboard(board, Row, Col);
ret = iswin(board, Row, Col);
if (ret != 'c')
{
break;
}
}
if (ret == '*')//以下是判断结果谁胜出,或是平局;然后游戏结束
{
printf("玩家胜利\n");
}
else if (ret == '#')
{
printf("电脑胜利\n");
}
else
{
printf("平局\n");
}
}
main()//从这里开始
{
int input =3;
srand((unsigned int)time(NULL));//后面要用到的时间戳种子
do//函数至少要执行一次,用到do while循环
{
int q = 0;
menu();
scanf("%d", &input);//选择是否进入游戏
while ((q = getchar()) != '\n')//若是输入的不是数字,可以将其吸收掉,不至于进入死循环
{
;//只做到吸收的目的,实际不打印
}
switch (input)//对输入的选择进行判断
{
case 1:
game();//游戏的主体函数
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("重新输入\n");
break;
}
} while (input);//根据选择判断是否再次游戏,或是退出
}
这是主函数代码
#include"game.h"//也要引用头文件
void Initboard(char board[Row][Col], int row, int col)//数组的初始化
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
board[i][j] = ' ';//将数组中全部放入空格
}
}
}
void disboard(char board[Row][Col], int row, int col)//打印棋盘,解析会太多,自己体会
{
for (int i = 0; i < row; i++)//打印每列
{
for (int j = 0; j < col; j++)//打印每行
{
printf(" %c ", board[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
if (i < row - 1)
{
for (int x = 0; x < col; x++)
{
printf("---");
if (x < col - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
void Playerboard(char board[Row][Col], int row, int col)//玩家下棋函数
{
int a = 0;
int b = 0;
printf("玩家下棋:\n");
while (1)//直到玩家输入正确的坐标后终止
{
int v = 0;
scanf("%d%d", &a, &b);//输入要下的坐标
while ((v = getchar()) != '\n')//跟主函数的一样
{
;
}
if (a >= 1 && a <= row && b >= 1 && b <= col)//判断输入的坐标是否符合棋盘要求的坐标
{
if (board[a - 1][b - 1] == ' ')//判断坐标是否被占用
{
board[a - 1][b - 1] = '*';//用特定的字符表示玩家下过的坐标
break;
}
else
{
printf("该坐标已被占用\n");
}
}
else
{
printf("输入错误,请重新输入\n");
}
}
}
void Computerboard(char board[Row][Col], int row, int col)//电脑下棋函数
{
while (1)//直到下正确坐标后循环终止
{
int a = rand() % row;//随机生成
int b = rand() % col;
printf("电脑下棋:\n");
if (board[a][b] == ' ')//判断是否被占用
{
board[a][b] = '#';
break;
}
}
}
char iswin(char board[Row][Col], int row, int col)//判断谁赢函数
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)//判断每行
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
{
return board[i][1];
}
}
for (j = 0; j < col; j++)//判断每列
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
{
return board[1][j];
}
}
//判断斜线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
for (i = 0; i < row; i++)//判断棋盘是否已经满了
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')//只要找到空格说明棋盘还没满
{
return 'c';
}
}
}
return '@';//否则就说明棋盘满了
}
这是函数实现的代码
#pragma once
#define Row 3//使用宏定义共三行
#define Col 3//使用宏定义共三列
#include"stdio.h"
#include"time.h"
#include"stdlib.h"
//引用各类函数,起到链接的作用
void Initboard(char board[Row][Col], int row, int col);
void disboard(char board[Row][Col], int row, int col);
void Playerboard(char board[Row][Col], int row, int col);
void Computerboard(char board[Row][Col], int row, int col);
char iswin(char board[Row][Col], int row, int col);
这是头文件代码
打印棋盘的目标模样:
值得注意的是这是一段对之前基础巩固的的代码,将他敲出来,这无疑是一段令人无比激动的经历
再接再厉吧