C语言实现消消乐小游戏

时间:2021-05-20

本文实例为大家分享了C语言实现消消乐小游戏的具体代码,供大家参考,具体内容如下

代码:

#include<iostream>#include<cstdlib>#include<bitset>#include<conio.h>#include<time.h>#include <windows.h>#include<queue>#include<algorithm>using namespace std; struct node{ int x, y;}; const int size = 9;//地图大小int Score;//得分 int Map[size][size];//主地图int Map_2[size][size];//辅助地图 用于显示int dropNumbe[size][size];//下降距离统计int bfsVis[size][size];//bfs标记数组 int xx[4] = { 0, 0, 1, -1 };int yy[4] = { 1, -1, 0, 0 };//方向调整数组 int random();//随机数产生void initMap();//地图初始化void updateMap(int flag);//打印地图void printSqure(int i);//形状打印void dropNumberCount();//下落高度统计void squreDrop();//根据下落高度更新地图void reflashMap();//下落后的地图新元素添加void mapCopy();//数组复制void displayUpdate();//消失效果bool updateCheck();//检测是否有符合消除条件,通过bfs消除bool bfsCheck(int x, int y, int squre);//bfs标记及越界检测void Bfs(int x, int y); int main(){ initMap(); Score = 0; updateMap(1); while (true) { bool isUpdate = false; int x1, x2, y1, y2; cout << "please input x1,y1,x2,y2" << endl; cin >> x1 >> y1 >> x2 >> y2; mapCopy(); swap(Map[x1][y1], Map[x2][y2]); updateMap(1); isUpdate = updateCheck(); if (isUpdate){ dropNumberCount(); squreDrop(); cout << endl; cout << "-------------------- drop" << endl; updateMap(1); cout << endl; cout << "-------------------- reflash" << endl; reflashMap(); updateMap(1); while (isUpdate = updateCheck()){ dropNumberCount(); squreDrop(); cout << endl; cout << "-------------------- drop" << endl; updateMap(1); cout << endl; cout << "-------------------- reflash" << endl; reflashMap(); updateMap(1); system("pause"); } } else{ system("CLS"); cout << "GAME OVER!" << endl; cout << "Total Score: "; cout << Score << endl; break; } }} int random(){ //随机数产生 int temp; while (1){ temp = rand() % 4; if (temp >= 0)return temp; }}void initMap(){ //地图初始化 srand((int)time(0)); for (int i = 1; i < size; i++){ for (int j = 1; j < size; j++){ Map[i][j] = (rand() % 4); } }}void printSqure(int i){ //形状打印 switch (i){ case -1:cout << "□"; break; case 0:cout << "■"; break; case 1:cout << "★"; break; case 2:cout << "▲"; break; case 3:cout << "●"; break; }}void updateMap(int flag){ //打印地图 cout << "Current Score:"; cout << Score << endl; for (int i = 0; i < size; i++){ for (int j = 0; j < size; j++){ if (i == 0){ cout << j << " "; } else if (j == 0){ cout << i; } else{ int x; if (flag == 1)x = Map[i][j]; else x = Map_2[i][j]; printSqure(x); } } cout << endl; }}bool updateCheck(){ //检测是否有符合消除条件,通过bfs消除 bool isUpdate = false; memset(bfsVis, 0, sizeof(bfsVis)); for (int i = 1; i < size; i++){ for (int j = 1; j < size; j++){ if (bfsVis[i][j] == 0){ bool mark = false;//存在三个一排 if ((i - 1 >= 1) && (i + 1 < size)){ int t1, t2, t3; t1 = Map[i][j]; t2 = Map[i - 1][j]; t3 = Map[i + 1][j]; if ((t1 == t2) && (t1 == t3)){ mark = true; isUpdate = true; } } if ((j - 1 >= 1) && (j + 1 < size)){ int t1, t2, t3; t1 = Map[i][j]; t2 = Map[i][j - 1]; t3 = Map[i][j + 1]; if ((t1 == t2) && (t1 == t3)){ mark = true; isUpdate = true; } } if (mark){ mapCopy(); Bfs(i, j); } } } } return isUpdate;}bool bfsCheck(int x, int y, int squre){ //bfs标记及越界检测 if (x < 1 || x >= size || y < 1 || y >= size)return false; if (bfsVis[x][y] != 0 || Map[x][y] != squre)return false; return true;}void Bfs(int x, int y){ int ans = 0; queue<node>S; node now, next; now.x = x, now.y = y; bfsVis[x][y] = 1; //point_vis[x][y] = 1; int squre = Map[x][y]; Map[x][y] = -1; cout << "BFS: " << x << " " << y << endl; S.push(now); while (!S.empty()){ now = S.front(); ans++; S.pop(); for (int i = 0; i < 4; i++){ next = now; next.x += xx[i], next.y += yy[i]; if (bfsCheck(next.x, next.y, squre) == 0)continue; bfsVis[next.x][next.y] = 1; Map[next.x][next.y] = -1; S.push(next); } } Score += ans; displayUpdate();} void displayUpdate(){ //消失效果 system("CLS"); updateMap(1); Sleep(500); system("CLS"); updateMap(2); Sleep(500); system("CLS"); updateMap(1); Sleep(500); system("CLS"); updateMap(2); Sleep(500); system("CLS"); updateMap(1);} void dropNumberCount(){ //下落高度统计 for (int i = 1; i < size; i++){ for (int j = 1; j < size; j++){ if (Map[i][j] == -1){ dropNumbe[i][j] = 0; continue; } int sum = 0; for (int z = i + 1; z < size; z++){ if (Map[z][j] == -1)sum++; } dropNumbe[i][j] = sum; } }} void squreDrop(){ //根据下落高度更新地图 for (int i = size - 1; i >= 1; i--){ for (int j = 1; j < size; j++){ int temp = dropNumbe[i][j]; if (temp != 0){ Map[i + temp][j] = Map[i][j]; Map[i][j] = -1; } } }} void reflashMap(){ //下落后的地图新元素添加 for (int i = 1; i < size; i++){ for (int j = 1; j < size; j++){ if (Map[i][j] == -1){ Map[i][j] = (rand() % 4); } } }} void mapCopy(){ //数组复制 for (int i = 1; i < size; i++){ for (int j = 1; j < size; j++){ Map_2[i][j] = Map[i][j]; } }}

更多有趣的经典小游戏实现专题,分享给大家:

C++经典小游戏汇总

python经典小游戏汇总

python俄罗斯方块游戏集合

JavaScript经典游戏 玩不停

javascript经典小游戏汇总

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章