😀😀😀😀😀先赞后看养成习惯😀😀😀😀😀
提示:先上演示效果🐵🐵🐵🐵🐵
前言
棋文化是构成中华民族文化的一部分,现今世界上流行广泛的棋种大多起源于中国。 当今,大有风靡全球之势的五子棋,就是起源于中国的黑白传统棋种之一。如今五子棋已经成为了一种老少皆宜的”双人运动”,作为一个编程人员,我们应该如何去实现它呢?接下来博主就来跟从大家一起探寻五子棋的实现思路。
提示:以下是本篇文章正文内容,下面案例可供参考
一、五子棋的主要实现思路
额,棋盘总得先一个吧,而且棋盘上现在不应该有东西吧,类似于这样
棋盘有了是不是就该下棋了,比如这样你走一步我走一步(为了体现我们人类的高尚品德,我们想让电脑走),效果图如下:
好了到了这里,最关键的一步来了,你走了一步,我走了一步,是不是你或我每走一步都有可能会赢或者会输,,接下来我来带大家具体实现一下这几个主要函数
总的流程
二、打印棋盘和初始化棋盘
void Initialize(char a[][C])//这是初始化棋盘
{
for (int i = 0; i < R; i++)
{
for (int j = 0; j < R; j++)
{
a[i][j] = ' ';
}
}
}
void PrintfArr(char a[][C])//打印棋盘
{
int n = 1;
for (int m = 1; m <=C; m++)
{
printf(" %d ",m);//这是打印列号(就是你效果图上看的那极其丑陋的部分😁😁😁😁😁看到的)
}
printf(" 电脑->X || 玩家->O");//打印图列电脑X,玩家O
puts(" ");
for (int i = 0; i < R; i++)
{
printf(" ");
for (int j = 0; j < C; j++)
{
printf("+---");
}
puts("+");
printf("%2d", n);//打印行号
n++;
for (int k = 0; k < C; k++)
{
printf("| %c ", a[i][k]);
}
puts("|");
}
printf(" ");
for (int j = 0; j < C; j++)
{
printf("+---");
}
puts("+");
}
三、电脑和玩家的移动
int ComputerMove(char a[][C])//这是电脑的
{
int x = 0;
int y = 0;
x = rand() % R;//固定了坐标生成在[0,R-1] [0,C-1]的范伟
y = rand() % C;//让电脑的坐标随机生成(当然这种随机的做法使得电脑变得比较笨),这也是玩家基本不会输的重要理由
while (a[x][y] != ' ')//如果第一次生成的坐标不合法,就会重新生成
{
x = rand() % R;
y = rand() % C;
}
a[x][y] = 'X';//这一步是电脑下的位置
return WhoWin(a,x,y,'X');//电脑下完过后,用一个返回值判断一下电脑下完这一步过后的输赢情况
}
int HumanMove(char a[][C])//这是人类的
{
int x = 0;
int y = 0;
printf("请输入你的坐标>:");
scanf("%d%d",&x,&y);
while ((x > R || x < 1) || (y > C || y <1) || a[x-1][y-1] != ' ')
{
printf("坐标非法,请重新输入>:");
scanf("%d%d",&x,&y);
}
a[x-1][y-1] = 'O';
return WhoWin(a, x - 1, y - 1, 'O');
}
四、判断输赢
其实输赢情况无非就想一个“米”字一样,只需考虑横,竖,左斜,右斜这几种情况
我们可以用一个变量count来统计横,竖,左斜,右斜的情况,(电脑为例)只要我a[x][y]==‘x’,coun就记录一下,只要其中有一种情况满足(count>=5),我们就可以判断输赢了。如果没有一种情况能满足,那么在判断一下棋盘是否已经满了,如果没满则游戏继续(我们用return count来表示胜负,return -1表示游戏继续return 1表示没有赢家,平局)。上图演示
我们统计红色圈起来的的count:
横->count=1;
竖->count=1;
左斜->count=3;
右斜->count=1;
棋盘也没满,就return -1;
int WhoWin(char a[][C],int x,int y,char ch)
{
int count = 0;
int x1 = x;
int y1 = y;
//横着来
while ((x1 < R && x1 >= 0) && (y1 < C && y1 >= 0)&&a[x1][y1++]==ch)//保证++过后数组不会越界访问
{
count++;
}
x1 = x;
y1 = y;//x1,y1重新赋值,又从开始位置从新统计,实例(-----X[X]XXX)先统计[]左边或右边,在统计其右边或左边,,,下面也是一样的道理
while ((x1 < R && x1 >= 0) && (y1 < C && y1 >= 0) && a[x1][y1--] == ch)
count++;
if (count >= Size+1)
return count;
x1 = x;
y1 = y;
count = 0;
/竖着来
while ((x1 < R && x1 >= 0) && (y1 < C && y1 >= 0) &&a[x1++][y1]==ch)
count++;
x1 = x;
y1 = y;
while ((x1 < R && x1 >= 0) && (y1 < C && y1 >= 0) && a[x1--][y1]==ch)
count++;
if (count >= Size+1)
return count;
count = 0;
x1 = x;
y1 = y;
/左下来
while ((x1<R&&x1>=0)&&(y1<C&&y1>=0)&&a[x1++][y1++]==ch)
{
count++;
}
x1 = x;
y1 = y;
while ((x1 < R && x1 >= 0) && (y1 < C && y1 >= 0) && a[x1--][y1--] == ch)
count++;
if (count >= Size+1)
return count;
count = 0;
x1 = x;
y1 = y;
//左下来
while ((x1 < R && x1 >= 0) && (y1 < C && y1 >= 0) && a[x1++][y1--] == ch)
count++;
x1 = x;
y1 = y;
while ((x1< R && x1 >= 0) && (y1 < C && y1 >= 0) && a[x1--][y1++] == ch)
count++;
if (count >= Size+1)
return count;
//
if (IsFull(a) == true)
return 1;//(没有谁赢)棋盘满了,游戏结束
return -1;//都不满足且棋盘未满,游戏继续
}
五、判断棋盘是否满
bool IsFull(char a[][C])
{
for (int i = 0; i < R; i++)
for (int j = 0; j < C; j++)
if (a[i][j] == ' ')
return false;
return true;
}
六、所引头文件和函数声明
#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#include<time.h>
#include<stdbool.h>
#define R 15
#define C 15
#define Size 5//几子棋
void Initialize(char a[][C]);//初始化棋牌
void PrintfArr(char a[][C]);//打印棋盘
int ComputerMove(char a[][C]);//电脑移动
int HumanMove(char a[][C]);//人类移动
int WhoWin(char a[][C],int x,int y,char ch);//判断输赢
bool IsFull(char a[][C]);//棋盘是否已满
七、敲个主函数让游戏“活”起来
#include"Gobang.h"
void test1()
{
int com = 0;
int man = 0;
char arr[R][C];
Initialize(arr);
while (1)
{
com=ComputerMove(arr);
if (com == Size+1 )
{
system("cls");
PrintfArr(arr);
printf("小菜鸡,居然让电脑赢了\a\a\a\n");
break;
}
else if (com == 1)
{
system("cls");
PrintfArr(arr);
printf("平局\a\a\a\n");
break;
}
PrintfArr(arr);
///分界线
man=HumanMove(arr);
if (man >= Size+1 )
{
system("cls");
PrintfArr(arr);
printf("恭喜你赢了(狗叫)\a\a\a\n");
break;
}
else if (man >= 1)
{
system("cls");
PrintfArr(arr);
printf("平局\a\a\a\n");
break;
}
system("cls");
}
}
int main()
{
srand((int)time(NULL));
test1();
return 0;
}
八、运行结果展示
总结
菜单的话,读者感兴趣的话,可以自行下去写一下,
程序有不完美的地方,欢迎大家指出其中的bug
欢迎大家,在评论区留言
最后别忘了一键三连哦,你的支持就是博主的动力!😁😁😁😁😁😀