Advertisement
podsolnyxxx

+ очки. не останавливается 4

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