`
mocca3in1
  • 浏览: 45309 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

连连看

Go 
阅读更多

#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实现

    在本项目中,"连连看vc6.0实现"是一个基于Microsoft Visual C++ 6.0(简称VC6.0)开发的经典休闲游戏——连连看的实现。它利用了编程技术来构建游戏逻辑,其中涉及到了两个核心概念:双缓冲技术和连连看算法。 **双...

    连连看_连连看_c++连连看_

    连连看是一款广受欢迎的休闲游戏,它通过匹配相同图案的方块进行消除,直至清除所有方块或无法再匹配为止。在这个项目中,我们看到一个使用C++编程语言实现的连连看游戏。C++是一种强大的、面向对象的编程语言,非常...

    QQ连连看按键精灵代码_QQ_连连看_Vbscript_按键精灵_

    QQ连连看是一款深受玩家喜爱的经典休闲游戏,而“按键精灵”是一种自动化工具,它能够模拟用户的键盘和鼠标操作,极大地提升了工作效率或者游戏体验。在这个场景中,我们将关注的重点放在使用Vbscript(Visual Basic...

    连连看精品 25合1

    《连连看精品 25合1》是一款深受玩家喜爱的游戏集合,它包含了25个不同主题和风格的连连看游戏,旨在提供丰富的娱乐体验。连连看游戏作为一种经典的休闲益智类游戏,以其简单的规则和深邃的策略性吸引了广泛的用户...

    cocos creator连连看游戏

    《cocos creator连连看游戏》是一款使用Cocos Creator框架结合JavaScript语言开发的休闲益智类游戏,主要目标是通过连接相同图案的方块,直至消除所有方块来完成关卡。这款游戏适合初级开发者进行学习和实践,因为它...

    连连看素材.rar

    连连看是一款广受欢迎的休闲消除类游戏,它的玩法简单,却又具有一定的挑战性。这个名为“连连看素材.rar”的压缩包文件显然包含了制作连连看游戏所需的图像资源。下面将详细探讨连连看游戏的设计元素以及这些素材在...

    H5连连看小游戏示例及源码

    【H5连连看小游戏开发详解】 在Web开发领域,HTML5(H5)技术的广泛应用使得开发者能够创建出丰富的互动体验,其中包括各种小游戏。"H5连连看小游戏示例及源码"是一个基于H5技术的简单游戏项目,旨在提供一个快速...

    期末大作业基于VUE的连连看小游戏源码.zip

    期末大作业基于VUE的连连看小游戏源码,内附安装教程。 期末大作业基于VUE的连连看小游戏源码,内附安装教程。期末大作业基于VUE的连连看小游戏源码,内附安装教程。期末大作业基于VUE的连连看小游戏源码,内附安装...

    Unity连连看小游戏

    在这个"Unity连连看小游戏"项目中,开发者已经构建了一个经典的游戏体验,包括游戏面板、视觉素材和核心算法。下面我们将深入探讨这个项目的各个方面。 首先,游戏面板是连连看游戏的核心组件,它是由一系列可匹配...

    连连看 MFC 连连看 mfc 连连看

    连连看是一款广受欢迎的休闲消除类游戏,而MFC(Microsoft Foundation Classes)是微软提供的一套C++库,用于构建Windows应用程序。这个压缩包文件包含了使用MFC开发的连连看小游戏的源代码,适合对MFC编程感兴趣的...

    使用MFC编写的连连看

    《使用MFC编写的连连看》是一款基于Microsoft Foundation Classes (MFC)库开发的经典益智游戏。MFC是微软提供的一套C++类库,它为Windows应用程序开发提供了丰富的功能和便捷的接口,使得开发者可以更高效地构建用户...

    连连看,关卡版

    连连看是一款广受欢迎的经典休闲游戏,其关卡版更是在原有的基础上增加了更多挑战性和趣味性。这款游戏的核心玩法是通过寻找并消除屏幕上成对出现的相同图案,直至所有图案都被消除为止。下面将详细阐述连连看游戏的...

    连连看-连连看.rar

    《连连看》是一款深受大众喜爱的经典消除类游戏,它的核心玩法是通过寻找并连接两个相同图案的方块,使得它们在相连的路径上没有其他方块阻隔,从而达到消除的目的。这款游戏简单易上手,但却具有一定的挑战性和趣味...

    连连看安卓游戏源代码

    《安卓连连看游戏源代码解析》 安卓连连看游戏,作为一款广受欢迎的休闲益智游戏,其源代码是理解移动应用开发、图形界面设计以及游戏逻辑实现的重要教材。源代码是开发者的心血结晶,通过深入研究,我们可以了解到...

    连连看小程序源代码(vc++)

    【标题】:“连连看小程序源代码(vc++)”指的是使用Microsoft Visual C++(简称VC++)编程环境编写的连连看游戏的源代码。连连看是一款广受欢迎的休闲益智游戏,玩家需要找出并消除屏幕上成对出现的相同图案。 ...

    基于Java的连连看实现代码

    在本项目中,我们关注的是一个使用Java编程语言实现的连连看游戏。连连看是一种流行的休闲益智游戏,玩家需要找到并消除一对相同的图像,直到所有配对都被消除。在这个实现中,我们将深入探讨Java如何被用来构建这样...

    连连看项目_连连看_

    《连连看项目——深入探索CocosCreate开发技术》 连连看,一款深受广大玩家喜爱的休闲益智游戏,以其简洁的规则和丰富的挑战性在众多游戏中独树一帜。本项目“连连看”正是基于CocosCreate开发的一款游戏,旨在为...

    MFC做的麻将连连看源代码

    《MFC实现的麻将连连看源代码解析》 在编程领域,MFC(Microsoft Foundation Classes)是微软提供的一套C++库,用于构建Windows应用程序。它基于面向对象的设计,为开发者提供了丰富的用户界面元素和系统服务。本...

    Python连连看小游戏源代码

    **Python连连看小游戏源代码详解** 在编程领域,制作小游戏是一种常见的学习和实践方式,而“连连看”作为一款广受欢迎的休闲游戏,其Python实现更是吸引了许多初级和中级开发者。这个项目是基于Python语言构建的,...

Global site tag (gtag.js) - Google Analytics