这篇文章的目的不是为了教大家怎么写三子棋这个游戏的代码,而是为了锻炼大家写大型代码的能力,以便在以后的学习中写这种大型代码不至于无从下手。本人学习C语言的时间也不是太长,所以要有什么地方写的不对欢迎在评论里留言,我会马上进行修正。好了废话不多说咱们马上开始。
分析编程对象
首先要分析三子棋的游戏机制,如果不了解游戏机制是根本写不出来的,游戏机制如下:
这个游戏首先要有一个井字棋盘如图1-1。
该游戏是回合制游戏,必须要有两个玩家才可以进行,两方使用不同的棋子,当其中一方的三个棋子构成一条直线则该玩家胜利,当棋盘下满没有任何一方胜利时,则判定平局。图解如下:
此外已经被占领的位置无法再继续下棋。
以上就是三子棋的全部游戏机制。
编写代码
实现游戏的开始和退出:
首先要创建一个菜单,如下图:
这样可以让我们知道怎么开始或者退出游戏。
我们还要考虑当玩完一把游戏后,要继续弹出此菜单,来让我们选择游戏是否继续。所以我们menu这个函数放在循环里,因为这个函数要至少运行一次所以我们选择do-while。
接下来我们要对input进行判断,当input=1,则游戏开始,当input=0,这游戏退出,当input及不等于1,也不等于0,则输入错误,重新输入。
我们可以运行一下,看看运行结果:
现阶段完整的代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void menu()
{
printf("*******************************\n");
printf("****** 1.play ******\n");
printf("****** 0.exit ******\n");
printf("*******************************\n");
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", & input);
switch (input)
{
case 1:
printf("玩游戏\n");
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
实现游戏的所有功能
接下来要创建一个存放游戏功能的函数,游戏的所有功能都将在这个函数里面完成。
如果要玩这个游戏我们需要一个3X3的棋盘,所以我们需要一个二位数组来存储棋盘数据,为了方便观看还需要打印一个棋盘,实现井字棋盘要用到两个符号"-“,”|"。具体形状如下:
下面我们来编写这个代码:
我们先创建一个头文件game.h和一个源文件game.c,game.c是用来存放执行游戏功能函数的源文件,我可以把所有的函数声明和头文件都放在game.h里面,这样我们只需要在需要使用game.c里面函数的源文件里面的最上面添加game.h就可以了,这里创建game.c 不是什么都没有,如果把所用的程序都放在还有主函数的源文件里代码太多,不方便调试,也不美观
下面我们要给存储棋盘数据的二维数组初始化
这里的二维数组之所以不用arr[3][3]是有原因的,如果有一天你要打印10X10的棋盘,使用这种写法那就需要花大部分时间去改,而按照我这种写法具有通用性,只需要改一下ROW和COL的值就可以了
初始化完成,接下来打印棋盘
运行结果如下
有了棋盘就要让玩家和电脑能够在这个棋盘里下棋,接下来完成这个代码
玩家下棋的代码:
电脑下棋的代码如下:
因为只是锻炼大家以后编写大型代码的能力,所以电脑并不是那么智能。
查看运行结果
接下来判断输赢和平局
最终的运行结果
以上就是这篇博客的所有内容,感谢大家的观看。
三子棋完整代码如下
//头文件game.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
//棋盘的大小
#define ROW 3
#define COL 3
//初始化函数
void InitArr(char arr[ROW][COL], int, int);
//打印棋盘
void DisplayBoard(char arr[ROW][COL], int, int);
//玩家走
void PlayerMove(char arr[ROW][COL], int, int);
//电脑走
void BotMove(char arr[ROW][COL], int, int);
//判断哪方获胜
char IsWin(char arr[ROW][COL], int, int, char);
-------------------------------------------------------------------------------------------
//游戏执行函数的源文件game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//棋盘数据初始化
void InitArr(char arr[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
arr[i][j] = ' ';
}
}
}
//打印棋盘
void DisplayBoard(char arr[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 ", arr[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 arr[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("请输入下棋的坐标:>");
scanf("%d %d", &x, &y);
if (arr[x - 1][y - 1] == ' ')
{
arr[x - 1][y - 1] = '*';
printf("玩家走\n");
break;
}
else
{
printf("该坐标已被占用\n");
}
}
}
//电脑走
void BotMove(char arr[ROW][COL], int row, int col)
{
while (1)
{
//产生随机的横坐标
int x = rand() % row;
//产生随机的纵坐标
int y = rand() % col;
if (arr[x][y] == ' ')
{
arr[x][y] = '#';
printf("电脑走\n");
break;
}
}
}
//判断输赢
char IsWin(char arr[ROW][COL], int row, int col, char set)
{
int i = 0;
int count = 0;
//判断两个对角线
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2]
&& arr[1][1] != ' ')
return set;
if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0]
&& arr[1][1] != ' ')
return set;
//判断列
for (i = 0; i < col; i++)
{
if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i]
&& arr[1][i] != ' ')
{
return set;
}
}
//判断行
for (i = 0; i < row; i++)
{
if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2]
&& arr[i][1] != ' ')
{
return set;
}
int j = 0;
for (j = 0; j < col; j++)
{
if (arr[i][j] != ' ')
count++;
}
}
//判断是否平局
if (count == row * col)
return 'Q';
//判断游戏是否继续
else
return 'C';
}
------------------------------------------------------------------------------------------
//含有主函数的源文件
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("*******************************\n");
printf("****** 1.play ******\n");
printf("****** 0.exit ******\n");
printf("*******************************\n");
}
void game()
{
char flag = 0;
//存储棋盘数据
char arr[ROW][COL] = { 0 };
//初始化数据
InitArr(arr, ROW, COL);
//打印棋盘
DisplayBoard(arr,ROW,COL);
while (1)
{
//玩家走
PlayerMove(arr, ROW, COL);
//打印棋盘
DisplayBoard(arr,ROW,COL);
//判断输赢
flag = IsWin(arr, ROW, COL,'*');
if (flag != 'C')
{
break;
}
//电脑走
BotMove(arr, ROW, COL);
//打印棋盘
DisplayBoard(arr,ROW,COL);
//判断输赢
flag = IsWin(arr, ROW, COL,'#');
if (flag != 'C')
{
break;
}
}
if (flag == '*')
printf("玩家胜利\n");
else if (flag == '#')
printf("电脑胜利\n");
else if (flag == 'Q')
printf("平局\n");
}
int main()
{
//设置电脑下棋的随机坐标
srand((unsigned int)time(NULL));
int input = 0;
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;
}