五元组评价算法实现简易五子棋【人工智能】

一、实验题目

       五子棋游戏算法设计,方法不限。
       以两人为一组,分为甲方和乙方对弈。各自设计自己的算法: 针对对方下的每一步骤棋落子,由算法给出相应的本方落子,最终胜者只有一个。

二、实验环境

       Windows 10,Visual Studio 2019,编程语言C++

三、实验原理

【实验说明】
  • 本实验所实现的五子棋为简易的人机交互版本
  • 为简单处理,我们假定人为黑手,即黑棋先下
  • 不考虑禁手等规则
【核心算法】

本实验核心算法是五元组评价算法。基本思路如下:
       评估当前棋局中所有位置得分,机器落在得分最高的位置。
       五子棋取胜条件是哪方5个棋子先连成线,哪方获胜。那么我们将五个相连的位置称为五元组。以15 * 15的棋盘为例,有572个五元组。
       针对五元组中黑子和白子的数量情况的不同(不考虑相对位置,只看数量,共10种情况),对该五元组评分,如下表。每一个位置的得分就是包含这个位置的所有五元组的得分之和。评价表的好坏一定程度上决定了实验结果,本实验所采用的是一个比较出色的评价表,经过测试,所带来的结果也比较好。

五元组评价表
情况	得分
1	既有黑子又有白子	0
2	既没有黑子也没有白子	7
3	有1个白子	35
4	有2个白子	800
5	有3个白子	15000
6	有4个白子	800000
7	有1个黑子	15
8	有2个黑子	400
9	有3个黑子	1800
10	有4个黑子	100000

以评价横向的五元组为例,部分代码如下:

//1、扫描横向的15行
	for (int i = 0; i < size; i++)				//对于每一行来说
	{
   
		for (int j = 0; j < size - 4; j++)
		{
   
			int k = j;
			while (k < j + 5)					//统计每个五元组的黑白棋数量
			{
   
				if (ChessBoard[i][k] == black)
					bn++;
				else if (ChessBoard[i][k] == white)
					wn++;

				k++;
			}

//五元组中白子黑子中对应的数量的打分
			tupleScoreTmp = scoreTable(bn, wn);	

			//为该五元组的5个位置添加分数
			for (k = j; k < j + 5; k++)
				score[i][k] += tupleScoreTmp;
			
			//计数器们清零
			bn = 0;
			wn = 0;
			tupleScoreTmp = 0;
		}
	}
【五子棋流程图】

在这里插入图片描述

四、实验结果

【初始棋盘】【说明:若输入2 5,则表示第2行、第5列】
在这里插入图片描述

【机器(白手)胜】

在这里插入图片描述

【人(黑手)胜】
在这里插入图片描述

五、完整代码

#include <iostream>
using namespace std;
#include <string>
#include <Windows.h>
#define size 15						//棋盘大小

//核心 【五元组评分算法】
string ChessBoard[size][size];		//棋盘,二维数组实现
int score[size][size];				//评分表
string white = "-●";				//白棋 由于控制台是黑色的,所以反着
string black = "-○";				//黑棋
string board = "-┼-";				//棋盘线 表示无子落下


void initBoard();					//初始化棋盘
void printBoard();					//打印棋盘
int scoreTable(int w, int b);		//五元组评分
bool machine(int& goalX, int& goalY);	//机器落子
int judge(int flag, int x, int y);	//判断输赢
int cnt = 0;

int main()
{
   
	//初始化棋盘
	initBoard();
    printBoard();
	cout << "【说明】若输入2 5,则表示第2行,第5列" << endl;
	while (1)	//设置一个无限循环
	{
   
		//简单版 始终让人类执黑手
		cout << "人(黑手)落子:";
		
		int hx, hy;
		cin >> hx >> hy;

		//判断人的落子是否合法 因为人先手 所以是否平局只在机器落子中判断即可
		while (1)
		{
   
			if (hx >= 1 && hx <= size && hy >= 1 && hy <= size && ChessBoard[hx - 1][hy - 1] == board)
				break;		//输入合法,跳出循环
			else
			{
   
				cout << "人(黑手)落子不合法,请重新输入:";
				cin >> hx >> hy;
			}
		}

		//更新棋盘
		ChessBoard[hx - 1][hy - 1] = black;
		printBoard();
		cout << "人(黑手)落子完成" << endl << endl;

		//判断棋局胜负
		if (judge(1,hx - 1,hy - 1))
		{
   
			cout << "人(黑手)胜出!!!" << endl;
			break;
		}



		//人落子处理完成
  	    /********************************************************************/
		//开始处理机器落子


		//机器 白手
		int wx, wy;
	
		//白手落子
		if (
  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是五子棋人机对弈算法设计与实现的思路: 1. 基本思路 五子棋是一种纯策略游戏,因此我们需要设计一个算法来评估当前局面。我们先定义一个评估函数,分别对黑方和白方进行评估,评估函数的返回值表示当前局面的得分。 接着,我们需要使用一种搜索算法来寻找最佳的下棋位置,常用的搜索算法有 MiniMax 算法和 Alpha-Beta 剪枝算法。 2. 评估函数 评估函数需要考虑以下因素: - 棋型:比如三连、四连等等。不同的棋型得分不同。 - 棋子数量:棋子数量越多得分越高。 - 棋子位置:中心位置得分更高,边缘位置得分更低。 我们可以将以上因素加权求和,得到一个综合得分。 3. MiniMax 算法 MiniMax 算法是一种递归搜索算法,用于在两个玩家之间进行决策。算法假设一方玩家采取最佳决策,而另一方玩家采取最劣决策。因此,算法会检查所有可能的决策并选择最优解。 MiniMax 算法的缺点是需要搜索整个游戏树,时间复杂度较高。 4. Alpha-Beta 剪枝算法 Alpha-Beta 剪枝算法是 MiniMax 算法的一种优化,通过剪枝减少搜索的分支数,从而提高搜索效率。 Alpha-Beta 剪枝算法假设一方玩家采取最佳决策,而另一方玩家采取最劣决策。在搜索过程中,如果发现某个节点的值已经比当前最优解差,则可以剪枝,停止搜索该节点的子树。 5. 实现思路 我们可以先实现一个基本的 MiniMax 算法,然后再使用 Alpha-Beta 剪枝算法进行优化。 具体实现步骤如下: - 定义评估函数,根据当前局面评估黑方和白方的得分。 - 实现 MiniMax 算法,搜索整个游戏树,返回最佳决策。 - 实现 Alpha-Beta 剪枝算法,优化 MiniMax 算法,减少搜索分支数。 - 设计交互界面,让用户与 AI 进行对弈。 6. 总结 五子棋是一种纯策略游戏,对于 AI 来说,评估函数和搜索算法的设计非常重要。我们可以通过定义合适的评估函数和使用优秀的搜索算法,让 AI 学会更好地下棋。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值