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

[C 语言] C语言实现数字连连看

  [复制链接]
查看275 | 回复78 | 2021-9-12 14:27:50 | 显示全部楼层 |阅读模式

本文实例为大家分享了C语言实现数字连连看的详细 代码,供大家参考,详细 内容如下

要求

连连看小游戏开辟 ,使用 二维数组来保存游戏地图的数据,实现连连看的核心功能。欢乐连连看的功能有:主界面、开始游戏、消子、判断 胜负 、提示、重排、计时、游戏模式。

主界面

游戏主界面就是举行 各项操作的入口。

开始游戏

玩家选择开始游戏模式,进入游戏后,选择开始游戏,体系 根据设置随机天生 数字,以供玩家点击消除。

消子

对玩家选中的两张图片举行 判断 ,判断 是否符合消除规则。只有符合以下规则的图片对才能被消除:

  • 一条直线连通
  • 两条直线连通
  • 三条直线连通

假如 可以消除,两个数字变为0。假如 不能消除,则保持原来的游戏地图。

判断 胜负

当游戏完成后,必要 判断 游戏胜负 。不同模式下判断 胜负 的规则不同。

  • 基本模式时,假如 在五分钟内将游戏地图的全部 图片都消除,则提示玩家胜利。
  • 休闲模式时,假如 游戏地图中全部 图片都被消除,则提示玩家获胜。

提示

可以提示界面上可以或许 消除的一对图片。

计时

设定肯定 时间来辅助游戏是否竣事 。

游戏模式

游戏模式有:基本模式、休闲模式和关卡模式三种,可以根据是否定时等规则举行 设置。

代码

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #define WIDTH 10
  5. #define HEIGHT 12
  6. int datas[HEIGHT][WIDTH] = {0};
  7. int Choose_type ();
  8. void Creat_datas (int fol);
  9. bool IsHLinked(int x1,int y1,int x2,int y2);
  10. bool IsVLinked(int x1,int y1,int x2,int y2);
  11. bool IsZeroTurnLinked(int x1,int y1,int x2, int y2); //一条线
  12. bool IsOneTurnLinked(int x1, int y1, int x2,int y2); //二条线
  13. bool IsTwoTurnLinked(int x1,int y1,int x2,int y2); //三条线
  14. bool Judge_Answer (int x1,int y1,int x2,int y2); //判断是否可消去
  15. void Print_datas ();
  16. bool Play_Game (int Flo);
  17. bool Isblank ();
  18. bool Help_ans ();
  19. bool Basic_Play ();//基础
  20. bool Relax_Play ();//休闲
  21. bool Win_Play ();//闯关
  22. int main()
  23. {
  24. int Flo;
  25. Flo = Choose_type (); // choose the type
  26. if (Flo == 0) return 0;
  27. srand(unsigned(time(NULL)));
  28. Creat_datas(Flo); //creat the graph
  29. Print_datas ();
  30. bool ov;
  31. ov = Play_Game (Flo);
  32. if (ov == true){
  33. printf ("VICTORY");
  34. }
  35. else{
  36. printf ("FAILED");
  37. }
  38. return 0;
  39. }
  40. bool Basic_Play ()
  41. {
  42. long int t1 ,t2 = 0 ;
  43. int op = 1;
  44. int x1,y1,x2,y2;
  45. bool ANS;
  46. printf ("五分钟计时开始\n");
  47. t1 = clock();
  48. while (t2 < 300000 && !Isblank() && op != 0 )
  49. {
  50. if (op == 1)
  51. {
  52. Print_datas ();
  53. printf("请输入两者的坐标[x1 y1 x2 y2]:"); //从上到下,从左到右,先行后列
  54. scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
  55. if (Judge_Answer (x1, y1, x2,y2))
  56. {
  57. datas[x1][y1] = datas[x2][y2] = 0;
  58. Print_datas ();
  59. }
  60. else{
  61. printf("错误");
  62. }
  63. }
  64. if (op == 2)
  65. {
  66. ANS = Help_ans ();
  67. Print_datas ();
  68. if (ANS == false)
  69. {
  70. printf ("已没有可以消去的\n");
  71. return true;
  72. }
  73. }
  74. printf("是否继续游戏 1、YES 0、NO 2、HELP:");
  75. scanf ("%d",&op);
  76. t2 = clock() - t1;
  77. }
  78. if (t2 > 299)
  79. {
  80. printf ("超时\n");
  81. return false;
  82. }
  83. if (Isblank()) return true;
  84. else return false;
  85. }
  86. bool Help_ans ()
  87. {
  88. int k;
  89. for (int i = 1; i < 11;i++)
  90. {
  91. for (int j = 1; j < 9;j++)
  92. {
  93. if (datas[i][j] != 0)
  94. {
  95. k = j+1;
  96. for (int m = i; m < 11;m++)
  97. {
  98. for (int n = k; n < 9;n++)
  99. {
  100. if (datas[i][j] == datas[m][n])
  101. {
  102. if (Judge_Answer(i,j,m,n))
  103. {
  104. printf ("(%d,%d) (%d,%d)\n",i,j,m,n);
  105. datas[i][j] = datas[m][n] = 0;
  106. return true;
  107. }
  108. }
  109. }
  110. k = 1;
  111. }
  112. }
  113. }
  114. }
  115. return false;
  116. }
  117. bool Relax_Play ()
  118. {
  119. int op = 1;
  120. int x1,y1,x2,y2;
  121. bool ANS;
  122. while (!Isblank() && op != 0) //G isn't blank
  123. {
  124. if (op == 1)
  125. {
  126. Print_datas ();
  127. printf("请输入两者的坐标[x1 y1 x2 y2]:");
  128. scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
  129. if (Judge_Answer (x1, y1, x2,y2))
  130. {
  131. datas[x1][y1] = datas[x2][y2] = 0;
  132. Print_datas ();
  133. }
  134. else{
  135. printf("错误");
  136. }
  137. }
  138. if (op == 2)
  139. {
  140. ANS = Help_ans ();
  141. Print_datas ();
  142. if (ANS == false)
  143. {
  144. printf ("已没有可以消去的\n");
  145. return true;
  146. }
  147. }
  148. printf("是否继续游戏 1、YES 0、NO 2、HELP:");
  149. scanf ("%d",&op);
  150. }
  151. if (!Isblank()) return false;
  152. else return true;
  153. }
  154. bool Win_Play ()
  155. {
  156. int op = 1;
  157. int x1,y1,x2,y2;
  158. bool ANS;
  159. while (!Isblank() && op != 0) //G isn't blank
  160. {
  161. if (op == 1)
  162. {
  163. Print_datas ();
  164. printf("请输入两者的坐标[x1 y1 x2 y2]:");
  165. scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
  166. if (Judge_Answer (x1, y1, x2,y2))
  167. {
  168. datas[x1][y1] = datas[x2][y2] = 0;
  169. Print_datas ();
  170. }
  171. else{
  172. printf("错误");
  173. }
  174. }
  175. printf("是否继续游戏 1、YES 0、NO :");
  176. scanf ("%d",&op);
  177. }
  178. if (!Isblank() && Help_ans) return false;
  179. else
  180. return true ;
  181. }
  182. bool Isblank ()
  183. {
  184. for(int j=1; j < 10 ; j++)
  185. {
  186. for (int i= 1; i< 8 ; i++)
  187. {
  188. if (datas[j][i] != 0) return false;
  189. }
  190. }
  191. return true;
  192. }
  193. bool Play_Game (int Flo)
  194. {
  195. bool Ans;
  196. if (Flo == 1) //the basic type
  197. {
  198. printf ("基本模式:\n");
  199. Ans = Basic_Play ();
  200. return Ans;
  201. }
  202. if (Flo == 2) //the relax type
  203. {
  204. printf ("休闲模式:\n");
  205. Ans = Relax_Play ();
  206. return Ans;
  207. }
  208. else //the win type
  209. {
  210. printf ("第%d关游戏:\n",Flo - 2);
  211. Ans = Win_Play ();
  212. return Ans;
  213. }
  214. }
  215. void Print_datas ()
  216. {
  217. for(int j=1; j < 11 ; j++)
  218. {
  219. printf("\t\t");
  220. for (int i= 1; i< 9 ; i++)
  221. {
  222. printf("%d\t",datas[j][i]);
  223. }
  224. printf("\n");
  225. }
  226. }
  227. bool Judge_Answer (int x1,int y1,int x2,int y2)
  228. {
  229. if (datas [x1][y1] != datas[x2][y2] || datas [x1][y1] == 0 || datas [x2][y2] == 0 ) return false;
  230. if (x1 == x2 && y1 == y2) return false;
  231. if (x1 > 11 || x2 > 11 || y1> 9 || y2 > 9) return false;
  232. if (x1 == x2 || y1 == y2)
  233. {
  234. if (IsZeroTurnLinked(x1,y1,x2,y2) || IsTwoTurnLinked(x1,y1,x2,y2)) return true;
  235. }
  236. else{
  237. if (IsOneTurnLinked(x1,y1,x2,y2) || IsTwoTurnLinked(x1,y1,x2,y2)) return true;
  238. }
  239. return false;
  240. }
  241. int Choose_type ()
  242. {
  243. printf("请选择你要进行的操作:1,开始游戏 2,结束游戏\n");
  244. int op;
  245. scanf("%d",&op);
  246. if (op == 1)
  247. {
  248. printf("\n请选择游戏模式:1、基本模式 2、休闲模式 3、关卡模式\n");
  249. int ops;
  250. scanf ("%d",&ops);
  251. if (ops == 1) return 1;
  252. if (ops == 2) return 2;
  253. if (ops == 3)
  254. {
  255. printf("\n请选择你选择的关卡3-16:");
  256. int opsd;
  257. scanf ("%d",&opsd);
  258. return opsd;
  259. }
  260. }
  261. if (op == 2) return 0;
  262. }
  263. void Creat_datas (int fol)
  264. {
  265. int tmpDatas[80] = {0}; // 定义一个临时数组用于存放
  266. int PicNum[] = {3,4,5,1,2,7,9,6,8,44,78,12,90,33,34};
  267. int Count = 0,i, j, d = 0,Pic,tem,t;
  268. Pic = 8 * 10 / (fol + 9 );
  269. for(j=0; j < 80 ; j++)
  270. {
  271. tmpDatas[j] = PicNum[d];
  272. Count++;
  273. if (Count == Pic )
  274. {
  275. d++;
  276. Count = 0;
  277. }
  278. }
  279. d = 80;
  280. for(j=1;j < HEIGHT - 1;j++)
  281. for (i = 1;i < WIDTH - 1; i++)
  282. {
  283. t = rand() % d; //Fisher-Yates Shuffle
  284. tem = tmpDatas[t];
  285. tmpDatas[t] = tmpDatas[d -1];
  286. tmpDatas[d - 1] = tem;
  287. datas[j][i] = tmpDatas[d -1];
  288. d--;
  289. }
  290. }
  291. bool IsHLinked(int x1,int y1,int x2,int y2) //横向是否连接
  292. {
  293. int minY,maxY;
  294. if (x1 != x2) return false;
  295. if (y1 < y2){
  296. minY = y1;
  297. maxY = y2;
  298. }
  299. else{
  300. minY = y2;
  301. maxY = y1;
  302. }
  303. if (maxY - minY == 1) return true;
  304. for ( int i = minY +1; i < maxY ; i++) //从左到右检查中间的点是不是空的
  305. {
  306. if (datas[x1][i] != 0) return false;
  307. }
  308. return true;
  309. }
  310. bool IsVLinked(int x1,int y1,int x2,int y2) //纵向是否连接
  311. {
  312. int minX,maxX;
  313. if (y1 != y2) return false;
  314. if (x1 < x2){
  315. minX = x1;
  316. maxX = x2;
  317. }
  318. else{
  319. minX = x2;
  320. maxX = x1;
  321. }
  322. if (maxX - minX == 1) return true;
  323. for ( int i = minX +1; i < maxX ; i++)
  324. {
  325. if (datas[i][y1] != 0) return false;
  326. }
  327. return true;
  328. }
  329. bool IsZeroTurnLinked(int x1,int y1,int x2, int y2) //不转折时判断
  330. {
  331. if (IsHLinked(x1, y1, x2,y2))
  332. {
  333. return true ;
  334. }
  335. if (IsVLinked(x1, y1, x2, y2))
  336. {
  337. return true ;
  338. }
  339. return false;
  340. }
  341. bool IsOneTurnLinked(int x1, int y1, int x2,int y2) //转折一次
  342. {
  343. int tmpX[2] = { x1, x2 };
  344. int tmpY[2] = { y2, y1 };
  345. for (int i = 0; i < 2; i++)
  346. {
  347. if (datas[tmpX[i]][tmpY[i]] != 0) continue;
  348. if (IsZeroTurnLinked( tmpX[i], tmpY[i], x1, y1) && IsZeroTurnLinked( tmpX[i], tmpY[i], x2,y2))
  349. {
  350. return true;
  351. }
  352. }
  353. return false;
  354. }
  355. bool IsTwoTurnLinked(int x1,int y1,int x2,int y2)
  356. {
  357. int j, tmpX1,tmpY1,tmpX2,tmpY2;
  358. //纵向遍历所有点
  359. tmpX1 = x1;
  360. for ( j = 0; j < WIDTH; j++)
  361. {
  362. tmpY1 = j;
  363. if (j == y1) continue;
  364. if (tmpX1 == x2 && tmpY1 == y2) continue; //重合
  365. tmpX2 = x2;
  366. tmpY2 = tmpY1;
  367. if (datas[tmpX1][tmpY1] != 0 || datas[tmpX2][tmpY2] != 0) continue;
  368. if (IsZeroTurnLinked(tmpX1, tmpY1, tmpX2, tmpY2) && IsZeroTurnLinked(tmpX1, tmpY1, x1, y1) && IsZeroTurnLinked(tmpX2, tmpY2, x2, y2))
  369. return true;
  370. }
  371. //横向遍历所有点
  372. tmpY1 = y1;
  373. for ( j = 0; j < HEIGHT; j++)
  374. {
  375. tmpX1 = j;
  376. if (j == x1) continue;
  377. if (tmpY1 == y2 && tmpX1 == x2) continue; //重合
  378. tmpY2 = y2;
  379. tmpX2 = tmpX1;
  380. if (datas[tmpX1][tmpY1] != 0 || datas[tmpX2][tmpY2] != 0) continue;
  381. if (IsZeroTurnLinked(tmpX1, tmpY1, tmpX2, tmpY2) && IsZeroTurnLinked(tmpX1, tmpY1, x1, y1) && IsZeroTurnLinked(tmpX2, tmpY2, x2, y2))
  382. {
  383. return true;
  384. }
  385. }
  386. return false;
  387. }
复制代码

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


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

使用道具 举报

avatar Jean893 | 2021-9-14 18:38:01 | 显示全部楼层
收藏了,改天让朋友看看!
回复

使用道具 举报

avatar 123457150 | 2021-9-19 05:58:11 | 显示全部楼层
admin楼主的帖子提神醒脑啊!
回复

使用道具 举报

avatar 张玉萍Pilar | 2021-9-20 05:31:21 | 显示全部楼层
最近精神病院在打折,admin楼主去看看吧?
回复

使用道具 举报

avatar 小鱼680 | 2021-9-26 03:03:36 | 显示全部楼层
在这个版块混了这么久了,第一次看见这么给你的帖子!
回复

使用道具 举报

avatar 123457390 | 2021-9-26 23:35:16 | 显示全部楼层
admin楼主很有激情啊!
回复

使用道具 举报

avatar _阿乐哥哥 | 2021-9-27 09:11:11 | 显示全部楼层
admin楼主很有经验啊!
回复

使用道具 举报

avatar 小菊花之米 | 2021-10-1 21:26:43 | 显示全部楼层
好东西,学习学习!
回复

使用道具 举报

avatar Mionsterv | 2021-10-3 04:26:16 | 显示全部楼层
读了admin楼主的帖子,顿时马桶就通了。。。
回复

使用道具 举报

avatar 123456835 | 2021-10-4 09:41:34 | 显示全部楼层
这个帖子会火的,鉴定完毕!
回复

使用道具 举报

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

本版积分规则