Advertisement
podsolnyxxx

+границы. без счета 3

Apr 7th, 2024 (edited)
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.74 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. // Рисуем контур плитки
  86. glColor3f(0.0f, 0.0f, 0.0f); // Черный цвет
  87. glBegin(GL_LINE_LOOP);
  88. glVertex2i(0, 0);
  89. glVertex2i(TILE_SIZE, 0);
  90. glVertex2i(TILE_SIZE, TILE_SIZE);
  91. glVertex2i(0, TILE_SIZE);
  92. glEnd();
  93.  
  94. glPopMatrix();
  95. }
  96. // Генерация новой двойки на случайной пустой клетке
  97. void generateTile() {
  98. std::vector<std::pair<int, int>> emptyCells;
  99. for (int i = 0; i < SIZE; ++i) {
  100. for (int j = 0; j < SIZE; ++j) {
  101. if (board[i][j] == 0) {
  102. emptyCells.push_back(std::make_pair(i, j));
  103. }
  104. }
  105. }
  106. if (emptyCells.empty()) {
  107. return; // Нет пустых клеток
  108. }
  109. int position = rand() % emptyCells.size(); // Случайная позиция для новой двойки
  110. int x = emptyCells[position].first;
  111. int y = emptyCells[position].second;
  112. board[x][y] = 2; // Генерируем новую двойку
  113. }
  114.  
  115. // Проверка на победу (наличие двойки с числом 2048 на доске)
  116. bool checkWin() {
  117. for (int i = 0; i < SIZE; ++i) {
  118. for (int j = 0; j < SIZE; ++j) {
  119. if (board[i][j] == 2048) {
  120. return true;
  121. }
  122. }
  123. }
  124. return false;
  125. }
  126.  
  127. // Проверка на поражение (отсутствие пустых клеток и возможности сдвинуть фишки)
  128. bool checkLose() {
  129. for (int i = 0; i < SIZE; ++i) {
  130. for (int j = 0; j < SIZE; ++j) {
  131. if (board[i][j] == 0) {
  132. return false; // Есть пустая клетка
  133. }
  134. // Проверяем возможность сдвинуть фишку влево
  135. if (j > 0 && (board[i][j] == board[i][j - 1] || board[i][j - 1] == 0)) {
  136. return false;
  137. }
  138. // Проверяем возможность сдвинуть фишку вправо
  139. if (j < SIZE - 1 && (board[i][j] == board[i][j + 1] || board[i][j + 1] == 0)) {
  140. return false;
  141. }
  142. // Проверяем возможность сдвинуть фишку вверх
  143. if (i > 0 && (board[i][j] == board[i - 1][j] || board[i - 1][j] == 0)) {
  144. return false;
  145. }
  146. // Проверяем возможность сдвинуть фишку вниз
  147. if (i < SIZE - 1 && (board[i][j] == board[i + 1][j] || board[i + 1][j] == 0)) {
  148. return false;
  149. }
  150. }
  151. }
  152. return true; // Нет пустых клеток и возможности сдвинуть фишки
  153. }
  154.  
  155. // Сдвиг фишек влево
  156. void moveLeft() {
  157. for (int i = 0; i < SIZE; ++i) {
  158. for (int j = 0; j < SIZE - 1; ++j) {
  159. if (board[i][j] == 0) {
  160. for (int k = j + 1; k < SIZE; ++k) {
  161. if (board[i][k] != 0) {
  162. board[i][j] = board[i][k];
  163. board[i][k] = 0;
  164. break;
  165. }
  166. }
  167. }
  168. }
  169. }
  170. }
  171.  
  172. // Сложение фишек влево
  173. void mergeLeft() {
  174. for (int i = 0; i < SIZE; ++i) {
  175. for (int j = 0; j < SIZE - 1; ++j) {
  176. if (board[i][j] == board[i][j + 1] && board[i][j] != 0) {
  177. board[i][j] *= 2;
  178. board[i][j + 1] = 0;
  179. }
  180. }
  181. }
  182. }
  183.  
  184. // Сдвиг фишек вправо
  185. void moveRight() {
  186. for (int i = 0; i < SIZE; ++i) {
  187. for (int j = SIZE - 1; j > 0; --j) {
  188. if (board[i][j] == 0) {
  189. for (int k = j - 1; k >= 0; --k) {
  190. if (board[i][k] != 0) {
  191. board[i][j] = board[i][k];
  192. board[i][k] = 0;
  193. break;
  194. }
  195. }
  196. }
  197. }
  198. }
  199. }
  200.  
  201. // Сложение фишек вправо
  202. void mergeRight() {
  203. for (int i = 0; i < SIZE; ++i) {
  204. for (int j = SIZE - 1; j > 0; --j) {
  205. if (board[i][j] == board[i][j - 1] && board[i][j] != 0) {
  206. board[i][j] *= 2;
  207. board[i][j - 1] = 0;
  208. }
  209. }
  210. }
  211. }
  212.  
  213. // Сдвиг фишек вверх
  214. void moveUp() {
  215. for (int j = 0; j < SIZE; ++j) {
  216. for (int i = 0; i < SIZE - 1; ++i) {
  217. if (board[i][j] == 0) {
  218. for (int k = i + 1; k < SIZE; ++k) {
  219. if (board[k][j] != 0) {
  220. board[i][j] = board[k][j];
  221. board[k][j] = 0;
  222. break;
  223. }
  224. }
  225. }
  226. }
  227. }
  228. }
  229.  
  230. // Сложение фишек вверх
  231. void mergeUp() {
  232. for (int j = 0; j < SIZE; ++j) {
  233. for (int i = 0; i < SIZE - 1; ++i) {
  234. if (board[i][j] == board[i + 1][j] && board[i][j] != 0) {
  235. board[i][j] *= 2;
  236. board[i + 1][j] = 0;
  237. }
  238. }
  239. }
  240. }
  241.  
  242. // Сдвиг фишек вниз
  243. void moveDown() {
  244. for (int j = 0; j < SIZE; ++j) {
  245. for (int i = SIZE - 1; i > 0; --i) {
  246. if (board[i][j] == 0) {
  247. for (int k = i - 1; k >= 0; --k) {
  248. if (board[k][j] != 0) {
  249. board[i][j] = board[k][j];
  250. board[k][j] = 0;
  251. break;
  252. }
  253. }
  254. }
  255. }
  256. }
  257. }
  258.  
  259. // Сложение фишек вниз
  260. void mergeDown() {
  261. for (int j = 0; j < SIZE; ++j) {
  262. for (int i = SIZE - 1; i > 0; --i) {
  263. if (board[i][j] == board[i - 1][j] && board[i][j] != 0) {
  264. board[i][j] *= 2;
  265. board[i - 1][j] = 0;
  266. }
  267. }
  268. }
  269. }
  270.  
  271.  
  272. // Функция для обработки нажатий клавиш
  273. void handleKeypress(unsigned char key, int x, int y) {
  274. if (key == 27) { // Escape key
  275. exit(0);
  276. }
  277. }
  278.  
  279. // Функция для обработки специальных клавиш
  280. void handleSpecialKeypress(int key, int x, int y) {
  281. switch (key) {
  282. case GLUT_KEY_LEFT:
  283. moveLeft();
  284. mergeLeft();
  285. moveLeft();
  286. break;
  287. case GLUT_KEY_RIGHT:
  288. moveRight();
  289. mergeRight();
  290. moveRight();
  291. break;
  292. case GLUT_KEY_UP:
  293. moveUp();
  294. mergeUp();
  295. moveUp();
  296. break;
  297. case GLUT_KEY_DOWN:
  298. moveDown();
  299. mergeDown();
  300. moveDown();
  301. break;
  302. }
  303. generateTile();
  304. glutPostRedisplay();
  305. if (checkWin()) {
  306. std::cout << "You win!" << std::endl;
  307. }
  308. if (checkLose()) {
  309. std::cout << "Game over!" << std::endl;
  310. }
  311. }
  312.  
  313. // Функция отрисовки доски
  314. void drawBoard() {
  315. for (int i = 0; i < SIZE; ++i) {
  316. for (int j = 0; j < SIZE; ++j) {
  317. int x = j * TILE_SIZE;
  318. int y = (SIZE - 1 - i) * TILE_SIZE;
  319. drawTile(x, y, board[i][j]);
  320. }
  321. }
  322. }
  323.  
  324. void timer(int value) {
  325.  
  326. glutTimerFunc(1000, timer, 0); // таймер с интервалом 1 секунда
  327. glutPostRedisplay();
  328. }
  329.  
  330. void display() {
  331. glClear(GL_COLOR_BUFFER_BIT);
  332. drawBoard();
  333. glutSwapBuffers();
  334. }
  335.  
  336. int main(int argc, char** argv) {
  337. srand(time(nullptr));
  338. glutInit(&argc, argv);
  339. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  340. glutInitWindowSize(SIZE * TILE_SIZE, SIZE * TILE_SIZE);
  341. glutCreateWindow("2048 Game");
  342. glutDisplayFunc(display);
  343. glutKeyboardFunc(handleKeypress);
  344. glutSpecialFunc(handleSpecialKeypress);
  345. init();
  346. generateTile();
  347. generateTile();
  348. glutTimerFunc(1000, timer, 0); // таймер с интервалом 1 секунда
  349. glutMainLoop();
  350. return 0;
  351. }
  352.  
  353.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement