Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <windows.h>
- #include <stdio.h>
- #include <stdbool.h>
- #include <conio.h>
- #include <stdlib.h>
- #include <time.h>
- #include "pixel.h"
- #include "game.h"
- void consoleDrawFrame(GameInstanse *game, GameSettings *settings) {
- char *frame = (char *)malloc(sizeof(char) * ((settings->width + 1) * settings->height + 1));
- for (int i = 0; i < settings->height; i++) {
- for (int j = 0; j < settings->width; j++) {
- *(frame + i * (settings->width + 1) + j) = game->Screen[i * settings->width + j].content;
- }
- *(frame + i * (settings->width + 1) + settings->width) = '\n';
- }
- *(frame + ((settings->width + 1) * settings->height)) = '\0';
- system("@cls||clear");
- printf("%s", frame);
- free(frame);
- }
- void setPixel(int w, int h, PixelType type, GameInstanse *game, GameSettings *settings) {
- Pixel *current = &(game->Screen[h * settings->width + w]);
- switch (type) {
- case border:
- current->content = settings->borderSymbol;
- break;
- case empty:
- current->content = settings->emptySymbol;
- break;
- case snakeHead:
- current->content = settings->snakeHeadSymbol;
- break;
- case snakeBody:
- current->content = settings->snakeBodySymbol;
- break;
- case food:
- current->content = settings->foodSymbol;
- break;
- case block:
- current->content = settings->blockSymbol;
- break;
- }
- current->type = type;
- }
- int getRandomPointX(GameInstanse *game, GameSettings *settings) {
- return ((rand() % (settings->width - 2 * settings->borderSize)) + settings->borderSize);
- }
- int getRandomPointY(GameInstanse *game, GameSettings *settings) {
- return ((rand() % (settings->height - 2 * settings->borderSize)) + settings->borderSize);
- }
- void consoleDrawFood(GameInstanse *game, GameSettings *settings) {
- int x = getRandomPointX(game, settings);
- int y = getRandomPointY(game, settings);
- if (game->Screen[y * settings->width + x].type == empty) {
- game->food.x = x;
- game->food.y = y;
- setPixel(x, y, food, game, settings);
- }
- else {
- consoleDrawFood(game, settings);
- }
- }
- /**
- * Ошибки в последних двух попытках отрисовки.
- * Что можно улучшить:
- * - Необходимо хотя бы один раз попытаться выбрать случайную точку рядом.
- * Если она занята, перебрать уже все вокруг.(включая и ту, что выбрали)
- * Для этого необходимо получить два случайных числа от -1 до 1.
- * 1 - rand() % 3
- */
- void islands(GameInstanse *game, GameSettings *settings) {
- if (game->Screen[game->block.y * settings->width + (game->block.x - 1)].type == empty) {
- // если пусто c x сдвигом, нарисовали блок
- setPixel(game->block.x - 1, game->block.y, block, game, settings);
- } else {
- // иначе грустим, пытаясь сотворить y сдвиг
- if (game->Screen[(game->block.y - 1) * settings->width + game->block.x].type == empty){
- setPixel(game->block.x, game->block.y - 1, block, game, settings);}
- else {
- // еще раз пытаем счастье с X сдвигом
- // стоп, а почему в условии != empty?
- if (game->Screen[game->block.y * settings->width + (game->block.x + 1)].type != empty){
- setPixel(game->block.x + 1, game->block.y, block, game, settings);}
- else {
- // чет не везет. Ну, последний y сдвиг
- // А.С. Пушкин не проверит, что пиксель по этим координатам пустой.
- // Ох, не проверит. Проверь ты :)
- setPixel(game->block.x, game->block.y + 1, block, game, settings);
- }
- }
- }
- // ну, на краяйняк, если предположить, что все четыре варианта не прокатили(а это вообще возможно?)
- // то мы просто ничего не делаем. Грустим, что лузеры
- }
- void consoleDrawBlock(GameInstanse *game, GameSettings *settings) {
- for (int i = 0; i < settings->numberOfBlock; i++) {
- // к слову, почему проще возвращать точку.
- // если сделать функцию getRandomEmptyPoint (случайная пустая)
- // то внутрь нее можно убрать проверку, что точка пустая. Но эт фигня
- int x = getRandomPointX(game, settings);
- int y = getRandomPointY(game, settings);
- if (game->Screen[y * settings->width + x].type == empty) {
- // сохранили информацию о текущих координатах блока в "глобальную" переменную
- // используется при отрисовке островков
- game->block.x = x;
- game->block.y = y;
- setPixel(x, y, block, game, settings);
- } else {
- // рекурсия, прикольно. Вот только когда эта функция будет выполнена,
- // код ЭТОЙ (первичной, родительской) функции продолжится.
- // то есть острова будут отрисованы еще один раз.
- consoleDrawBlock(game, settings);
- // return;
- // I hope you understand me:)
- }
- // юху, рисуем островки.
- // первая клетка островка отрисована выше. Осталось еще две
- // потому и вызовов два
- islands(game, settings);
- islands(game, settings);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement