提示:难度不高,耐心看完
目录
前言
天我们用C语言实现一下三子棋这一小游戏,运用多文件写代码的形式来完成我们的三子棋游戏,希望通过这个小游戏能对大家有所帮助,话不多说开始我们今天的讲解。
一、整体思路
首先我们是要运用多文件写代码的形式来实现三子棋,那自然需要先添加多个文件:
在这里我们创建三个文件,具体文件解释如图所示,这里不做过多赘述。
说完整个项目的大概框架,接下来我们来说说游戏实现的大概框架。
- 创建二维数据————存储数据
- 初始化棋盘
- 打印棋盘
- 玩家和电脑下棋
- 判断胜负
二、游戏的实现
1.创建菜单
创建一个菜单,引导用户操作:
//打印菜单
void menu()
{
printf("******************************\n");
printf("******* 1.play ******\n");
printf("******* 0.exit ******\n");
printf("******************************\n");
}
注意:这里每一行后面要添加换行符,不然打印出来的菜单会很难看
2.棋盘
这里我们需要一个棋盘,给用户做一个可视化界面,让用户知道自己的每一步棋落在了哪里,同时这个棋盘需要有存储数据的功能,记录用户和电脑每一步走的棋,也方便系统后面判定结果的胜负。
2.1创建二维数组,存储数据
//存储数据,创建二维数组
//方法一
char board[3][3];
//方法二
char board[ROW][COL]
//#define ROW 3
//#define COL 3
这里方法一和方法二都可以,但我更加推荐方法二,采用宏定义的全局变量,如果后期我们想改为四子棋、五子棋就可以在宏定义那里改变数字即可,省去了很多不必要的操作。
2.2初始化棋盘
在这里我们初始化棋盘,将棋盘初始化为空格
函数声明:
函数实现:
函数调用:
到这里我们实现了函数的初始化,但是,用户依旧看不到一个完整的棋盘。所以我们还得有一个完成的棋盘。
2.3打印棋盘
这里我们要打印一个可视化的棋盘,让用户可以更好的完成操作
函数声明:
函数实现:
这里可能不太好理解,为什么row和col都需要-1,这是因为我们在最后一行和最后一列都不需要分隔符,因为一旦加了分隔符之后棋盘就会变得很难看,不信让我们看看
row-1、col-1版本:
没有-1的版本:
有没有感觉哪里怪怪的,哈哈
3.下棋
3.1玩家下棋
在玩家下棋这里我们需要注意一般我们输入的是序列,而数组下标是从0开始的,而这两者之间就存在一个转换关系:数组下标=序列号-1。除此之外我们还应当考虑到玩家输入的下标是否合法,以及即便是合法坐标也存在被占用而无法落子的情况,接下来,让我们看代码:
函数声明:
函数实现:
函数调用:
在这里我们是每下一步棋,就让计算机打印一次当前棋盘,让玩家知道自己走的每一步棋
3.2电脑下棋
电脑下棋这里我们采用生成随机数的方式,来产生两个在棋盘范围内数作为电脑下棋的落子。
函数声明:
函数实现:
函数调用:
这里至于具体随机数是怎样生成的不是我们的重点,这里不做过多讲解
4.胜负判断
这里判断的情况无非就是电脑赢,玩家赢,平局(棋盘满),未下完(继续下棋操作)
函数声明:
函数实现:
这里采用的是穷举法判断的胜负,哈哈,等我后面改进
最后所有代码
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3 //棋盘的行
#define COL 3 //棋盘的列
//游戏函数的声明
//初始化棋盘
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);
//判断胜负
//玩家赢 *
//电脑赢 #
// 平局 Q
// 继续 C
char IsWin(char board[ROW][COL], int row, int col);
#include"game.h"
//初始化棋盘为空格
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)//行
{
int j = 0;
for (j = 0; j < col; j++)//列
{
board[i][j] = ' ';
}
}
}
//3.0版本 打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)//行
{
int j = 0;
for (j = 0; j < col; j++)//数据行
{
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
if (i < row - 1)
{
int k = 0;
for (k = 0; k < col; k++)//分隔符行
{
printf("---");
if (k < 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("请输入下棋的坐标,中间使用空格>:");
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("坐标非法,请重新输入");
}
}
}
//电脑随机下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑下棋>:\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
//遍历二维数组
int isFull(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 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][0] != ' ')
{
return board[i][0];
}
}
for (i = 0; i < col; i++)//列
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
//对角线
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];
}
//平局
if (isFull(board ,row , col)==1)
{
return 'Q';
}
//继续
return 'C';
}
#include"game.h"
void menu()
{
printf("******************************\n");
printf("******* 1.play ******\n");
printf("******* 0.exit ******\n");
printf("******************************\n");
}
void game()
{
//存储数据 ——创建二维数组
char board[ROW][COL];
//初始化棋盘 -初始化空格
InitBoard(board, ROW, COL);
//打印棋盘
DisplayBoard(board, ROW, COL);
//下棋
char ret = 0;
while (1)
{
//玩家下棋
PlayerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
//判断胜负
ret = IsWin(board, ROW, COL);
if (ret != 'C')
break;
//电脑下棋
ComputerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
//判断胜负
ret = IsWin(board, ROW, COL);
if (ret != 'C')
break;
}
if (ret == '*')
{
printf("玩家赢\n");
}
else if (ret == '#')
{
printf("电脑赢\n");
}
else
{
printf("平局\n");
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
return 0;
}