c/c++编程日记:用C语言实现消消乐游戏(附源码)

259 篇文章 60 订阅

描述

给定一个矩阵,判断移动哪一个格子,可以实现消除。(定义连续三个即可消除)

分析

先写一个函数,判断包含(i,j)的格子是否可能实现消除。

然后就是向右向下交换,然后调用上面写好的函数判断

被交换的两个格子是否实现消除。

重点:

1、只需要向右向下交换,因为遍历的时候,后面的交换会重复。前一个判断了向右交换是否消除,后一个遍历就不需要再判断向左交换是否重复了。

2、一定要对被交换的两个格子都判断是否能消除,才能实现全面的判断。

代码:

#include<iostream> 

#include<string> 

#include<vector> 

#include<ctime> 

#include<cstdlib> usingnamespacestd; constintLEN=8; voidpmap(intmap[][LEN]) 

{ for(inti=0;i<LEN;++i) { for(intj=0;j<LEN;++j) { cout<<map[i][j]<<""; } cout<<endl; } } 

//检查以(i,j)为中心的点,看是否可以消除

 boolcheck(intmap[][LEN],inti,intj)//保证i、j不越界, 

{ if( (i-1>=0&&i+1<LEN&&map[i-1][j]==map[i][j]&&map[i][j]==map[i+1][j])

 ||(j-1>=0&&j+1<LEN&&map[i][j-1]==map[i][j]&&map[i][j]==map[i][j+1]) 

||(i-2>=0&&map[i-2][j]==map[i-1][j]&&map[i-1][j]==map[i][j]) 

||(j-2>=0&&map[i][j-2]==map[i][j-1]&&map[i][j-1]==map[i][j])

 ||(i+2<LEN&&map[i+2][j]==map[i+1][j]&&map[i+1][j]==map[i][j]) 

||(j+2<LEN&&map[i][j+2]==map[i][j+1]&&map[i][j+1]==map[i][j]) ) 

{ returntrue; } returnfalse; } boolswapAndJudge(intm[][LEN],inti,intj)

//保证i、j不越界,应该对被swap的两个点都做纵向和横向的检查 

{ intmap[LEN][LEN]; for(intii=0;ii<LEN;++ii) { for(intjj=0;jj<LEN;++jj) 

{ map[ii][jj]=m[ii][jj]; } } //原来就可以消除 if(check(map,i,j)) 

{ printf("noneedtoswapat(%d,%d)\n",i,j); returntrue; } //只需要向下换和向右换 //向下换 if(i+1<LEN) { swap(map[i+1][j],map[i][j]); if(check(map,i,j)) { printf("#swapandsweap!(%d,%d)\n",i,j); returntrue; }

 if(check(map,i+1,j)) { printf("#swapandsweap!(%d,%d)\n",i+1,j); returntrue; } swap(map[i+1][j],map[i][j]);//换回来 } //向右换 if(j+1<LEN) { swap(map[i][j+1],map[i][j]); if(check(map,i,j)) 

{ printf("#swapandsweap!(%d,%d)\n",i,j); returntrue; } if(check(map,i,j+1)) { printf("#swapandsweap!(%d,%d)\n",i,j+1); returntrue; } swap(map[i][j+1],map[i][j]);//换回来 } returnfalse; } 

voidfindMinSwap(intmap[][LEN]) { for(inti=0;i<LEN;++i) { for(intj=0;j<LEN;++j) { if(swapAndJudge(map,i,j)) { printf("gotcha!(%d,%d)\n",i,j); } } } } intmain(intargc,constchar*argv[]){

 //insertcodehere... //std::cout<<"Hello,World!\n"; srand(unsigned(time(0))); for(inti=0;i<LEN;++i) { for(intj=0;j<LEN;++j) { map[i][j]=rand()%5; } } cout<<"xiaoxiaole!\n"; findMinSwap(map); pmap(map); return0; }

另外如果你想更好的提升你的编程能力,学好C语言C++编程!弯道超车,快人一步!笔者这里或许可以帮到你~

UP在主页上传了一些学习C/C++编程的视频教程,有兴趣或者正在学习的小伙伴一定要去看一看哦!会对你有帮助的~

分享(源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

编程学习:

编程学习:

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的C语言消消乐游戏的代码示例: ``` #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROW 8 // 定义行数 #define COL 8 // 定义列数 // 颜色定义 #define COLOR_RED "\033[1;31m" #define COLOR_GREEN "\033[1;32m" #define COLOR_YELLOW "\033[1;33m" #define COLOR_BLUE "\033[1;34m" #define COLOR_PURPLE "\033[1;35m" #define COLOR_CYAN "\033[1;36m" #define COLOR_RESET "\033[0m" // 游戏地图 int map[ROW][COL]; // 随机生成地图 void generateMap() { int i, j; srand(time(NULL)); for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { map[i][j] = rand() % 5 + 1; } } } // 打印地图 void printMap() { int i, j; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { switch (map[i][j]) { case 1: printf(COLOR_RED "● " COLOR_RESET); break; case 2: printf(COLOR_GREEN "● " COLOR_RESET); break; case 3: printf(COLOR_YELLOW "● " COLOR_RESET); break; case 4: printf(COLOR_BLUE "● " COLOR_RESET); break; case 5: printf(COLOR_PURPLE "● " COLOR_RESET); break; default: printf(" "); break; } } printf("\n"); } } // 消除相同颜色的方块 int eliminate(int x, int y, int color) { if (x < 0 || x >= ROW || y < 0 || y >= COL || map[x][y] != color) { return 0; } map[x][y] = 0; return 1 + eliminate(x - 1, y, color) + eliminate(x + 1, y, color) + eliminate(x, y - 1, color) + eliminate(x, y + 1, color); } // 下落方块 void drop() { int i, j, k; for (j = 0; j < COL; j++) { k = ROW - 1; for (i = ROW - 1; i >= 0; i--) { if (map[i][j] != 0) { map[k--][j] = map[i][j]; } } for (; k >= 0; k--) { map[k][j] = 0; } } } // 判断是否游戏结束 int isGameOver() { int i, j; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { if (map[i][j] != 0 && eliminate(i, j, map[i][j]) >= 3) { return 0; } } } return 1; } int main() { int x, y; generateMap(); while (1) { system("clear"); // 清屏 printMap(); // 打印地图 if (isGameOver()) { printf("Game Over!\n"); break; } printf("Please enter the location you want to eliminate (row, col): "); scanf("%d %d", &x, &y); if (eliminate(x, y, map[x][y]) < 3) { // 如果无法消除 printf("Cannot eliminate the block!\n"); } else { // 如果可以消除 drop(); // 下落方块 } } return 0; } ``` 这个代码示例中,使用了递归函数来消除相同颜色的方块,通过下落方块来填补空缺。在主函数中,使用了循环来不断接收玩家输入,直到游戏结束。同时,也使用了 ANSI 转义序列来实现彩色输出。 希望这个代码示例能够帮助您理解消消乐游戏实现方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值