#include <vector>
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
enum direction{
north = 0,
east,
south,
west,
center,
error
};
typedef struct pointInfo
{
int x;
int y;
} Point;
typedef vector<Point> pVector;
typedef vector<Point>::iterator pIter;
typedef struct routeInfo
{
//enum direction pre_direction;
pVector point_vector;
} Route;
int map[6][6] = {
{0,0,0,0,0,0},
{0,1,0,0,0,0},
{0,1,0,1,0,0},
{0,1,0,1,0,0},
{0,0,0,0,0,0},
{0,0,0,0,0,0}
};
enum direction getDirection2(Point* p1, Point* p2)
{
if (p1->x -p2->x == 1 && p1->y - p2->y == 0)
return west;
else if (p1->x - p2->x == -1 && p1->y - p2->y == 0)
return east;
else if (p1->x - p2->x == 0 && p1->y - p2->y == 1)
return north;
else if (p1->x - p2->x == 0 && p1->y - p2->y == -1)
return south;
else {
//error
return error;
}
};
enum direction getDirection(Route* r)
{
if (r->point_vector.size() <2)
{
return center;
}else
{
return getDirection2(&r->point_vector[r->point_vector.size()-2], &r->point_vector[r->point_vector.size()-1]);
}
}
int getCurTurns(Route* t)
{
int turns = 0;
if (t->point_vector.size() >2)
{
enum direction preDirection = center;
enum direction curDirection;
for (int i = 0; i < t->point_vector.size() - 1; i++)
{
curDirection = getDirection2(&t->point_vector[i], &t->point_vector[i+1]);
if (preDirection != center && preDirection != curDirection)
{
turns ++;
}
preDirection = curDirection;
}
}
return turns;
};
//only turn num < 2 can be the neighbors
void setNeighbors(Route* r, Point* p, pVector* neighbors)
{
r->point_vector.push_back(*p);
if (getCurTurns(r) < 3)
neighbors->push_back(*p);
r->point_vector.pop_back();
}
pVector getMovableNeighbors(Point* p, Point* end, Route* r)
{
pVector neighbors;
enum direction direct;
direct = getDirection(r);
//east
if (p->x + 1 < 6 //border
&& map[p->y][p->x + 1] != 1//movable
&& direct != west // can not go back
)
{
Point n;
n.x = p->x + 1; n.y = p->y;
setNeighbors(r, &n, &neighbors);
}
//west
if (p->x - 1 >= 0 //border
&& map[p->y][p->x - 1] != 1 //movable
&& direct != east // can not go back
)
{
Point n;
n.x = p->x - 1; n.y = p->y;
setNeighbors(r,&n, &neighbors);
}
//south
if (p->y + 1 < 6 //border
&& map[p->y + 1][p->x] != 1 //movable
&& direct != north // can not go back
)
{
Point n;
n.x = p->x; n.y = p->y + 1;
setNeighbors(r,&n, &neighbors);
}
//north
if (p->y - 1 >= 0 //border
&& map[p->y - 1][p->x] != 1 //movable
&& direct != south // can not go back
)
{
Point n;
n.x = p->x ; n.y = p->y - 1;
setNeighbors(r,&n, &neighbors);
}
return neighbors;
}
void printTheRoute(Route* aRoute)
{
ostringstream ost;
ost << "The Route is : turn " << getCurTurns(aRoute)<< "\n";
for(int i = 0 ; i < aRoute->point_vector.size(); i++)
{
ost << "[" << aRoute->point_vector[i].x << "," << aRoute->point_vector[i].y << "]";
if (i != aRoute->point_vector.size() - 1)
{
ost << " -> ";
}
}
cout << ost.str() << "\n";
}
void move_step(Point* start, Point* end, Route* r)
{
//get point's neighbor
//if the neighbor is the target, mission end
//else move_step(neighbor)
pVector neighbors = getMovableNeighbors(start, end, r);
pIter it;
for (it = neighbors.begin(); it != neighbors.end(); it++)
{
if (it->x == end->x && it->y == end->y)
{
//Found!!
r->point_vector.push_back(*end);
printTheRoute(r);
r->point_vector.pop_back();
}else
{
r->point_vector.push_back(*it);
//printTheRoute(r);
move_step(it, end, r);
r->point_vector.pop_back();
//printTheRoute(r);
}
}
}
void test();
void main()
{
//cout << "hello world!\n";
//test();
Route aRoute;
Point start;
Point des;
start.x = 1; start.y = 1;
des.x = 3; des.y = 3;
aRoute.point_vector.push_back(start);
map[des.y][des.x] = 0;
move_step(&start, &des, &aRoute);
}
void test()
{
Point p1;
p1.x = 10;
p1.y = 5;
Point p2;
p2.x = 10; p2.y = 6;
pVector points;
points.push_back(p1);
points.push_back(p2);
Route aRoute;
aRoute.point_vector = points;
for(int i = 0 ; i < aRoute.point_vector.size(); i++)
{
ostringstream ost;
ost << "point x: " << aRoute.point_vector[i].x << " point y: " << aRoute.point_vector[i].y << "\n";
cout << ost.str();
}
}
分享到:
相关推荐
微信小游戏源码 奇葩连连看游戏源码(仅用于学习参考)微信小游戏源码 奇葩连连看游戏源码(仅用于学习参考)微信小游戏源码 奇葩连连看游戏源码(仅用于学习参考)微信小游戏源码 奇葩连连看游戏源码(仅用于学习...
在本项目中,"连连看vc6.0实现"是一个基于Microsoft Visual C++ 6.0(简称VC6.0)开发的经典休闲游戏——连连看的实现。它利用了编程技术来构建游戏逻辑,其中涉及到了两个核心概念:双缓冲技术和连连看算法。 **双...
连连看是一款广受欢迎的休闲游戏,它通过匹配相同图案的方块进行消除,直至清除所有方块或无法再匹配为止。在这个项目中,我们看到一个使用C++编程语言实现的连连看游戏。C++是一种强大的、面向对象的编程语言,非常...
QQ连连看是一款深受玩家喜爱的经典休闲游戏,而“按键精灵”是一种自动化工具,它能够模拟用户的键盘和鼠标操作,极大地提升了工作效率或者游戏体验。在这个场景中,我们将关注的重点放在使用Vbscript(Visual Basic...
《连连看精品 25合1》是一款深受玩家喜爱的游戏集合,它包含了25个不同主题和风格的连连看游戏,旨在提供丰富的娱乐体验。连连看游戏作为一种经典的休闲益智类游戏,以其简单的规则和深邃的策略性吸引了广泛的用户...
《cocos creator连连看游戏》是一款使用Cocos Creator框架结合JavaScript语言开发的休闲益智类游戏,主要目标是通过连接相同图案的方块,直至消除所有方块来完成关卡。这款游戏适合初级开发者进行学习和实践,因为它...
连连看是一款广受欢迎的休闲消除类游戏,它的玩法简单,却又具有一定的挑战性。这个名为“连连看素材.rar”的压缩包文件显然包含了制作连连看游戏所需的图像资源。下面将详细探讨连连看游戏的设计元素以及这些素材在...
【H5连连看小游戏开发详解】 在Web开发领域,HTML5(H5)技术的广泛应用使得开发者能够创建出丰富的互动体验,其中包括各种小游戏。"H5连连看小游戏示例及源码"是一个基于H5技术的简单游戏项目,旨在提供一个快速...
期末大作业基于VUE的连连看小游戏源码,内附安装教程。 期末大作业基于VUE的连连看小游戏源码,内附安装教程。期末大作业基于VUE的连连看小游戏源码,内附安装教程。期末大作业基于VUE的连连看小游戏源码,内附安装...
在这个"Unity连连看小游戏"项目中,开发者已经构建了一个经典的游戏体验,包括游戏面板、视觉素材和核心算法。下面我们将深入探讨这个项目的各个方面。 首先,游戏面板是连连看游戏的核心组件,它是由一系列可匹配...
连连看是一款广受欢迎的休闲消除类游戏,而MFC(Microsoft Foundation Classes)是微软提供的一套C++库,用于构建Windows应用程序。这个压缩包文件包含了使用MFC开发的连连看小游戏的源代码,适合对MFC编程感兴趣的...
《使用MFC编写的连连看》是一款基于Microsoft Foundation Classes (MFC)库开发的经典益智游戏。MFC是微软提供的一套C++类库,它为Windows应用程序开发提供了丰富的功能和便捷的接口,使得开发者可以更高效地构建用户...
连连看是一款广受欢迎的经典休闲游戏,其关卡版更是在原有的基础上增加了更多挑战性和趣味性。这款游戏的核心玩法是通过寻找并消除屏幕上成对出现的相同图案,直至所有图案都被消除为止。下面将详细阐述连连看游戏的...
《连连看》是一款深受大众喜爱的经典消除类游戏,它的核心玩法是通过寻找并连接两个相同图案的方块,使得它们在相连的路径上没有其他方块阻隔,从而达到消除的目的。这款游戏简单易上手,但却具有一定的挑战性和趣味...
《安卓连连看游戏源代码解析》 安卓连连看游戏,作为一款广受欢迎的休闲益智游戏,其源代码是理解移动应用开发、图形界面设计以及游戏逻辑实现的重要教材。源代码是开发者的心血结晶,通过深入研究,我们可以了解到...
【标题】:“连连看小程序源代码(vc++)”指的是使用Microsoft Visual C++(简称VC++)编程环境编写的连连看游戏的源代码。连连看是一款广受欢迎的休闲益智游戏,玩家需要找出并消除屏幕上成对出现的相同图案。 ...
在本项目中,我们关注的是一个使用Java编程语言实现的连连看游戏。连连看是一种流行的休闲益智游戏,玩家需要找到并消除一对相同的图像,直到所有配对都被消除。在这个实现中,我们将深入探讨Java如何被用来构建这样...
《连连看项目——深入探索CocosCreate开发技术》 连连看,一款深受广大玩家喜爱的休闲益智游戏,以其简洁的规则和丰富的挑战性在众多游戏中独树一帜。本项目“连连看”正是基于CocosCreate开发的一款游戏,旨在为...
《MFC实现的麻将连连看源代码解析》 在编程领域,MFC(Microsoft Foundation Classes)是微软提供的一套C++库,用于构建Windows应用程序。它基于面向对象的设计,为开发者提供了丰富的用户界面元素和系统服务。本...
**Python连连看小游戏源代码详解** 在编程领域,制作小游戏是一种常见的学习和实践方式,而“连连看”作为一款广受欢迎的休闲游戏,其Python实现更是吸引了许多初级和中级开发者。这个项目是基于Python语言构建的,...