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];
		}
	}
}
发布了107 篇原创文章 · 获赞 31 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/love_phoebe/article/details/95314948