如标题所示,今天我们要用C语言来实现三子棋的游戏。相信大家都玩过这个游戏。我们来回忆一下游戏步骤。
一、今天你在家里看书,你的朋友小红邀请你和她一起玩三子棋。这时你有两个选择。
1.接受她的邀请,在玩游戏的同手,促进你们的感情。
0.残忍拒绝她,三子棋有什么好玩的,是书不好看了吗。
那我们在设计游戏时,第一步也应该是让玩家进行选择。
二、假设你因为暗恋小红接受了小红发来的游戏邀请,这时你们决定开始玩三子棋。那你们首先要拿出棋谱和棋子并且选择各自要执子的颜色。
那这个对应我们在写代码时就是要打印棋盘,并且用不同的符号区分你和小红所执的子。在本文中,我们将小红看成是电脑玩家(小红是一个没有感情的棋手)小红执子为黑子,用符号“@”表示,将你看成是个人玩家,执白色棋子,用符号“X”表示你所执的子。
三、游戏就要开始了,你很紧张。你不知道要不要向小红展示你的真实实力(其实你是全世界三子棋冠军,但因为你为人低调,每次比赛时都要戴口罩,所以小红并不知道你的真实身份)。向小红展示你的真实实力,小红可能因为输了就不太想跟你玩了。如果装的太菜,小红可能会嘲笑你。真是一个艰难的选择。
因此我们在写代码时,也可以将游戏进行不同难度程度的划分。这里我们说一下简单模式的,也就是让电脑不进行任何分析而随机落子。困难模式目前我想到的只有穷举法,但是显然这个算法太麻烦了。所以在代码中。我将困难模式模板目前没有po上代码,后面我会考虑优化算法,再对本文进行编辑。
完成上述准备工作后,要正式开始玩了。我们将棋盘看成一个二维数组,每一次落子就是对空白数组进行赋值的过程。因此写代码时我们要先初始化一个二维数组,对数组的行和列进行限制。这离我们是三子棋,将行ROW和列COL都定义为3。将下棋过程中的电脑落子和玩家落子分别用两个函数表示。每次落子结束后都要进行判断是否有人赢了,因此还需要一个判断输赢的函数。下面我们附上代码。
//game.h部分
#ifndef __GAME_H__
#define __GAME_H__
#define ROW 3 //行
#define COL 3 //列
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu(void);//开始菜单
void init(char arr[ROW][COL], int row, int col);//初始化数组
void printboard(char arr[ROW][COL], int row, int col);//游戏棋盘
void playermove(char arr[ROW][COL],int row,int col); //玩家走
void computermove(char arr[ROW][COL], int row, int col); //电脑走
int win(char arr[ROW][COL], int row, int col); //判断胜利
#endif // __GAME_H__
//我们将游戏中涉及到的所有的函数放在game.h的头文件中方便我们调用
//game.c部分
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void menu(void) //打印菜单,让玩家进行选择
{
printf("************************\n");
printf("*** 1.开始 0.退出 ***\n");
printf("************************\n");
}
void init(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++)
{
arr[i][j] = ' ';
}
}
}
void printboard(char arr[ROW][COL], int row, int col) // 打印棋盘
{
int i = 0;
for (i = 0; i < row; i++)
{
printf("------------------------\n");
printf("| | | |\n");
printf("| %c | %c | %c |\n",arr[i][0],arr[i][1],arr[i][2]);
printf("| | | |\n");
}
printf("------------------------\n");
}
void playermove(char arr[ROW][COL], int row, int col) / /玩家落子
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家走\n请输入坐标:>");
scanf("%d%d", &x, &y);
if ((x - 1) < row && (x - 1) >= 0 && (y - 1) < col && (y - 1) >= 0)//落子时要考虑取值范围,不能超过棋盘
{
if (arr[x-1][y-1] == ' ') //此处为空时,才可以落子
{
arr[x - 1][y - 1] = 'X';
break;
}
else //否则进行重新选择
{
printf("此坐标已有棋子,请重新选择坐标!\n");
}
}
else
{
printf("输入坐标错误!\n");
}
}
}
void computermove(char arr[ROW][COL], int row, int col) / /电脑落子
{
int x = 0;
int y = 0;
printf("电脑走:>\n");
while (1)
{
x = rand() % row; //电脑落子取随机数表示,取余对随机数范围进行限定
y = rand() % col;
if (x< row && x >= 0 && y < col && y >= 0)
{
if (arr[x][y] == ' ')
{
arr[x][y] = '@';
break;
}
}
}
}
int win(char arr[ROW][COL], int row, int col) //判断输赢
{
int i = 0;
int j = 0;
int execute = 1;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++) //这里我是用穷举法列出了所有赢的可能,此处可以不用穷举
{
if (arr[i][j] == 'X'&&arr[i + 1][j + 1] == 'X'&&arr[i + 2][j + 2] == 'X'&& i<(row-2)&& i<(col - 2)
|| arr[i][j] == 'X'&&arr[i][j + 1] == 'X'&&arr[i][j + 2] == 'X'&&j<(col-2)
|| arr[i][j] == 'X'&&arr[i + 1][j] == 'X'&&arr[i + 2][j] == 'X'&&i<(row-2)
|| arr[i][j] == 'X'&&arr[i + 1][j - 1] == 'X'&&arr[i + 2][j - 2] == 'X'&&i<(row-2)&&(j>=2))
{
printf("恭喜你赢了!\n");
return 1;
}
}
}
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (arr[i][j] == '@'&&arr[i + 1][j + 1] == '@'&&arr[i + 2][j + 2] == '@'&& i<(row - 2) && i<(row - 2)
|| arr[i][j] == '@'&&arr[i][j + 1] == '@'&&arr[i][j + 2] == '@'&&j<(col - 2)
|| arr[i][j] == '@'&&arr[i + 1][j] == '@'&&arr[i + 2][j] == '@'&&i<(row - 2)
|| arr[i][j] == '@'&&arr[i + 1][j - 1] == '@'&&arr[i + 2][j - 2] == '@' && i<(row - 2) && (j >= 2))
{
printf("电脑赢了!\n");
return 1;
}
}
}
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (arr[i][j] == ' ')
{
execute = 0;
}
}
}
if(1 == execute)
{
printf("平局!\n");
return 1;
}
return 0;
}
//test.c部分
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
int main()
{
int chose = 0;
int input = 0;
int i = 0;
char arr[ROW][COL] = { 0 };
srand((unsigned int)time(NULL));
while(1)
{
if (i == 0)
{
menu();
init(arr, ROW, COL);
printf("请选择是否开始游戏:");
}
i = 1;
scanf("%d", &input);
switch (input)
{
case 1:
printf("请输入你要选择的游戏难度\n");
printf("*******************************\n");
printf("******** 0.简单 ***********\n");
printf("***********1.困难 ***********\n");
printf("*******************************\n");
scanf("%d",&chose);
if(chose==0)
{
printboard(arr, ROW, COL);
while (1)
{
playermove(arr, ROW, COL);
printboard(arr, ROW, COL);
if(win(arr, ROW, COL)==1)
{
i = 0;
break;
}
computermove(arr, ROW, COL);
printboard(arr, ROW, COL);
if (win(arr, ROW, COL) == 1)
{
i = 0;
break;
}
}
break;
}
else if(chose==1)
printf("正在筹备中,敬请期待\n");
else
printf("输入错误,请重新输入\n");
case 0:
printf("游戏退出!\n");
system("pause");
return 0;
break;
default:
printf("输入错误!请重新输入:");
break;
}
}
return 0;
}