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];
		}
	}
}

 

  • 10
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
C语言是一种通用的编程语言,它被广泛应用于系统软件开发和嵌入式系统等领域。它具有高效、灵活和可移植等特点,是学习编程的入门语言之一。 关于简易游戏实现,可以使用C语言的基本语法和数据结构来完成。以下是一个简单的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROWS 5 #define COLS 5 // 初始化游戏面板 void initBoard(char board[ROWS][COLS]) { int i, j; for (i = 0; i < ROWS; i++) { for (j = 0; j < COLS; j++) { board[i][j] = 'A' + rand() % 6; // 随机生成A-F的字符 } } } // 打印游戏面板 void printBoard(char board[ROWS][COLS]) { int i, j; for (i = 0; i < ROWS; i++) { for (j = 0; j < COLS; j++) { printf("%c ", board[i][j]); } printf("\n"); } } // 除相同的方块 void eliminate(char board[ROWS][COLS], int row, int col) { char target = board[row][col]; if (target == ' ') { return; } board[row][col] = ' '; if (row > 0 && board[row - 1][col] == target) { eliminate(board, row - 1, col); } if (row < ROWS - 1 && board[row + 1][col] == target) { eliminate(board, row + 1, col); } if (col > 0 && board[row][col - 1] == target) { eliminate(board, row, col - 1); } if (col < COLS - 1 && board[row][col + 1] == target) { eliminate(board, row, col + 1); } } // 除所有相同的方块 void eliminateAll(char board[ROWS][COLS]) { int i, j; for (i = 0; i < ROWS; i++) { for (j = 0; j < COLS; j++) { if (board[i][j] != ' ') { eliminate(board, i, j); } } } } int main() { srand(time(NULL)); // 初始化随机数种子 char board[ROWS][COLS]; initBoard(board); // 初始化游戏面板 printf("初始游戏面板:\n"); printBoard(board); // 打印初始游戏面板 eliminateAll(board); // 除所有相同的方块 printf("\n除后的游戏面板:\n"); printBoard(board); // 打印除后的游戏面板 return 0; } ``` 这个示例代码实现了一个简单的游戏,通过随机生成字符填充游戏面板,然后除相同的方块。你可以根据自己的需求进行修改和扩展。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值