用C++解跳棋问题的代码

用C++解跳棋问题的代码,第1张

可以采用广度优先搜索,程序如下:

#include <iostream>

#include <string>

#include <algorithm>

#include <set>

#include <queue>

using namespace std

struct node{

string str, step

node(){}

node(string str, string step = ""): str(str), step(step){}

}

int main(){

string start = "0111222", dest = "2221110"

node n

queue<node> Open

set<string> Close

Open.push(node(start))

while(1){

n = Open.front()

Open.pop()

Close.insert(n.str)

if(n.str == dest)break

int l = n.str.find("0")

for(int i=-3 i<=3 i++){

if(!i || l+i<0 || l+i>=dest.size())

continue

string s(n.str)

s[l] = s[l+i]

s[l+i] = '0'

if(Close.find(s) == Close.end())

Open.push(node(s, n.step + char('0'+l+i) + " "))

}

}

cout << n.step

}

程序输出:

1 4 2 5 6 3 0 2 5 6

// 表示每一步移动哪个棋子,最开始棋子编号0

算法优化:可考虑使用A*算法进行启发式搜索

这个题目有点难度

不过可用广度优先搜索算法:

棋盘的数据结构

{

int a[7]

int min_step

}

我大致写一下

两个数据结构

已搜状态队列q1

正在搜索的状态队列q2

main()

{

将初始节点加到q2;

while(q2 isn't empty)

{

new_s=takeout from q2

if(new_s belong to q1 or q2)

continue

else

{

if(new_s is target)

return

else

{

步数加一;

根据new_s扩展q2(最多4种可能);

}

}

}

a little suggestion,

just glance it!

thank you

}

1走棋规则

游戏开始时每个玩家营区内有10个棋子成正三角放置,你的任务是将营区的所有棋子连走带跳去占领正对面的营区,首先将10个棋子全部占领对面营地的玩家获胜,其余玩家按到营的个数多少来排名次。

棋子的移动可以一步步在有直线连接的相邻六个方向进行,如果相邻位置上有任何方的一个棋子,该位置直线方向下一个位置是空的,则可以直接"跳"到该空位上,"跳"的过程中,只要相同条件满足就可以连续进行。谁最先把正对面的阵地全部占领,谁就取得胜利。

每一局棋都由程序随机产生一玩家先走,然后以该玩家为始点,逆时针方向轮流走棋。当轮过一圈到了起始玩家开始走棋时为走了一轮即一回合。我们不希望看长期将棋子放在家里,来阻止对手占领的打法,因此每位玩家在第 20 、 25 、 30 回合时,离开本营的棋子必须分别达到 5 、 8 、 10 颗,否则会被判消极而失败。

跳棋游戏中还具有托管功能,当你玩得累了想去泡杯咖啡时,你可以点屏幕右下角的“托管”按钮由机器人自动帮你走棋,当你人回来时也别忘了“接管”来继续游戏,因为机器人的智商是在人脑之下哦:)!

2游戏场次

跳棋分为2人场和6人场。由于6人场战局混乱又分为有提示场跟无提示场次,还是新手阶段的你可以先去有提示的6人场里练练。

3、 *** 作

1 .左键点击自己棋子,选择要走的棋子。

2 .棋子闪烁后,左键点击能走到得位置,棋子就会一蹦一跳的“跳”过去了。如果选择无法到达的位置是无法走棋的,系统会有错误的提示音,你可以另外选择可通行的路径走棋。

3 .如果中途想更换棋子,直接点选其他棋子即可。希望可以帮到你


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11682257.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存