Advertisement
podsolnyxxx

без цвета (белые границы) 1

Apr 7th, 2024 (edited)
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.95 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <ctime>
  4. #include <cstdlib>
  5. #include <sstream>
  6. #include "glut.h"
  7. const int SIZE = 4;
  8. const int TILE_SIZE = 100;
  9. int board[SIZE][SIZE] = { 0 };
  10.  
  11.  
  12.  
  13. // Функция для отрисовки одной плитки (фишки) на доске
  14. void drawTile(int x, int y, int value) {
  15. glPushMatrix();
  16. glTranslatef(x, y, 0);
  17. glColor3f(1, 1, 1);
  18. glBegin(GL_QUADS);
  19. glVertex2i(0, 0);
  20. glVertex2i(TILE_SIZE, 0);
  21. glVertex2i(TILE_SIZE, TILE_SIZE);
  22. glVertex2i(0, TILE_SIZE);
  23. glEnd();
  24.  
  25. if (value != 0) {
  26. glColor3f(0.0, 0.0, 0.0);
  27. std::string text = std::to_string(value);
  28. glRasterPos2i(TILE_SIZE / 2 - 8 * text.length(), TILE_SIZE / 2 + 8);
  29. for (char c : text) {
  30. glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, c);
  31. }
  32. }
  33. glPopMatrix();
  34. }
  35.  
  36. // Функция инициализации OpenGL
  37. void init() {
  38. glClearColor(0.9, 0.9, 0.9, 1.0);
  39. glMatrixMode(GL_PROJECTION);
  40. glLoadIdentity();
  41. gluOrtho2D(0, SIZE * TILE_SIZE, 0, SIZE * TILE_SIZE);
  42.  
  43. // Установка толщины линий
  44. glLineWidth(2.0);
  45.  
  46. // Установка режима отображения полигонов
  47. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  48. }
  49.  
  50.  
  51. // Генерация новой двойки на случайной пустой клетке
  52. void generateTile() {
  53. std::vector<std::pair<int, int>> emptyCells;
  54. for (int i = 0; i < SIZE; ++i) {
  55. for (int j = 0; j < SIZE; ++j) {
  56. if (board[i][j] == 0) {
  57. emptyCells.push_back(std::make_pair(i, j));
  58. }
  59. }
  60. }
  61. if (emptyCells.empty()) {
  62. return; // Нет пустых клеток
  63. }
  64. int position = rand() % emptyCells.size(); // Случайная позиция для новой двойки
  65. int x = emptyCells[position].first;
  66. int y = emptyCells[position].second;
  67. board[x][y] = 2; // Генерируем новую двойку
  68. }
  69.  
  70. // Проверка на победу (наличие двойки с числом 2048 на доске)
  71. bool checkWin() {
  72. for (int i = 0; i < SIZE; ++i) {
  73. for (int j = 0; j < SIZE; ++j) {
  74. if (board[i][j] == 2048) {
  75. return true;
  76. }
  77. }
  78. }
  79. return false;
  80. }
  81.  
  82. // Проверка на поражение (отсутствие пустых клеток и возможности сдвинуть фишки)
  83. bool checkLose() {
  84. for (int i = 0; i < SIZE; ++i) {
  85. for (int j = 0; j < SIZE; ++j) {
  86. if (board[i][j] == 0) {
  87. return false; // Есть пустая клетка
  88. }
  89. // Проверяем возможность сдвинуть фишку влево
  90. if (j > 0 && (board[i][j] == board[i][j - 1] || board[i][j - 1] == 0)) {
  91. return false;
  92. }
  93. // Проверяем возможность сдвинуть фишку вправо
  94. if (j < SIZE - 1 && (board[i][j] == board[i][j + 1] || board[i][j + 1] == 0)) {
  95. return false;
  96. }
  97. // Проверяем возможность сдвинуть фишку вверх
  98. if (i > 0 && (board[i][j] == board[i - 1][j] || board[i - 1][j] == 0)) {
  99. return false;
  100. }
  101. // Проверяем возможность сдвинуть фишку вниз
  102. if (i < SIZE - 1 && (board[i][j] == board[i + 1][j] || board[i + 1][j] == 0)) {
  103. return false;
  104. }
  105. }
  106. }
  107. return true; // Нет пустых клеток и возможности сдвинуть фишки
  108. }
  109.  
  110. // Сдвиг фишек влево
  111. void moveLeft() {
  112. for (int i = 0; i < SIZE; ++i) {
  113. for (int j = 0; j < SIZE - 1; ++j) {
  114. if (board[i][j] == 0) {
  115. for (int k = j + 1; k < SIZE; ++k) {
  116. if (board[i][k] != 0) {
  117. board[i][j] = board[i][k];
  118. board[i][k] = 0;
  119. break;
  120. }
  121. }
  122. }
  123. }
  124. }
  125. }
  126.  
  127. // Сложение фишек влево
  128. void mergeLeft() {
  129. for (int i = 0; i < SIZE; ++i) {
  130. for (int j = 0; j < SIZE - 1; ++j) {
  131. if (board[i][j] == board[i][j + 1] && board[i][j] != 0) {
  132. board[i][j] *= 2;
  133. board[i][j + 1] = 0;
  134. }
  135. }
  136. }
  137. }
  138.  
  139. // Сдвиг фишек вправо
  140. void moveRight() {
  141. for (int i = 0; i < SIZE; ++i) {
  142. for (int j = SIZE - 1; j > 0; --j) {
  143. if (board[i][j] == 0) {
  144. for (int k = j - 1; k >= 0; --k) {
  145. if (board[i][k] != 0) {
  146. board[i][j] = board[i][k];
  147. board[i][k] = 0;
  148. break;
  149. }
  150. }
  151. }
  152. }
  153. }
  154. }
  155.  
  156. // Сложение фишек вправо
  157. void mergeRight() {
  158. for (int i = 0; i < SIZE; ++i) {
  159. for (int j = SIZE - 1; j > 0; --j) {
  160. if (board[i][j] == board[i][j - 1] && board[i][j] != 0) {
  161. board[i][j] *= 2;
  162. board[i][j - 1] = 0;
  163. }
  164. }
  165. }
  166. }
  167.  
  168. // Сдвиг фишек вверх
  169. void moveUp() {
  170. for (int j = 0; j < SIZE; ++j) {
  171. for (int i = 0; i < SIZE - 1; ++i) {
  172. if (board[i][j] == 0) {
  173. for (int k = i + 1; k < SIZE; ++k) {
  174. if (board[k][j] != 0) {
  175. board[i][j] = board[k][j];
  176. board[k][j] = 0;
  177. break;
  178. }
  179. }
  180. }
  181. }
  182. }
  183. }
  184.  
  185. // Сложение фишек вверх
  186. void mergeUp() {
  187. for (int j = 0; j < SIZE; ++j) {
  188. for (int i = 0; i < SIZE - 1; ++i) {
  189. if (board[i][j] == board[i + 1][j] && board[i][j] != 0) {
  190. board[i][j] *= 2;
  191. board[i + 1][j] = 0;
  192. }
  193. }
  194. }
  195. }
  196.  
  197. // Сдвиг фишек вниз
  198. void moveDown() {
  199. for (int j = 0; j < SIZE; ++j) {
  200. for (int i = SIZE - 1; i > 0; --i) {
  201. if (board[i][j] == 0) {
  202. for (int k = i - 1; k >= 0; --k) {
  203. if (board[k][j] != 0) {
  204. board[i][j] = board[k][j];
  205. board[k][j] = 0;
  206. break;
  207. }
  208. }
  209. }
  210. }
  211. }
  212. }
  213.  
  214. // Сложение фишек вниз
  215. void mergeDown() {
  216. for (int j = 0; j < SIZE; ++j) {
  217. for (int i = SIZE - 1; i > 0; --i) {
  218. if (board[i][j] == board[i - 1][j] && board[i][j] != 0) {
  219. board[i][j] *= 2;
  220. board[i - 1][j] = 0;
  221. }
  222. }
  223. }
  224. }
  225.  
  226.  
  227. // Функция для обработки нажатий клавиш
  228. void handleKeypress(unsigned char key, int x, int y) {
  229. if (key == 27) { // Escape key
  230. exit(0);
  231. }
  232. }
  233.  
  234. // Функция для обработки специальных клавиш
  235. void handleSpecialKeypress(int key, int x, int y) {
  236. switch (key) {
  237. case GLUT_KEY_LEFT:
  238. moveLeft();
  239. mergeLeft();
  240. moveLeft();
  241. break;
  242. case GLUT_KEY_RIGHT:
  243. moveRight();
  244. mergeRight();
  245. moveRight();
  246. break;
  247. case GLUT_KEY_UP:
  248. moveUp();
  249. mergeUp();
  250. moveUp();
  251. break;
  252. case GLUT_KEY_DOWN:
  253. moveDown();
  254. mergeDown();
  255. moveDown();
  256. break;
  257. }
  258. generateTile();
  259. glutPostRedisplay();
  260. if (checkWin()) {
  261. std::cout << "You win!" << std::endl;
  262. }
  263. if (checkLose()) {
  264. std::cout << "Game over!" << std::endl;
  265. }
  266. }
  267.  
  268. // Функция отрисовки доски
  269. void drawBoard() {
  270. for (int i = 0; i < SIZE; ++i) {
  271. for (int j = 0; j < SIZE; ++j) {
  272. int x = j * TILE_SIZE;
  273. int y = (SIZE - 1 - i) * TILE_SIZE;
  274. drawTile(x, y, board[i][j]);
  275. }
  276. }
  277. }
  278.  
  279. void timer(int value) {
  280.  
  281. glutTimerFunc(1000, timer, 0); // таймер с интервалом 1 секунда
  282. glutPostRedisplay();
  283. }
  284.  
  285. void display() {
  286. glClear(GL_COLOR_BUFFER_BIT);
  287. drawBoard();
  288. glutSwapBuffers();
  289. }
  290.  
  291. int main(int argc, char** argv) {
  292. srand(time(nullptr));
  293. glutInit(&argc, argv);
  294. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  295. glutInitWindowSize(SIZE * TILE_SIZE, SIZE * TILE_SIZE);
  296. glutCreateWindow("2048 Game");
  297. glutDisplayFunc(display);
  298. glutKeyboardFunc(handleKeypress);
  299. glutSpecialFunc(handleSpecialKeypress);
  300. init();
  301. generateTile();
  302. generateTile();
  303. glutTimerFunc(1000, timer, 0); // таймер с интервалом 1 секунда
  304. glutMainLoop();
  305. return 0;
  306. }
  307.  
  308.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement