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++经典小游戏汇总
python经典小游戏汇总
python俄罗斯方块游戏集合
JavaScript经典游戏 玩不停
javascript经典小游戏汇总
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
以上是 C语言实现消消乐小游戏 的全部内容, 来源链接: utcz.com/p/245741.html