栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

200行代码实现N子棋(以五子棋为例) 19 / 100

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

200行代码实现N子棋(以五子棋为例) 19 / 100

先赞后看养成习惯

提示:先上演示效果

文章目录
  • 前言
  • 一、五子棋的主要实现思路
  • 二、打印棋盘和初始化棋盘
  • 三、电脑和玩家的移动
  • 四、判断输赢
  • 五、判断棋盘是否满
  • 六、所引头文件和函数声明
  • 七、敲个主函数让游戏“活”起来
  • 八、运行结果展示
  • 总结


前言

棋文化是构成中华民族文化的一部分,现今世界上流行广泛的棋种大多起源于中国。 当今,大有风靡全球之势的五子棋,就是起源于中国的黑白传统棋种之一。如今五子棋已经成为了一种老少皆宜的”双人运动”,作为一个编程人员,我们应该如何去实现它呢?接下来博主就来跟从大家一起探寻五子棋的实现思路。

提示:以下是本篇文章正文内容,下面案例可供参考

一、五子棋的主要实现思路

额,棋盘总得先一个吧,而且棋盘上现在不应该有东西吧,类似于这样

棋盘有了是不是就该下棋了,比如这样你走一步我走一步(为了体现我们人类的高尚品德,我们想让电脑走),效果图如下:
好了到了这里,最关键的一步来了,你走了一步,我走了一步,是不是你或我每走一步都有可能会赢或者会输,,接下来我来带大家具体实现一下这几个主要函数
总的流程

二、打印棋盘和初始化棋盘
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=0)&&(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
#include
#include
#include
#include
#include
#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("小菜鸡,居然让电脑赢了aaan");
		break;
	}
	else if (com == 1)
	{
		system("cls");
		PrintfArr(arr);
		printf("平局aaan");
		break;
	}
		PrintfArr(arr);
		///分界线
		man=HumanMove(arr);
		if (man >= Size+1 )
		{
			system("cls");
			PrintfArr(arr);
			printf("恭喜你赢了(狗叫)aaan");
			break;
		}
		else if (man >= 1)
		{
			system("cls");
			PrintfArr(arr);
			printf("平局aaan");
			break;
		}
		system("cls");
	}
	
}

int main()
{
	srand((int)time(NULL));
	test1();

	return 0;
}
八、运行结果展示

总结

菜单的话,读者感兴趣的话,可以自行下去写一下,
程序有不完美的地方,欢迎大家指出其中的bug
欢迎大家,在评论区留言

最后别忘了一键三连哦,你的支持就是博主的动力!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/965460.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号