C语言实现拼图小游戏

时间:2022-01-24 05:51:55

最近闲着无聊,写了一个拼图游戏,正好学习一下图片的处理。

效果图如下:

C语言实现拼图小游戏

程序中用到了图形库操作,把一张图片分割,用一个二维数组代表各个碎片,初始打乱数组就可以得到打乱的图片。

  1. void get_arr()
  2. {
  3. int book[10] = { 0 };
  4. srand((unsigned int)time(NULL)); //设置时间种子
  5. for(int i=0; i<3; i++) //随机arr数组,打乱图片顺序
  6. for (int j = 0; j < 3; j++)
  7. {
  8. if (i == 2 && j == 2)
  9. break;
  10. while (1)
  11. {
  12. int s = rand() % 8;
  13. if (book[s] == 0)
  14. {
  15. book[s] = 1;
  16. arr[i][j] = s;
  17. break;
  18. }
  19. }
  20. }
  21. arr[2][2] = 9;
  22. }

因为这里数字并不大,所以我就暴力写了一下。

总共有5张图片,为了简化难度,我加了一张纯数字的。

C语言实现拼图小游戏

部分截图:

C语言实现拼图小游戏

拼图成功后,会出现拼图成功的提示,因为素材限制,只能弄成下面的样。

C语言实现拼图小游戏

部分游戏截图:

C语言实现拼图小游戏

全部的代码和素材:C语言拼图游戏

下面是代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <graphics.h>
  4. #include <windows.h>
  5. #include <conio.h>
  6. #include<time.h>
  7. #include <iostream>
  8. #include <algorithm>
  9. #define N 600 //图片长和宽,为便于计算取600
  10. #define M N/3 //分为9块,每块有
  11. using namespace std;
  12. IMAGE t, over;
  13. int arr[5][5];
  14.  
  15. void get_arr()
  16. {
  17. int book[10] = { 0 };
  18. srand((unsigned int)time(NULL)); //设置时间种子
  19. for(int i=0; i<3; i++) //随机arr数组,打乱图片顺序
  20. for (int j = 0; j < 3; j++)
  21. {
  22. if (i == 2 && j == 2)
  23. break;
  24. while (1)
  25. {
  26. int s = rand() % 8;
  27. if (book[s] == 0)
  28. {
  29. book[s] = 1;
  30. arr[i][j] = s;
  31. break;
  32. }
  33. }
  34. }
  35. arr[2][2] = 9;
  36. }
  37. void choosephoto()
  38. {
  39. int choose;
  40. srand((unsigned int)time(NULL)); //设置时间种子
  41. choose = rand() % 5; //选择图片
  42. if(choose==0)
  43. loadimage(&t, "少司命.jpeg", N, N); //加载图片
  44. if (choose == 1)
  45. loadimage(&t, "柯南.jpg", N, N);
  46. if (choose == 2)
  47. loadimage(&t, "马里奥.jpeg", N, N);
  48. if (choose == 3)
  49. loadimage(&t, "火影.jpeg", N, N);
  50. if (choose == 4)
  51. loadimage(&t, "数字.png", N, N);
  52. }
  53. void Game() //显示拼图
  54. {
  55. initgraph(N, N);
  56.  
  57. for (int i = 0; i < 3; i++)
  58. {
  59. for (int j = 0; j < 3; j++)
  60. {
  61. putimage(j * M, i * M, M, M, &t, arr[i][j]%3*M, arr[i][j]/3*M); //切割图片
  62. }
  63. }
  64. }
  65. int GameOver()
  66. {
  67. int temp = 1;
  68. for (int i = 0; i < 3; i++)
  69. {
  70. for (int j = 0; j < 3; j++)
  71. {
  72. if (arr[i][j] != 3 * i + j)
  73. {
  74. temp = 0;
  75. break;
  76. }
  77. }
  78. if (temp == 0)
  79. break;
  80. }
  81. if (temp == 1)
  82. {
  83. loadimage(&over, "游戏结束.png", 400, 400);
  84. putimage(100, 100, &over);
  85. return 1;
  86. }
  87. }
  88. void Gamestart()
  89. {
  90. char ch;
  91. int tx, ty;
  92.  
  93. while (1)
  94. {
  95. if (_kbhit()) { //检测键盘输入
  96. for (int i = 0; i < 3; i++)
  97. {
  98. for (int j = 0; j < 3; j++)
  99. if (arr[i][j] == 9)
  100. {
  101. tx = i;
  102. ty = j;
  103. break;
  104. }
  105. }
  106. ch = _getch();
  107. if (ch == 72 || ch=='w') //按键为w或者上
  108. {
  109. if (tx >= 1)
  110. {
  111. //swap(arr[tx][ty], arr[tx - 1][ty]);
  112. int x = arr[tx][ty];
  113. arr[tx][ty] = arr[tx - 1][ty];
  114. arr[tx - 1][ty] = x;
  115. }
  116. }
  117. else if (ch == 75 || ch=='a') //按键为a或者左
  118. {
  119. if (ty >= 1)
  120. {
  121. int x = arr[tx][ty];
  122. arr[tx][ty] = arr[tx][ty - 1];
  123. arr[tx][ty - 1] = x;
  124. }
  125. }
  126. else if (ch == 80 || ch=='s') //按键为s或者下
  127. {
  128. if (tx < 2)
  129. {
  130. int x = arr[tx][ty];
  131. arr[tx][ty] = arr[tx + 1][ty];
  132. arr[tx + 1][ty] = x;
  133. }
  134. }
  135. else if (ch == 77 || ch=='d') //按键为d或者右
  136. {
  137. if (ty < 2)
  138. {
  139. int x = arr[tx][ty];
  140. arr[tx][ty] = arr[tx][ty + 1];
  141. arr[tx][ty + 1] = x;
  142. }
  143. }
  144.  
  145. Game(); //输出拼图界面
  146. if (GameOver())
  147. break;
  148. }
  149. }
  150. while (ch=getchar())
  151. if (ch == '\n')
  152. break;
  153.  
  154. }
  155.  
  156. int main()
  157. {
  158. get_arr(); //获取初始数组
  159. choosephoto(); //选择图片
  160. Game(); //输出起始拼图
  161. Gamestart(); //游戏开始
  162. system("pause");
  163. closegraph(); //关闭画布
  164. return 0;
  165. }

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

原文链接:https://blog.csdn.net/qq_41505957/article/details/97647776