说明:本文的代码参考了网络上下载的源代码:《2013.3.25 游戏开发基地——孙广东 消灭小星星》,在此对原作者表示衷心感谢!

这几天在看算法导论里面的BFS和DFS,于是发现消灭小星星这个游戏就用到了BFS算法,就自己试着写了一下消灭小星星游戏的主要代码。现在与大家分享,欢迎批评指正!

#include <stdlib.h>
//小星星的坐标
class point
{
public:int x;int y;point():x(0),y(0){}
};
//存储小星星的链表
class starListNode
{
public:point p;starListNode *next;starListNode(){p.x = 0;p.y = 0;next = NULL;}
};
//链表队列
class listQueue
{
public:starListNode *head;starListNode *tail;listQueue():head(NULL),tail(NULL){}
};
listQueue lq;
//初始化队列
bool initListQueue()
{lq.head = new starListNode();lq.tail = lq.head;if(lq.head == NULL)return false;lq.head->next == NULL;return true;
}
//入队
bool enQueue(point tp)
{starListNode *np = new starListNode();if(np == NULL)return false;np->p.x = tp.x;np->p.y = tp.y;np->next = NULL;lq.tail->next = np;lq.tail = np;return true;
}
//出队
bool deQueue(point &tq)
{if(lq.head == lq.tail)return false;starListNode *slnp;slnp = lq.head->next;tq.x = slnp->p.x;tq.y = slnp->p.y;lq.head->next = slnp->next;if(slnp == lq.tail)lq.tail = lq.head;delete slnp;return true;
}
//小星星类
class star
{
public:int x;//横坐标int y;//纵坐标int type;//取值为1到5,6表示背景色int state;//0表示未被选中,1表示被选中
};
star st[10][10];
//初始化所有星星
void initStar()
{for(int i = 0;i < 10;i++)for(int j = 0;j < 10;j++){st[i][j].x = j;st[i][j].y = i;st[i][j].type = rand()%5 + 1;st[i][j].state = 0;}
}
//判断某一个星星的上方是否还有未消去的星星,如果还有未消去的星星则返回true,否则返回false
bool upExistStar(star s)
{int j = s.x;int i = s.y;for(;i > 0;--i){if(st[i-1][j].type != 6)return true;}return false;
}
//处理空格,使星星下落
void dealBlank()
{int i,j,m;for(j = 0;j < 10;++j){for(i = 9;i > 0;--i){if(st[i][j].type == 6 && upExistStar(st[i][j]) == true){for(m = i;m > 0;--m)st[m][j].type = st[m-1][j].type;st[m][j].type = 6;}   }}
}
//判断某一列是否为空白
bool isBlankColumn(int j)
{for(int i = 0;i < 10;i++){if(st[i][j].type != 6)return false;}return true;
}
//消去出现的空白列
void dealBlankColumn()
{for(int j = 0;j < 10;j++){if(isBlankColumn(j)){for(int m = j;m < 9;m++)for(int i = 0;i < 10;i++)st[i][m].type = st[i][m+1].type;}}
}
//当选中一颗小星星时,找到与它相邻的所有相同星星
void findAllSameStar(int sx,int sy)
{if(st[sx][sy].type == 6)return;st[sx][sy].state = 1;int starType = st[sx][sy].type;point tepo;tepo.x = st[sx][sy].x;tepo.y = st[sx][sy].y;initListQueue();enQueue(tepo);point tp;//用BFS算法,找到与选中的小星星相同的所有相邻小星星while(deQueue(tp)){if(tp.x > 0 && st[tp.x - 1][tp.y].type == starType && st[tp.x - 1][tp.y].state != 1){st[tp.x - 1][tp.y].state = 1;tepo.x = tp.x - 1;tepo.y = tp.y;enQueue(tepo);}if(tp.x < 9 && st[tp.x + 1][tp.y].type == starType && st[tp.x + 1][tp.y].state != 1){st[tp.x + 1][tp.y].state = 1;tepo.x = tp.x + 1;tepo.y = tp.y;enQueue(tepo);}if(tp.y > 0 && st[tp.x][tp.y - 1].type == starType && st[tp.x][tp.y - 1].state != 1){st[tp.x][tp.y - 1].state = 1;tepo.x = tp.x;tepo.y = tp.y - 1;enQueue(tepo);}if(tp.y < 9 && st[tp.x][tp.y + 1].type == starType && st[tp.x][tp.y + 1].state != 1){st[tp.x][tp.y + 1].state = 1;tepo.x = tp.x;tepo.y = tp.y + 1;enQueue(tepo);}}
}
int score = 0;
//当鼠标再次点击选中的小星星时,与它相邻的所有相同小星星均消失,并且悬空的小星星下降,空白列被消除
void wipeAllStar()
{for(int i = 0;i < 10;i++){for(int j = 0;j < 10;j++){if(st[i][j].state == 1 && st[i][j].type != 6){st[i][j].type = 6;score += 200;//每消去一个星星得200分st[i][j].state = 0;//消去后状态改为未选中}}}//处理悬空的小星星,在这里要调用3次dealBlank()是因为如果第一行的一个小星星最大可能向下滑9格,但是在这种情况下调用一次dealBlank()后距离底部的单元格数是4,需要再调用两次dealBlank()才能使小星星坠落到底部dealBlank();dealBlank();dealBlank();//处理空白列dealBlankColumn();
}

广度优先搜索算法的典型应用——消灭小星星游戏的核心代码实现与解析相关推荐

  1. 渡一教育公开课web前端开发JavaScript精英课学习笔记(三十一)JavaScript消灭小星星游戏

    JavaScript消灭小星星游戏 <!DOCTYPE html> <html lang="en"><head><meta charset ...

  2. html,css,js写消灭小星星游戏

    首先,要写一个消灭小星星,必须考虑到有开始和重新开始两个功能,当点击小星星的时候,小星星消失,而且记录的分数随着小星星的消失而增加 HTML代码段 body{background-color: bla ...

  3. 广度优先搜索算法(有向图和无向图)

    广度优先搜索算法的思想:以v作为源点出发访问其他节点,首先使用队列存储节点,再从队列中取出节点,遍历查找v和其他连通的节点,将和v连通的节点并且未被访问过的节点入队,遍历完和v连通的节点:再从队列中取 ...

  4. DFS深度优先搜索算法/BFS广度优先搜索算法(c/c++)

    深度优先搜索算法(DFS) 深度优先搜索算法思路:(有点贪心算法的意思) 1,从某个给定结点a出发,访问它 2,查找关于a的邻接点,查找到a的第一个邻接点b之后,对b结点进行DFS搜索,也就是对b结点 ...

  5. JavaScript实现breadth First Search广度优先搜索算法(附完整源码))

    JavaScript实现breadth First Search广度优先搜索算法(附完整源码) LinkedListNode.js完整源代码 Comparator.js完整源代码 LinkedList ...

  6. boost::graph模块实现广度优先搜索算法的使用示例

    boost::graph模块实现广度优先搜索算法的使用示例 实现功能 C++实现代码 实现功能 boost::graph模块实现广度优先搜索算法的使用示例 C++实现代码 #include <b ...

  7. boost::graph模块实现深度优先搜索 和广度优先搜索算法的测试程序

    boost::graph模块实现深度优先搜索 和广度优先搜索算法的测试程序 实现功能 C++实现代码 实现功能 boost::graph模块实现深度优先搜索 和广度优先搜索算法的测试程序 C++实现代 ...

  8. bfs广度优先搜索算法_图的广度优先搜索(BFS)

    bfs广度优先搜索算法 What you will learn? 您将学到什么? How to implement Breath first search of a graph? 如何实现图的呼吸优先 ...

  9. PopStar(消灭星星)游戏源代码下载、分析及跨平台移植---第四篇(关卡)

    背景: 本来打算把第三篇和第四篇合并都一起,但以前计划分开,就还是分来吧:一般的游戏涉及到关卡的话,一般都会建立一个数组来存放各种定义参数,消灭星星关卡比较容易,不需要建立数组,只有两个参数level ...

最新文章

  1. jsp图片上传(commons-fileupload组件)
  2. cshrc设置 ic618_.cshrc一般在什么地方
  3. 计算机网络基础系列(七)复用、分用和可靠数据传输的基本原理
  4. Linux云用户,Linux 用户与权限
  5. github是干什么的_GitHub排名第一!免费最强“抢票神器”在手,程序员抢票不愁
  6. 《手把手教你学DSP——基于TMS320F28335》北京航空航天大学出版社-张卿杰等-电子版-PDF
  7. CentOS7增加或修改SSH端口号
  8. Linux的mysql主从配置
  9. python中linspace函数_python np.linspace
  10. 股票交易接口JavaScript开发
  11. java node对比_服务端I/O性能:Node、PHP、Java、Go的对比
  12. 处理数据库镜像问题的一个案例——数据库主体与镜像断开连接
  13. wcs开发_WCS 5.2的评论—用于Webcast和Webcam开发人员的WebRTC服务器
  14. vxWorks6.6下基于vxBus的以太网驱动开发
  15. 一碗酸爽面-倒在黎明前
  16. Kafka触发Rebalance的场景分析
  17. 摄像头参数介绍 ———— 信噪比(SNR)
  18. 【bzoj1003】[ZJOI2006]物流运输trans 最短路+dp
  19. docker下载与安装
  20. 城市景观生态规划概述

热门文章

  1. JS实战应用之做LOL领图标任务~
  2. 笔记本超薄本14寸,15.6寸,16.1寸对比图
  3. arm linux打印机驱动编译方法,嵌入式linux驱动打印机HP系列
  4. 如何设置在电脑屏幕和显示器屏幕显示不同的画面窗口
  5. c++win32项目 如何显示后再删除一个绘图_iMATLAB 绘图扩展函数系列 | 让你绘图更自由(进阶专辑开篇)!...
  6. 【Ubuntu22.04 安装星火商店报错解决办法】
  7. 反斜杠“\”与斜杠“/” 的区别
  8. Threadlocal学习及内存泄漏原因和解决方案
  9. 小米智能家居硬件的发展进程盘点
  10. c语言读音,C语言的32个关键字(读音、用法、注释)转来的,给刚接触C的