C语言实现消消乐小游戏
时间:2021-08-31 09:59:18|栏目:C代码|点击: 次
本文实例为大家分享了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++实现LeetCode(17.电话号码的字母组合)
栏 目:C代码
本文标题:C语言实现消消乐小游戏
本文地址:http://www.codeinn.net/misctech/171241.html