Advertisement
podsolnyxxx

+ цвета. без границ 2

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