头程序块
#define ROW 3//设定横坐标极值
#define COL 3//设定纵坐标极值
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void InitBoard(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);
char IsWin(char board[ROW][COL], int row, int col);
//1.玩家赢 *
//2.电脑赢 #
//3.平局 Q
//4.游戏继续 C
函数块
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void InitBoard(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;
int j = 0;
for (i = 0; i < row; i++)
{
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("请输入坐标:\n");
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)//电脑走一步
{
printf("电脑走:\n");
int x = 0;
int y = 0;
while (1)
{
x = rand() % row;//用srand()得到的随机横坐标值与row取余,以保证结果合法
y = rand() % col;//用srand()得到的随机纵坐标值与col取余,以保证结果合法
if (board[x][y] == ' ')//判断对应点是否为空格
{
board[x][y] = '#';//如果是,在对应点打应#
break;
}
}
}
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;
//如果有,返回0,继续下棋
}
}
}
return 1;
//如果没有空格了,返回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][1] != ' ')
//判断一行中的三个值是不是相同,且不是空格
{
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[0][2] && board[1][1] != ' ')
{
return board[1][1];
}
//按照IsFull()函数的返回值来判断是否平局
int ret = IsFull(board, row, col);
if (ret ==1)
{
return 'Q';
//棋盘已满,返回Q,平局
}
return 'C';
//棋盘不满,返回C,继续棋局
}
主程序块
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()//显示主界面菜单
{
printf("***********************\n");
printf("*****1.开始 0.退出*****\n");
printf("***********************\n");
}
void game()
{
char board[ROW][COL] = {0};//创建数组显示棋盘并接受输入值
InitBoard(board, ROW, COL);//创建初始化棋盘函数
DisplayBoard(board, ROW, COL);//创建打印棋盘函数
char ret = 0;//创建ret的值,用来判断输赢与平局
while (1)
{
PlayerMove(board, ROW, COL);//玩家下棋
DisplayBoard(board, ROW, COL);//打印棋盘
ret = IsWin(board, ROW, COL);//按照IsWin函数判断输赢
if (ret != 'C')//判断棋盘是不是下满
break;
ComputerMove(board, ROW, COL);//电脑下棋
DisplayBoard(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if (ret != 'C')
break;
}
if (ret == '*')//如果ret得到*,玩家赢
{
printf("恭喜你,赢啦!\n");
}
else if (ret == '#')//如果ret得到#,电脑赢
{
printf("你真笨??\n");
}
else
{
printf("平局\n");//棋盘下满,且没有返回*#,则平局
}
//DisplayBoard(board, ROW, COL);
}
int main()//主函数入口
{
int input = 0;//为输入坐标创建接收变量
srand((unsigned int)time(NULL));//为电脑下棋创建随机值
do
{
menu();//为开始菜单创建函数
printf("请选择:>\n");
scanf("%d", &input);//输入菜单选项
switch (input)//根据输入值进入相应选项
{
case 1:
//printf("开始游戏!\n");
game();//为进入常游戏创建函数
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("输入错误,请重新输入:\n");//为输入纠错
break;
}
} while (input);
return 0;
}
经过三天,不断重复的观看视频不知道多少遍,终于把这个小游戏写完了,看来我的天赋是真的不够啊,先天不足就要后天努力追啦,加油吧,比我聪明的青年们😄