Advertisement
Guest User

Untitled

a guest
Nov 19th, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.54 KB | None | 0 0
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <stdbool.h>
  4. #include <conio.h>
  5. #include <stdlib.h>
  6. #include <time.h>
  7. #include "pixel.h"
  8. #include "game.h"
  9.  
  10. void consoleDrawFrame(GameInstanse *game, GameSettings *settings) {
  11.     char *frame = (char *)malloc(sizeof(char) * ((settings->width + 1) * settings->height + 1));
  12.     for (int i = 0; i < settings->height; i++) {
  13.         for (int j = 0; j < settings->width; j++) {
  14.             *(frame + i * (settings->width + 1) + j) = game->Screen[i * settings->width + j].content;
  15.         }
  16.         *(frame + i * (settings->width + 1) + settings->width) = '\n';
  17.     }
  18.     *(frame + ((settings->width + 1) * settings->height)) = '\0';
  19.     system("@cls||clear");
  20.     printf("%s", frame);
  21.     free(frame);
  22. }
  23.  
  24. void setPixel(int w, int h, PixelType type, GameInstanse *game, GameSettings *settings) {
  25.     Pixel *current = &(game->Screen[h * settings->width + w]);
  26.     switch (type) {
  27.     case border:
  28.         current->content = settings->borderSymbol;
  29.         break;
  30.     case empty:
  31.         current->content = settings->emptySymbol;
  32.         break;
  33.     case snakeHead:
  34.         current->content = settings->snakeHeadSymbol;
  35.         break;
  36.     case snakeBody:
  37.         current->content = settings->snakeBodySymbol;
  38.         break;
  39.     case food:
  40.         current->content = settings->foodSymbol;
  41.         break;
  42.     case block:
  43.         current->content = settings->blockSymbol;
  44.         break;
  45.     }
  46.     current->type = type;
  47. }
  48.  
  49. int getRandomPointX(GameInstanse *game, GameSettings *settings) {
  50.     return ((rand() % (settings->width - 2 * settings->borderSize)) + settings->borderSize);
  51. }
  52.  
  53. int getRandomPointY(GameInstanse *game, GameSettings *settings) {
  54.     return ((rand() % (settings->height - 2 * settings->borderSize)) + settings->borderSize);
  55. }
  56.  
  57. void consoleDrawFood(GameInstanse *game, GameSettings *settings) { 
  58.     int x = getRandomPointX(game, settings);
  59.     int y = getRandomPointY(game, settings);
  60.  
  61.     if (game->Screen[y * settings->width + x].type == empty) {
  62.         game->food.x = x;
  63.         game->food.y = y;
  64.         setPixel(x, y, food, game, settings);
  65.     }
  66.     else {
  67.         consoleDrawFood(game, settings);
  68.     }
  69. }
  70.  
  71. /**
  72.  * Ошибки в последних двух попытках отрисовки.  
  73.  * Что можно улучшить:
  74.  *   - Необходимо хотя бы один раз попытаться выбрать случайную точку рядом.
  75.  *     Если она занята, перебрать уже все вокруг.(включая и ту, что выбрали)
  76.  *     Для этого необходимо получить два случайных числа от -1 до 1.
  77.  *     1 - rand() % 3
  78.  */
  79. void islands(GameInstanse *game, GameSettings *settings) {
  80.    
  81.     if (game->Screen[game->block.y * settings->width + (game->block.x - 1)].type == empty) {
  82.         // если пусто c x сдвигом, нарисовали блок
  83.         setPixel(game->block.x - 1, game->block.y, block, game, settings);
  84.     } else {
  85.         // иначе грустим, пытаясь сотворить y сдвиг
  86.         if (game->Screen[(game->block.y - 1) * settings->width + game->block.x].type == empty){
  87.                 setPixel(game->block.x, game->block.y - 1, block, game, settings);}
  88.         else {
  89.             // еще раз пытаем счастье с X сдвигом
  90.             // стоп, а почему в условии != empty?
  91.             if (game->Screen[game->block.y * settings->width + (game->block.x + 1)].type != empty){
  92.                 setPixel(game->block.x + 1, game->block.y, block, game, settings);}
  93.             else {
  94.                 // чет не везет. Ну, последний y сдвиг
  95.                 // А.С. Пушкин не проверит, что пиксель по этим координатам пустой.
  96.                 // Ох, не проверит. Проверь ты :)
  97.                 setPixel(game->block.x, game->block.y + 1, block, game, settings);
  98.             }
  99.         }
  100.     }
  101.     // ну, на краяйняк, если предположить, что все четыре варианта не прокатили(а это вообще возможно?)
  102.     // то мы просто ничего не делаем. Грустим, что лузеры
  103. }
  104.  
  105. void consoleDrawBlock(GameInstanse *game, GameSettings *settings) {
  106.     for (int i = 0; i < settings->numberOfBlock; i++) {
  107.         // к слову, почему проще возвращать точку.
  108.         // если сделать функцию getRandomEmptyPoint (случайная пустая)
  109.         // то внутрь нее можно убрать проверку, что точка пустая. Но эт фигня
  110.         int x = getRandomPointX(game, settings);
  111.         int y = getRandomPointY(game, settings);
  112.         if (game->Screen[y * settings->width + x].type == empty) {
  113.             // сохранили информацию о текущих координатах блока в "глобальную" переменную
  114.             // используется при отрисовке островков
  115.             game->block.x = x;
  116.             game->block.y = y;
  117.  
  118.             setPixel(x, y, block, game, settings);
  119.         } else {
  120.             // рекурсия, прикольно. Вот только когда эта функция будет выполнена,
  121.             // код ЭТОЙ (первичной, родительской) функции продолжится.
  122.             // то есть острова будут отрисованы еще один раз.
  123.             consoleDrawBlock(game, settings);
  124.             // return;
  125.             // I hope you understand me:)
  126.         }
  127.         // юху, рисуем островки.
  128.         // первая клетка островка отрисована выше. Осталось еще две
  129.         // потому и вызовов два
  130.         islands(game, settings);
  131.         islands(game, settings);
  132.     }
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement