21xrx.com
2025-02-16 22:10:11 Sunday
登录
文章检索 我的文章 写文章
C++ 连连看源代码
2023-07-05 00:55:30 深夜i     --     --
C++ 连连看 源代码 游戏开发 图形界面

C++连连看源代码

连连看是一款经典的休闲游戏,在很多电脑、手机、平板电视和游戏机上都有该游戏的版本。今天,我们来学习如何用C++语言实现连连看游戏。

首先,让我们看一下黑客帝国版本的连连看游戏。

简单来说,这个游戏的目的是找到每个图片的相同部分。游戏板有很多图片,并排列成几行和几列。你需要用鼠标点击每张图片,找到与其有相同部分的另一张图片,并消除它们。没有相同图片的部分将被覆盖,并创建新的图片。游戏结束时,没有剩下的图片,你就赢了。

游戏逻辑

这个游戏有几个方面需要考虑,包括游戏板、图片的选择、如何连接图片,以及如何更新游戏板。

对于游戏板,我们可以考虑使用一个二维字符数组。在该数组中,我们可以用字符来表示不同的图片。由于每个图片都需要与其相同的另一张图片进行匹配,我们需要一个算法来根据两个图片的位置,判断它们是否是相同的。最简单且最直接的判断方式是,在二维数组中,检查它们是否在同一行或同一列。如果是,检查它们之间是否有任何阻碍。

我们可以使用DFS(深度优先搜索)来为两个图片找到路径,以确定它们是否相同。我们可以使用一个布尔型数组来表示每个像素是否已被访问。我们可以将两幅图像的初始位置传递给DFS强制执行,然后扫描所有可用的空间,以在它们之间找到一条路径。如果找到路径,则这两个图片是相同的,可以消除掉它们。否则,它们不能被消除。

序列图

我们会需要一个序列图,用于显示游戏的状态。我们可以在每个游戏循环中先清除序列图,然后重新绘制所有图片。我们可以使用字符数组来表示不同图片的显示。与游戏板一样,我们将需要一些算法来显示图片之间的路径。

更新板

在传递坐标,删除图片,更改板等方面,我们需要一个可编辑的板。对于此,我们可以在游戏循环中重绘整个板。

代码实现

具体代码实现请见以下示例代码。请注意,此代码仅实现了基本玩法,但是您可以根据自己的需要进行修改和完善。


#include<bits/stdc++.h>

using namespace std;

const int ROW=20;

const int COL=20;//定义行列

char a[ROW][COL];//定义二维数组

int book[ROW][COL]={0};//DFS核心代码中用到的visit数组,书上采用的是bool类型的数组,但是由于其bool类型只能取0或1,且开辟的空间稍大,因此使用int型数组。

struct node

  int x;

  int y;

st, ed, last;

//定义每个图片的位置

struct node image[11]= {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};//设置全局变量,表示每张图片的编号以及对应的坐标

//手工给定每张图片的位置

void seting()

{

  image[0]= 4;

  image[1]= 1;

  image[2]= 4;

  image[3]= 6;

  image[4]= 3;

  image[5]= 5;

  image[6]= 4;

  image[7]= 10;

  image[8]= 14;

  image[9]= 13;

}

//从坐标(x1,y1)到坐标(x2,y2)是否能够直接相连

bool DFS(int prevx,int prevy,int nextx,int nexty)

{

  if (nextx==ed.x&&nexty==ed.y) //边界条件

    return true;

  if (a[nextx][nexty]!='.') //如果下一个点不是空白部分,就不能通过

    return false;

  //向8个方向搜索

  int nextx_[2]= -1;

  int nexty_[2]= 1;//先进行转换

  for (int i=0; i<2; i++)

  {

    int tx=nextx+nextx_[i]; //计算下一个点的坐标

    int ty=nexty+nexty_[i];

    //判断下一个点是否越界

    if (tx<0||tx>=ROW||ty<0||ty>=COL)

      continue ;

    //判断下一个点是否是已经用过的点

    if (book[tx][ty]==1)

      continue ;

    if (tx!=nextx&&ty!=nexty) //夹角不为90度,不能通过,这就是判断转弯特别关键的一步

      continue ;

    book[tx][ty]=1; //标记这个点已经走过

    bool flag=DFS(nextx,nexty,tx,ty); //如果从(tx,ty)出发,能够到达nextx,nexty)就返回真

    if (flag)//如果真的找到这个图片与另一个图片能通讯

    即最后找到的那个点

  }

  return false;//如果8个方向都没办法了,则返回假

}

//找到两个相同的图片是否可以连接

bool two_point(int x1,int y1,int x2,int y2)

{

  st.x=x1;

  st.y=y1;

  ed.x=x2;

  ed.y=y2;

  for (int i=0; i<ROW; i++)

    for (int j=0; j<COL; j++)

      book[i][j]=0;//重置visit数组

  last.x=x1;

  last.y=y1;

  return DFS(x1,y1,x2,y2);//寻找两个图片是否可以通讯

}

//更新界面

void update(int t)

{

  system("cls");//清空屏幕

  for (int i=0; i<10; i++)//扫一遍所有的图片,进行绘制,因为全部全部都可能进行更换

    for (int j=0; j<2; j++)//原因见下面的详细说明部分

      if (image[i].x!=-1&&image[i].y!=-1)//如果当前该坐标有编号的图片,则进行绘制

      {

        if (j==1)//不同的块用不同的字符进行标示

          cout<<"R";

        else

          cout<<"#";

      }

      else

        cout<<" ";//没有编号的图片就直接覆盖为' '表示空白

  cout<<"\n";//注意,每行绘制之后都要换行,否则也会影响显示效果

  cout<<"\n";

  cout<<"score: "<<t<<"\n";//显示分数

  for (int i=0; i<ROW; i++)

    for (int j=0; j<COL; j++)

      book[i][j]=0; //每次更新板,都要重新置位visit数组

}

//整个游戏的主体过程

int main()

{

  bool flag=true;//用来进行胜利的判断的标志变量

  int score=0;

  memset(a,'.',sizeof(a)); //初始化,全部赋值为'.'

  seting();//手工设定每张图片的坐标

  //全部绘制出来

  update(score);

  while (flag)//游戏进行的主体循环

  {

    int x1,y1,x2,y2;//用来存放想要消除的两张图片的编号

    cin>>x1>>y1;//输入第一张图片的坐标

    cin>>x2>>y2;

    int ima1=-1,ima2=-1;

    //通过坐标位置查找编号

    for (int i=0; i<10; i++)

    {

      if (image[i].x==x1&&image[i].y==y1)

        ima1=i;

      if (image[i].x==x2&&image[i].y==y2)

        ima2=i;

    }

    if (ima1==ima2)//判断是否消除了相对应的两张图片

      continue ;

    if (a[x1][y1]!=a[x2][y2])//判断这两张图片是否是相同的图片

      continue ;

    //检查是否可以连接

    if (!two_point(x1,y1,x2,y2))

      continue ;

    image[ima1].x=-1;//更改图片的坐标

    image[ima1].y=-1;

    image[ima2].x=-1;

    image[ima2].y=-1;

    a[x1][y1]='.';//更改数组中的值为 '.'

    a[x2][y2]='.';

    score+=10;//增加10分

    update(score);//重新绘制游戏版(包括得分)

    flag=false;//全盘胜利判断

    for (int i=0; i<10; i++)

      if (image[i].x!=-1) //如果有任何一张图片没有消除

        flag=true;

  }

  //胜利后的清空操作

  system("cls");//清除屏幕显示,输出游戏结束的信息

  cout<<"Finish!\n";

  for (int i=0; i<ROW; i++)//重置板,其实重新赋值为‘.’在上文出现过

    for (int j=0; j<COL; j++)

      a[i][j]='.';

  system("pause");//调用系统暂停函数,便于测试结果。具体是哪个系统调用函数,可以自行百度。

  return 0;

}

这是实现连连看游戏的基本代码。希望以上内容对你有所帮助,同时也祝你好运!

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复