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

本文介绍了使用五元组评价算法实现简易五子棋的人工智能设计。实验环境中采用Windows 10和C++编程,核心算法在于评估棋局中所有位置的五元组得分,选择最高分进行落子。实验结果展示黑白双方对弈的胜负情况,并提供完整代码供参考。
摘要由CSDN通过智能技术生成

一、实验题目

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

二、实验环境

       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
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值