计算机积木游戏,A*算法分析(积木块游戏)
浅析A*算法:
A*算法是一种静态路由中求解最短路最有效的直接搜索方法,同时也是一种启发式搜索。
定义A*的公式为:f(n)=g(n)+h(n)
其中f(n)为初始状态经由状态n到目标的代价估计,
g(n)是在状态空间中从初始状态到状态n的实际代价,
h(n)表示从状态n到目标状态的最佳路径的代价估计。
积木块游戏问题描述:
移动积木块游戏的初始排列顺序是:BBWWE,B表示黑牌,W表示白牌,E表示空格。规定:任一牌移入相邻空格,或跳过一张牌移入空格,耗散值为1;跳过两张牌移入空格,耗散为2;不能跳过3或更多的牌移入空格。目标序列为白牌均在黑牌之左,空格位置不计。
分析:定义f(n)=g(n)+h(n)
其中g(n)从从初始状态到状态n的所需的耗散值,
h(n)定义为每个白块左边黑块个数的总和。
源代码设计:
定义数据类以及其相应的方法:
文件:BlockData.h
class BlockData {
public:
BlockData(string data,int g); //构造函数
string block; //当前数据
int f_value; //f值
int g_value; //g值
int h_value; //h值
int findTime; //到当前状态所需要的搜索次数,为了计算性能
BlockData* parent; //父节点指针
int GetFValue(); //获取f
int GetGValue(); //获取g
int GetHValue(); //获取h
int ePos; //空格E的位置
int GetE(); //获取空格E的位置
bool operator
bool operator>(BlockData&bd){ return f_value>=bd.g_value;} //重载比较
friend istream & operator >> (istream &in, BlockData &obj); //重载输出
friend ostream & operator << (ostream &out, BlockData &obj); //重载输出
};
//移动E函数
BlockData* Move(BlockData* bd,int movePos);
文件:BlockData.cpp
BlockData::BlockData(string data, int g)
{
//构造并初始化
this->parent=NULL;
this->block=data;
this->ePos=this->GetE();
g_value = g;
GetHValue();
GetFValue();
};
int BlockData::GetFValue() {
return this->f_value=this->g_value + h_value;
}
int BlockData::GetGValue() {
return this->g_value;
}
int BlockData::GetHValue() {
//计算f,算法是每个W前的B的总和
this->h_value=0;
int bCount=0;
for(int i=0;iblock.size();i++)
{
if(this->block[i]=='B')
{
bCount++;
} else if(this->block[i]=='W')
{
this->h_value+=bCount;
}
}
return this->h_value;
}
istream & operator>>(istream &in, BlockData &obj)
{
in>>obj.block;
return in;
}
ostream & operator << (ostream &out, BlockData &obj)
{
out<
}
int BlockData::GetE()
{
for(int i=0;iblock.size();i++)
{
if(this->block[i]=='E')
{
this->ePos=i;
return i;
}
}
return -1;
}
BlockData* Move(BlockData* bd,int movePos) {
//判断参数合法性
if(movePos3||movePos==0){
return NULL;
}
int ePos=bd->ePos;
if(!((ePos+movePos)>=0&&(ePos+movePos)block.size()))
{
return NULL;
}
//计算g
int g;
if(abs(movePos)==3)
{
g=2;
} else
{
g=1;
}
//移动E
string temp;
temp=bd->block;
temp[bd->ePos]=temp[bd->ePos+movePos];
temp[bd->ePos+movePos]='E';
BlockData* ans=new BlockData(temp,bd->g_value+g);
ans->parent=bd;
return ans;
}
启发搜索类及其实现方法:
文件:MoveBlock.h
//用于优先队列的比较函数,f值最小的优先
struct cmp{
bool operator()(BlockData* a, BlockData* b){
return a->f_value>b->f_value;
}
};
class MoveBlock {
public:
MoveBlock(); //构造函数
~MoveBlock(); //析构函数
int findTime; //统计搜索次数
BlockData* firstData; //初始状态
priority_queue,cmp> blockQueue; //优先队列
queuerecycleQueue; //回收队列
mapsearchMap; //记录搜索过的状态
BlockData* Run(string data); //搜索函数
void ShowWay(BlockData* ans); //回溯路径
bool CleanQueue(); //清除内存
friend istream & operator >> (istream &in, MoveBlock &obj); //重载输入输出
friend ostream & operator << (ostream &out, MoveBlock &obj);
};
文件:MoveBlock.cpp
MoveBlock::MoveBlock()
:firstData(NULL)
{
}
BlockData* MoveBlock::Run(string data)
{
findTime=0;
this->firstData=new BlockData(data,0);
//将初始状态压入优先队列
this->blockQueue.push(this->firstData);
searchMap.insert(pair(this->firstData->block,1));
while(this->blockQueue.size()>0)
{
//取队头元素并压入回收队列
BlockData* topData=this->blockQueue.top();
this->blockQueue.pop();
recycleQueue.push(topData);
//执行移动函数
int moveOper[]=MOVE_OPER;
for(int i=0;i<5;i++)
{
BlockData* afterOperData=Move(topData,moveOper[i]);
if(afterOperData==NULL)
{
continue;
}
//判断是否已经搜索过
if(searchMap.find(afterOperData->block)!=searchMap.end())
{
delete(afterOperData);
continue;
}
searchMap.insert(pair(afterOperData->block,1));
findTime++;
//判断是否找到答案
if(afterOperData->GetHValue()==0)
{
//找到答案将优先队列的元素压入回收队列
while (!this->blockQueue.empty())
{
recycleQueue.push(this->blockQueue.top());
this->blockQueue.pop();
}
//置搜索次数并返回答案
afterOperData->findTime=findTime;
return afterOperData;
}
//找不到答案,将当前状态压入优先队列
this->blockQueue.push(afterOperData);
}
}
return NULL;
}
void MoveBlock::ShowWay(BlockData* ans)
{
//使用栈回溯找路径
stackbackStack;
backStack.push(ans);
BlockData* parent=ans->parent;
while(parent!=NULL)
{
backStack.push(parent);
parent=parent->parent;
}
while (!backStack.empty())
{
BlockData* backData=backStack.top();
backStack.pop();
cout<block<
}
}
istream & operator>>(istream &in, MoveBlock &obj)
{
if(obj.firstData!=NULL)
{
delete(obj.firstData);
}
string firstData;
cout << "请输入初始值:" << endl;
in >> firstData;
obj.firstData=new BlockData(firstData,0);
return in;
}
ostream & operator << (ostream &out, MoveBlock &obj)
{
out<block<
}
MoveBlock::~MoveBlock()
{
this->CleanQueue();
}
bool MoveBlock::CleanQueue()
{
for(int i=0;iblockQueue.size();i++){
BlockData* delData=blockQueue.top();
blockQueue.pop();
recycleQueue.push(delData);
}
for(int i=0;i
{
BlockData* recycleData=recycleQueue.front();
recycleQueue.pop();
delete(recycleData);
}
return true;
}
计算机积木游戏,A*算法分析(积木块游戏)相关推荐
- c语言幼儿园积木游戏,幼儿园《积木游戏》课件【三篇】
[导语]课件制作本身就是作者综合素养的一种体现,它显现出制作者对教育.教学.教材改革方向的把握,对课堂教学的理解,对现代教育技术的领悟.因此教师在设计课件时一定要吃透教学内容,设计出符合教学的方案用于 ...
- java盖金字塔的游戏,最强大脑积木金字塔
最强大脑积木金字塔,这是一款大家比较喜欢的益智解密的手游,在游戏中玩家可以不断的参与冒险竞技,并且在其中拥有着超多的有挑战性的关卡,并且游戏的难度会不断的提升,喜欢的朋友快快来下载吧. 最强大脑积木金 ...
- 乐高计算机游戏泡泡龙的目标,乐高游戏教案
[活动目标]1.在玩的过程中进行按规律排列及比较10以内数的大小.2.培养合作意识,养成遵守规则的好习惯.[活动准备]1.格子图棋谱若干.2.收集黄.红两种颜色的饮料瓶盖,在瓶盖的正面分别贴上打印好的 ...
- [计算机毕设]基于java的打飞机游戏系统设计与实现(项目报告+源代码)
基于java的打飞机游戏系统项目说明报告 1.1 手机软件现状 在信息社会中,手机及其他无线设备越来越多的走进普通百姓的工作和生活,随着信息网络化的不断进展,手机及其他无线设备上网络势在必行.但是传统 ...
- 学计算机cpu重要还是显卡重要,玩游戏的过程中究竟是显卡重要还是CPU重要?
为了玩游戏,许多玩家不惜重金组装了一台10000元的机器.其中,CPU和图形卡是决定计算机性能的核心硬件.球员尤其受重视. 那么在玩游戏的过程中,图形卡或CPU重要吗?如今,板卡制造商GALAXY进行 ...
- 上万元游戏拼多多7块搞定 PICO防不住
本不富裕的PICO内容生态,因盗版雪上加霜. 在拼多多上,花几块钱就能一站打包PICO所有的付费游戏等资源.尽管PICO在新版本系统中增加了版权保护功能,但靠卖盗版牟利的商家们又开发出了"破 ...
- 计算机游戏比赛,计算机学习系统问世 机器会学习游戏比赛
腾讯科技讯(过客/编译)一位计算机科学家已经发表了一篇论文详细描述了计算机系统在观看了两分钟长的人类桌游比赛的视频之后如何成功赢得比赛. 计算机科学家研制最新计算机学习系统能学习如何成功赢得游戏比赛 ...
- 美国计算机游戏设计专业排名,美国游戏设计专业大学排名TOP5推荐!
首先明确的是游戏产业的就业前景还是非常好的,尤其是美国,游戏领域方向是游戏设计留学大多数人都会选择的国家,因为美国的游戏专业是比较强的.今天,美行思远小编就来和大家简单推荐一下美国游戏设计专业大学排名 ...
- c++游戏别踩白块课程设计
摘 要: 别踩白块儿游戏是一款非常好玩的游戏.游戏课程设计提供了游戏的说明,设计者的简介,游戏功能的实现.游戏中实现音效,动画. 关键词:音乐,动画,功能 一.概述 <别踩白块儿 Don't T ...
- CSS和js和HTML一起做出网页版别踩白块游戏
CSS和js和HTML一起做出网页版别踩白块游戏 文章目录 CSS和js和HTML一起做出网页版别踩白块游戏 下面我们要用到的知识点: 页面布局 添加样式 游戏初始化 让黑块动起来 点击黑块事件 js ...
最新文章
- com.android.ide.common process ProcessException:Failed to execcue aapt
- “计算机艺术之父”、现代计算机技术先驱查理斯·苏黎去世,享年99岁
- .net框架读书笔记---类型成员及其访问限定(一)
- 外部网络如何获取网口打印机的ip地址_Win7如何连接网络打印机?详细的新手DIY教程...
- 【渝粤题库】陕西师范大学200701 数字逻辑
- gps test free android,GPSTest | F-Droid - Free and Open Source Android App Repository
- Ubuntu16.04下PCL点云库的安装及使用demo
- python手册中文版pdf-python中文官方文档 PDF 下载
- 扫读笔好还是点读笔好 有什么区别
- 【杂谈】真相揭开有点吃惊:杨利伟出舱时
- bitcoin轻钱包之SPV验证
- 南昌大学计算机学院夏令营,南昌大学关于举办2021年优秀大学生暑期夏令营活动的通知...
- 纯css绘制简易对话气泡
- Android 打电话实现两种方法
- 最多显示三行,多余...展开,点击展开收起 getClientRects
- html 中精灵图使用
- 微信python小课_微信python小课靠谱吗
- OOALV的基本实现步骤
- 用VBOX打造一台高配安卓手机(windows)
- 宽带拨号上网时,Win10代理设置无效
热门文章
- 2022年新型智慧城市整体规划建设方案
- 2016红帽年度创新大奖榜单揭晓
- 阿里云OSS图片缩放处理
- excel公式不自动计算_梯形丝杠设计计算公式及三针法测量Excel表
- gst-example
- 手游入门必备基础知识
- C#企业微信邮箱发送邮件问题_Error: authentication failed, system busy
- 【OpenGL】笔记二十一、Alpha测试、混合测试
- node.js 刷csdn博客访问量
- 解决Server2008下远程桌面连接“由于没有终端服务器许可证服务器可以提供许可证”