请选择 进入手机版 | 继续访问电脑版

[C 语言] C语言构建连连看游戏(矩阵方式)

[复制链接]
查看52 | 回复15 | 2021-9-12 13:53:40 | 显示全部楼层 |阅读模式

C语言构建连连看游戏的详细 代码,供大家参考,详细 内容如下

计划 要求

用数字+英笔墨 母,采用文本输出的方式。每次输出一个8*10的矩形,然后等待玩家输入两个数字或字母的坐标,假如 满足 消除规则就输出新的矩形。
注意 :思量 类似 迷宫的处理方式,在8 * 10矩形之外加一层空心围墙,可以用来毗连 。大家体验一下连连看游戏就可以发现这个规则。判定 是否能连,用的是10 *12的数组,最外层添加的是空格,可用来辅助毗连 。

分析

大纲(简化):

  1. /**********************************/
  2.  //1生成游戏桌面*
  3.   //1.1选项
  4.  //2生成游戏局*
  5.  //3游戏操作
  6.   //3.1选择方块
  7.   //3.2判断是否有路径*
  8.   //3.3修改矩阵图层和迷宫图层
  9.   //3.4刷新页面
  10.  //4游戏胜利条件
  11.   //4.1时间限制
  12.   //4.2游戏结束
  13.   //4.3结算游戏*
  14. /********************************/
复制代码

本计划 采用了双图层的思绪 ,分别计划 表现 图层与连连看内部游戏图层。
表现 图层方便用户操作,
内部游戏图层方便举行 连连看消除处理。

计划

天生 游戏桌面

  1. #include<Windows.h> //生成游戏界面
  2. #include<stdio.h>
  3. #define GameWindoHight 16
  4. #define GameWindoWidth 75
  5. void GameInit() //生成游戏主界面
  6. {
  7. //界定游戏桌面大小
  8. char chCmd[32];
  9. sprintf(chCmd,"mode con cols=%d lines=%d",GameWindoWidth,GameWindoHight);
  10. system(chCmd);
  11. //游戏引导
  12. printf("\t\t\t欢迎进入矩阵连连看游戏"); printf("\n\n");
  13. printf("\t\t\t---- 游戏开始----\t\t"); printf("\n\n");
  14. printf("\t\t\t 请选择游戏模式 \t\t"); printf("\n\n");
  15. printf("\t\t\t----1基本模式----\t\t"); printf("\n"); //正向计时
  16. printf("\t\t\t----2休闲模式----\t\t"); printf("\n"); //不计时
  17. printf("\t\t\t----3关卡模式----\t\t"); printf("\n\n"); //倒计时
  18. printf("\t\t\t----4退出游戏----\t\t"); printf("\n"); //退出程序
  19. }
复制代码

天生 游戏局

内部(迷宫)图层:

  1. #define MaxSize 100
  2. int mg[10][12]= { //迷宫图层
  3. {0,0,0,0,0,0,0,0,0,0,0,0},
  4. {0,1,1,1,1,1,1,1,1,1,1,0},
  5. {0,1,1,1,1,1,1,1,1,1,1,0},
  6. {0,1,1,1,1,1,1,1,1,1,1,0},
  7. {0,1,1,1,1,1,1,1,1,1,1,0},
  8. {0,1,1,1,1,1,1,1,1,1,1,0},
  9. {0,1,1,1,1,1,1,1,1,1,1,0},
  10. {0,1,1,1,1,1,1,1,1,1,1,0},
  11. {0,1,1,1,1,1,1,1,1,1,1,0},
  12. {0,0,0,0,0,0,0,0,0,0,0,0}
  13. };
  14. struct MMP
  15. {
  16. int i,j; //位置
  17. int di; //下一步可走
  18. } St[MaxSize];
  19. bool mgpath(int xi, int yi, int xe, int ye) //判断是否有路径
  20. { int i,j, i1,j1,di;
  21. int mg1[10][12];
  22. memcpy(mg1,mg,sizeof(mg));
  23. bool find;
  24. int top=-1;
  25. top++;
  26. St[top].i=xi;
  27. St[top].j=yi;
  28. St[top].di=-1;
  29. mg1[xi][yi]=-1;
  30. mg1[xe][ye]=0;
  31. while (top>-1)
  32. { i= St[top].i;j= St[top].j;
  33. di=St[top].di;
  34. if (i==xe&& j== ye)
  35. {
  36. return true;
  37. }
  38. find= false;
  39. while (di<4 && !find)
  40. {
  41. di++;
  42. switch(di)
  43. {
  44. case 0:i1=i-1; j1=j;break;
  45. case 1:i1=i;j1=j+1; break;
  46. case 2:i1=i+1; j1=j;break;
  47. case 3:i1=i;j1=j-1; break;
  48. }
  49. if(i1<12&&j1<10)
  50. {
  51. if (mg1[i1][j1]==0) find=true;
  52. }
  53. }
  54. if (find)
  55. { St[top].di=di;
  56. top++;St[top].i=i1;St[top].j=j1;
  57. St[top].di= - 1;
  58. mg1[i1][j1]= -1;
  59. }
  60. else
  61. {
  62. mg1[i][j]=0;
  63. top-- ;
  64. }
  65. }
  66. return false;
  67. }
复制代码

用户(棋局)图层:

棋子天生 阶段:

  1. typedef struct pieces
  2. {
  3. int data_num;
  4. int data_letter;
  5. } Piece; //棋子
  6. typedef struct rand_factor
  7. {
  8. int data;
  9. int data_times;
  10. } factor; //随机因子属性——用于随机棋子
  11. void Rand_Num(int a[],int Num_Range,int T) //生成棋子属性——作为棋子生成阶段的一部分
  12. {
  13. srand((unsigned)time(NULL));//生成随机数种子
  14. int n=0;
  15. int i=0;
  16. factor b[Num_Range];
  17. for(int ii=0;ii<Num_Range;ii++)
  18. {
  19. // b[ii].data=ii;
  20. b[ii].data_times=0;
  21. }
  22. while(n<Num_Range*T){
  23. int m=rand()%Num_Range;
  24. if(b[m].data_times<T){
  25. a[i]=m;
  26. b[m].data_times++;
  27. m=rand()%Num_Range;
  28. i++;
  29. n++;
  30. }
  31. else
  32. continue;
  33. }
  34. }
  35. void ChesspiecesInit(Piece* pieces) //棋子生成
  36. {
  37. int data_num[80];
  38. Rand_Num(data_num,10,8);
  39. int Num_Range=10;
  40. for(int num=0;num<Num_Range*8;num++)
  41. {
  42. pieces[num].data_num=data_num[num]; //数值
  43. }
  44. for(int i=0;i<Num_Range;i++)
  45. {
  46. int letter[8];
  47. Rand_Num(letter,8,1);
  48. int k=0;
  49. int j=0;
  50. while(k<8)
  51. {
  52. if(pieces[j].data_num==i)
  53. {
  54. pieces[j].data_letter=letter[k]; //颜色
  55. k++;
  56. }
  57. j++;
  58. }
  59. }
  60. }
复制代码

棋盘天生 阶段

  1. void CameBordInit(Piece* pieces)
  2. {
  3. for(int i=0;i<10;i++)
  4. printf("------%d",i+1);
  5. printf("\n");
  6. for(int i=0;i<8;i++)
  7. {
  8. printf("[%d]",i+1);
  9. for(int j=0;j<10;j++)
  10. {
  11. if(pieces[j+i*10].data_num!=10&&pieces[j+i*10].data_letter!=10)
  12. printf(" <%d,%c> ",pieces[j+i*10].data_num,35+pieces[j+i*10].data_letter%4);
  13. else
  14. printf(" <*v*> "); //本来想打空格的,可是这个表情太可爱了!(可以选择全空格输出,界面会清晰一点
  15. }
  16. printf("\n");
  17. }
  18. }
复制代码

游戏操作

选择——简单粗暴

  1. scanf("%d,%d",&x1,&y1);
  2. scanf("%d,%d",&x2,&y2);
复制代码

判定 路径等活动 发生在迷宫图层:

  1. bool mgpath(int xi, int yi, int xe, int ye)
  2. { int i,j, i1,j1,di;
  3. int mg1[10][12];
  4. memcpy(mg1,mg,sizeof(mg));
  5. bool find;
  6. int top=-1;
  7. top++;
  8. St[top].i=xi;
  9. St[top].j=yi;
  10. St[top].di=-1;
  11. mg1[xi][yi]=-1;
  12. mg1[xe][ye]=0;
  13. while (top>-1)
  14. { i= St[top].i;j= St[top].j;
  15. di=St[top].di;
  16. if (i==xe&& j== ye)
  17. {
  18. return true;
  19. }
  20. find= false;
  21. while (di<4 && !find)
  22. {
  23. di++;
  24. switch(di)
  25. {
  26. case 0:i1=i-1; j1=j;break;
  27. case 1:i1=i;j1=j+1; break;
  28. case 2:i1=i+1; j1=j;break;
  29. case 3:i1=i;j1=j-1; break;
  30. }
  31. if(i1<12&&j1<10)
  32. {
  33. if (mg1[i1][j1]==0) find=true;
  34. }
  35. }
  36. if (find)
  37. { St[top].di=di;
  38. top++;St[top].i=i1;St[top].j=j1;
  39. St[top].di= - 1;
  40. mg1[i1][j1]= -1;
  41. }
  42. else
  43. {
  44. mg1[i][j]=0;
  45. top-- ;
  46. }
  47. }
  48. return false;
  49. }
复制代码

修改表现 图层:

  1. void GamePlay(int x1,int y1,int x2,int y2,Piece* pieces)
  2. {
  3. if(pieces[y1*10+x1].data_num==pieces[y2*10+x2].data_num)
  4. if(abs(pieces[y1*10+x1].data_letter-pieces[y2*10+x2].data_letter)==4)
  5. {
  6. if(mgpath(x1+1, y1+1, x2+1, y2+1))
  7. {
  8. pieces[y1*10+x1].data_letter=pieces[y1*10+x1].data_num=pieces[y2*10+x2].data_letter=pieces[y2*10+x2].data_num=10;
  9. mg[x1+1][y1+1]=mg[x2+1][y2+1]=0;
  10. }
  11. }
  12. }
  13. //配合上棋盘生成函数中的
  14. else
  15. printf(" <*v*> ");
复制代码

革新 界面用:

  1. system("cls"); //简单粗暴
复制代码

游戏胜利(竣事 )

判定 竣事 :(暂不表明 ,看代码明白 )

1.时间限定
2.自主退出

时间限定 使用 体系 计时
自动 退出引导用户输入特定符号

游戏结算:输出分数

  1. void Game_Score()
  2. {
  3. int score=80;
  4. for(int i=0;i<10;i++)
  5. for(int j=0;j<12;j++)
  6. score=score-mg[i][j];
  7. printf("\t\t\t您现在的得分是:%d \n",score);
  8. }
复制代码

完备 程序

  1. /*******************************************************************/
  2. //1天生 游戏桌面
  3. //1.1选项
  4. //2天生 游戏局
  5. //3游戏操作
  6. //3.1选择方块
  7. //3.2判定 是否有路径
  8. //3.3判定 是否消除
  9. //3.4消除并革新 页面
  10. //4游戏胜利条件
  11. //4.1时间限定
  12. //4.2游戏竣事
  13. //4.3判定 是否胜利
  14. /*******************************************************************/
  15. #include<Windows.h> //天生 游戏界面
  16. #include<stdio.h>
  17. #define GameWindoHight 16
  18. #define GameWindoWidth 75
  19. #include<stdio.h> //天生 棋局图层
  20. #include<time.h>
  21. #include<stdlib.h>
  22. #include"sqstack.cpp"
  23. #include<time.h>
  24. #define MaxSize 100
  25. typedef struct rand_factor
  26. {
  27. int data;
  28. int data_times;
  29. } factor; //随机到你了吗?
  30. typedef struct pieces
  31. {
  32. int data_num;
  33. int data_letter;
  34. } Piece;
  35. int mg[10][12]= { //路径图层
  36. {0,0,0,0,0,0,0,0,0,0,0,0},
  37. {0,1,1,1,1,1,1,1,1,1,1,0},
  38. {0,1,1,1,1,1,1,1,1,1,1,0},
  39. {0,1,1,1,1,1,1,1,1,1,1,0},
  40. {0,1,1,1,1,1,1,1,1,1,1,0},
  41. {0,1,1,1,1,1,1,1,1,1,1,0},
  42. {0,1,1,1,1,1,1,1,1,1,1,0},
  43. {0,1,1,1,1,1,1,1,1,1,1,0},
  44. {0,1,1,1,1,1,1,1,1,1,1,0},
  45. {0,0,0,0,0,0,0,0,0,0,0,0}
  46. };
  47. struct MMP
  48. {
  49. int i,j;
  50. int di;
  51. } St[MaxSize];
  52. double DDL=600;
  53. //1天生 游戏桌面
  54. void GameInit()
  55. {
  56. //界定游戏桌面大小
  57. char chCmd[32];
  58. sprintf(chCmd,"mode con cols=%d lines=%d",GameWindoWidth,GameWindoHight);
  59. system(chCmd);
  60. // printf("-----------------李云龙应约召唤而来!---------------");printf("\n");
  61. // printf("-------------你他娘的就是老子的Master吗?-----------");printf("\n\n");
  62. //游戏引导
  63. printf("\t\t 欢迎进入矩阵连连看游戏"); printf("\n\n");
  64. printf("\t\t\t---- 游戏开始----\t\t"); printf("\n\n");
  65. printf("\t\t\t 请选择游戏模式 \t\t"); printf("\n\n");
  66. printf("\t\t\t----1基本模式----\t\t"); printf("\n"); //正向计时
  67. printf("\t\t\t----2休闲模式----\t\t"); printf("\n"); //不计时
  68. printf("\t\t\t----3关卡模式----\t\t"); printf("\n"); //倒计时
  69. // printf("\t\t----4米斯达骂骂咧咧地退出房间了……"); printf("\n"); //退出程序
  70. printf("\t\t\t----4退出游戏----\t\t"); printf("\n"); //退出程序
  71. }
  72. //天生 棋局
  73. void Rand_Num(int a[],int Num_Range,int T)
  74. {
  75. srand((unsigned)time(NULL));//天生 随机数的种子
  76. int n=0;
  77. int i=0;
  78. factor b[Num_Range];
  79. for(int ii=0;ii<Num_Range;ii++)
  80. {
  81. // b[ii].data=ii;
  82. b[ii].data_times=0;
  83. }
  84. while(n<Num_Range*T){
  85. int m=rand()%Num_Range;
  86. if(b[m].data_times<T){
  87. a[i]=m;
  88. b[m].data_times++;
  89. m=rand()%Num_Range;
  90. i++;
  91. n++;
  92. }
  93. else
  94. continue;
  95. }
  96. }
  97. void ChesspiecesInit(Piece* pieces)
  98. {
  99. int data_num[80];
  100. Rand_Num(data_num,10,8);
  101. int Num_Range=10;
  102. for(int num=0;num<Num_Range*8;num++)
  103. {
  104. pieces[num].data_num=data_num[num]; //数值
  105. }
  106. for(int i=0;i<Num_Range;i++)
  107. {
  108. int letter[8];
  109. Rand_Num(letter,8,1);
  110. int k=0;
  111. int j=0;
  112. while(k<8)
  113. {
  114. if(pieces[j].data_num==i)
  115. {
  116. pieces[j].data_letter=letter[k]; //颜色
  117. k++;
  118. }
  119. j++;
  120. }
  121. }
  122. }
  123. void CameBordInit(Piece* pieces)
  124. {
  125. for(int i=0;i<10;i++)
  126. printf("------%d",i+1);
  127. printf("\n");
  128. for(int i=0;i<8;i++)
  129. {
  130. printf("[%d]",i+1);
  131. for(int j=0;j<10;j++)
  132. {
  133. if(pieces[j+i*10].data_num!=10&&pieces[j+i*10].data_letter!=10)
  134. printf(" <%d,%c> ",pieces[j+i*10].data_num,35+pieces[j+i*10].data_letter%4);
  135. else
  136. printf(" <*v*> ");
  137. }
  138. printf("\n");
  139. }
  140. }
  141. bool mgpath(int xi, int yi, int xe, int ye)
  142. { int i,j, i1,j1,di;
  143. int mg1[10][12];
  144. memcpy(mg1,mg,sizeof(mg));
  145. bool find;
  146. int top=-1;
  147. top++;
  148. St[top].i=xi;
  149. St[top].j=yi;
  150. St[top].di=-1;
  151. mg1[xi][yi]=-1;
  152. mg1[xe][ye]=0;
  153. while (top>-1)
  154. { i= St[top].i;j= St[top].j;
  155. di=St[top].di;
  156. if (i==xe&& j== ye)
  157. {
  158. return true;
  159. }
  160. find= false;
  161. while (di<4 && !find)
  162. {
  163. di++;
  164. switch(di)
  165. {
  166. case 0:i1=i-1; j1=j;break;
  167. case 1:i1=i;j1=j+1; break;
  168. case 2:i1=i+1; j1=j;break;
  169. case 3:i1=i;j1=j-1; break;
  170. }
  171. if(i1<12&&j1<10)
  172. {
  173. if (mg1[i1][j1]==0) find=true;
  174. }
  175. }
  176. if (find)
  177. { St[top].di=di;
  178. top++;St[top].i=i1;St[top].j=j1;
  179. St[top].di= - 1;
  180. mg1[i1][j1]= -1;
  181. }
  182. else
  183. {
  184. mg1[i][j]=0;
  185. top-- ;
  186. }
  187. }
  188. return false;
  189. }
  190. void GamePlay(int x1,int y1,int x2,int y2,Piece* pieces)
  191. {
  192. if(pieces[y1*10+x1].data_num==pieces[y2*10+x2].data_num)
  193. if(abs(pieces[y1*10+x1].data_letter-pieces[y2*10+x2].data_letter)==4)
  194. {
  195. if(mgpath(x1+1, y1+1, x2+1, y2+1))
  196. {
  197. pieces[y1*10+x1].data_letter=pieces[y1*10+x1].data_num=pieces[y2*10+x2].data_letter=pieces[y2*10+x2].data_num=10;
  198. mg[x1+1][y1+1]=mg[x2+1][y2+1]=0;
  199. }
  200. }
  201. }
  202. void Game_Score()
  203. {
  204. int score=80;
  205. for(int i=0;i<10;i++)
  206. for(int j=0;j<12;j++)
  207. score=score-mg[i][j];
  208. printf("\t\t\t您现在的得分是:%d \n",score);
  209. }
  210. int main()
  211. {
  212. //天生 游戏桌面
  213. GameInit();
  214. //选择游戏模式
  215. int Gmode;
  216. int x1,y1,x2,y2;
  217. double time,end;
  218. scanf("%d",&Gmode);
  219. //革新 界面->进入游戏
  220. clock_t start;
  221. start=clock();
  222. Piece pieces[80];
  223. ChesspiecesInit(pieces);
  224. while(1)
  225. {
  226. end = clock();
  227. system("cls");
  228. /***************************************************/
  229. switch(Gmode) //其他模式配件
  230. {
  231. case 1:
  232. printf("当前游戏时间:%f s\n\n",(double)(end-start)/CLK_TCK);break;
  233. case 3:
  234. time=DDL-(double)(end-start)/CLK_TCK;
  235. printf("剩余游戏时间:%f\t\t\t(输入qqqq竣事 游戏\n\n",time);
  236. if(time<0)
  237. {
  238. printf("游戏竣事 !交作业的小伙伴给个三连吧,要不批评 区下次肯定 ?<*v*>\n");
  239. Game_Score();
  240. return 0;
  241. };break;
  242. case 4:
  243. printf("?!?!?!?\n");
  244. printf(" 我自闭了!");
  245. return 0;
  246. }
  247. /****************娱乐模式主体***********************/
  248. Game_Score();
  249. CameBordInit(pieces);
  250. scanf("%d,%d",&x1,&y1);
  251. scanf("%d,%d",&x2,&y2);
  252. if(x1=='q')
  253. {
  254. Game_Score();
  255. return 0;
  256. }
  257. x1=x1-1;y1=y1-1;
  258. x2=x2-1;y2=y2-1;
  259. GamePlay(x1,y1,x2,y2,pieces);
  260. }
  261. return 0;
  262. }
复制代码

以上就是本文的全部内容,盼望 对大家的学习有所帮助,也盼望 大家多多支持脚本之家。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 东阿制造 | 2021-9-17 18:11:36 | 显示全部楼层
楼上长在线啊?
回复

使用道具 举报

avatar 无将大车 | 2021-9-21 23:23:04 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,影视频道的网站所有电影和连续剧都可以免费看的。访问地址:http://tv.mxswl.com
回复

使用道具 举报

avatar 空581 | 2021-10-4 09:41:09 | 显示全部楼层
看帖不回帖都是耍流氓!
回复

使用道具 举报

avatar 烟织成愁撼 | 2021-10-4 13:05:25 | 显示全部楼层
投admin楼主一票,不用谢哦!
回复

使用道具 举报

avatar 忆困血馆闻 | 2021-10-6 21:40:20 | 显示全部楼层
感谢admin楼主的推荐!
回复

使用道具 举报

admin楼主很有激情啊!
回复

使用道具 举报

大神就是大神,这么经典!
回复

使用道具 举报

今天过得很不爽!
回复

使用道具 举报

我和我的小伙伴都惊呆了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则