Бомба!! Спасибо большое за урок, практика которую мы заслуживаем. Можно и что то добавить, и что то переделать, и понять структуру, и комментарии на каждом знаке, и всё на базовых знаниях... Ещё раз, ОГРОМНЕЙШЕЕ СПАСИБО!!!!!
@@DarknesS-sy6to Что? с-шарп? ПХП? С-шарп - легкая версия Си, он не такой уж и трудный если смотреть на С. С пхп начинают новички, о нем говорить вообще смысла нет, легче легкого.
@@constvntine5453 C# - Трудный, но не сложный? Так он трудный или нет?! К тому же я с тобой не соглашусь так, как испытывал тупые оплошности во время учёбы Python после учёбы PHP!
@@DarknesS-sy6to Я так понял ты не знаешь разницу между "трудным" и "сложным". Питон мне показался легче чем php, у всех по разному. Там синтаксис проще, и книги есть достойные, по которым можно освоить не зная клиентскую часть, и многое другое.
Буквально недавно начал писать свою змейку на С# в окне. Несколько дней гемороился с алгоритмом для хвоста змейки и тут это видео! Применил этот алгоритм, все работает! Большое спасибо! Жирный лайк)
Функция SetConsoleCursorPosition (библиотека windows.h) устанавливает положение текстового курсора в консольном окне. Например: COORD cursorPos; cursorPos.X = 5; cursorPos.Y = 2; SetConsoleCursorPosition(hStdOut, cursorPos); Первым аргументом она принимает дескриптор консольного окна, а вторым - переменную типа COORD (это структура с двумя полями X и Y), в котройдолжны находиться координаты текстового курсора. Т.е. изменяет только выделеный символ. В этой игре, в сетапе, можно было один раз прорисовать карту, а потом, циклично прорисовывать каждый сегмент! И лагов было бы на столько мало, что они были бы просто не заметны! Но автору похуй! И правильно, легче спиздить чужой алгоритм, выложить под видом своего и не париться
#include //Для работы с консолью и т.д. (библиотека много что может) void ConsolePenCoordinates(int& x, int& y)//Устанавливает курсор консоли по заданным координатам { COORD Position;//Объявление необходимой структуры HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);//Получение дескриптора устройства стандартного вывода Position.X = x;//Установка координаты X Position.Y = y;//Установка координаты Y SetConsoleCursorPosition(hStdOut, Position);//Перемещение каретки по заданным координатам }
Спасибо большое за уроки. Очень подробно, ясно и не очень усложненно. В комментах некоторые товарищи пишут, что можно лучше. Это понятно, что можно все красивее сделать. Но для начинающих то что нужно - без всяких нагромождений и общая логика понятно. Еще раз спасибо.
тут вроде есть баг, если змейка едет вниз и нажать вверх, то голова начнет движение вверх, а там хвост и гейм овер. нужно еще пару условий (где то в инпут функции) типа: если последняя нажатая кнопка была вниз, то вверх нажать нельзя, только влево или вправо. если было нажато D, то доступно только W или S ну и т.д.
switch (_getch()) { case 'a': if (dir != RIGHT || nTail == 0)dir = LEFT; break; case 'd': if (dir != LEFT || nTail == 0) dir = RIGHT; break; case 'w': if (dir != DOWN || nTail == 0) dir = UP; break; case 's': if (dir != UP || nTail == 0) dir = DOWN; break; case 'q': dir = STOP; break; case 'x': gameOver = true ; break;
void Input() { if (_kbhit()){ switch(_getch()) { case 'a': if (dir != RIGHT) dir = LEFT; break; case 's': if (dir != UP) dir = DOWN; break; case 'd': if (dir != LEFT) dir = RIGHT; break; case 'w': if (dir != DOWN) dir = UP; break; case 'x': gameOver = true; break; } } }
@@lon5393 Нет,элементы свича не имеют проверки,её надо создавать отдельно,здесь же проверка уже встроена в кейсы,так просто удобнее(занимает меньше места).Кстати,небольшой вопросик,как учишь(какая-нибудь литература,или чей-то канал)?
можно было чтоб сберечь ресурсы компа все числовые переменные, значение которых в принципе не может превысить 255, объявить как char. char - один байт, а int - 4 байта как правило. Программирование микроконтроллеров приучает так делать)) на ассемблере, конечно проще: байт - это все что ты сам захочешь. Хочешь - целое, хочешь - с точкой, хочешь - отрицательное. хочешь - символ)))
В процессе тестирования нашел 2 бага: 1) не работают кнопки, если включен Caps Lock, это мелочь конечно и исправимо. 2) Последний цикл прохождения через стену нормально работает с -1, иначе когда фрукт около самой стенки, то его никак не взять. поэтому получается так: if (x >= width - 1) x = 0; else if (x < 0) x = width - 1; if (y >= height - 1) y = 0; else if (y < 0) y = height - 1; Спасибо большое за увлекательные видео!
11:52 после gameOver = true неплохо бы и выход из цикла дописать. Ну и избыточным считаю проверять выход змейки за пределы по x, если она движется по y) И советую структурировать код и использовать ООП (из-за которого с++ и был придумал собсно :) )
количество классов и методов будет зависеть от твоей архитектуры. и более того тут можно использовать и FSM. Вывод\ввод (в том числе в консоль) лучше выносить за пределы логики, можно даже в отдельную подключаемую длл. Это называется нормальным стилем программирования. и это приветствуется, особенно в учебных видео. а стиль аля "пишу все в одной функции@называю это с++" врядли кого-то чему-то научит (хорошему).
смотря в чем польза. если это урок, то он должен чему-то научить. с такой точки зрения использовать правильные подходы в создании архитектуры приложения, использовать пару патернов - это полезно. это способствует в обучении программированию. Та и не будет там 1-го класса с одним методом. Золотое правило звучит так: 1 метод выполняет одно логическое действие, длина метода не должна быть больше одного экрана в 90% случаев. если у человека есть знания\опыт в проектировании архитектуры приложений, то ему не составит труда сделать все нормально не зависимо от размера проекта (за исключением очень крупных), поэтому я не вижу, почему бы в учебных целяг не показать наглядно как это делается. во-вторых, пользы с точки зрения экономии в размере сорцов не будет, но будет более наглядный\понятный\структурированный код как результат перекладывания сущностей из реальности на юзер-дефайнед типы(классы). Обычно программисты оставляют место для маневра, допустим, мы захотим сделать, чтолы был не 1 тип фруктов, а несколько. в том виде кода, что представлен в видео - это будет треш, если же будет использоваться ооп парадигма, фактори патерн, то это может быть сделано в течении 5-10 минут без особых усилий и превращения кода в еще большее говно. если вынести взаимодействие юзера с программой в отдельно подключаемый модуль (как частенько и делают), то это позволит нам полностью в коде игровой логики абстрагироваться от I/O, что в дальнейшем облегчит возможность перехода на альтернативный методы I/O - имя один интерфейс общения, может подключить вместо консольного ввода\вывода любую графическую либу. Можем даженаписать несколько реализаций I/O и по типу аддынов подключать в зависимости от выбора пользователя. проще говоря, это называется - расширяемость. если до сих пор непонятно, то я сдаюсь.
Удивительно! Это одновременно и абсолютное сумасшествие (в болезненной форме) :)))), и необузданная гениальность!!! :))) Змейка, блин, мать её, на консоли!!!!! :))))))))) Потрясающе!!! :) Достойно лайка! :) З.Ы. Чем-то напоминает шоу "Чудаки"... Круто и весело, но "не делайте так дома"!!! :)))
@@dimker4130 можешь скинуть код? у меня с хвостом проблемы, просто хочу сравнить и найти ошибку. У меня когда 3 фрукт собираю, то 4-10 части тела не следуют идеально, а только горизонтально. тоесть первые 2 части змейки идут за головой, остальные горизонтальной полосой
Спасибо за турориал, очень понравилось. Столкнулся с проблемой что слишком быстро обновляется консоль и просто не успеваю управлять змеей. Сначала просто увеличил поля высоты и ширины а потом решил что лучше приостанавливать главный поток(_sleep(time_sleep)).Поставил 100 мс и норм. Думаю можно тип усложнять єтим параметром, по типу больше очей набрал, уменьшил немного time_sleep......все, я спать
С точки зрения разбития основноц задачи на подзадачи и объяснения логики - очень классное видео. Но читабельность кода... Я так писал когда пересел с QBasic на C++. Если бы я писал эту игру сейчас, я бы создал класс Segment, который хранил бы свойства сегментов хвоста и создал бы например вектор указателей на такие сегменты. Когда съдаешь фрукт, то в конец вектора добавляется еще один экземпляр класса Segment. И сделал бы наследный класс Head : public Segment. С тем, чтобы if(Head.Coord == Segment. Coord) gameOver = true. Ну примерно так, читабельность кода будет на порядок веселее
Конечно с прорисовкой заново всего поля игры будет брать много ресурсов, думаю лучше сделать массив игрового поля, и торомозить не будет, и проверку делать если край , змея или фрукт, сравнивая координату головы с ячейкой масива, моргать так не будет, когда то давно еще в начале 90х на турбо паскале (похож на С, в универе потом С проще было понять) написал тетрис, и комп у меня был "Искра" так там проц был 4МГерца, и игра не торозила)
Кстати, а я правильно понимаю, что в данной реализации нет защиты от того, что яблоко может появиться прямо на змейке? Это же тоже надо отслеживать. Причём, я считаю, не совсем правильным просто проверять это и брать новые случайные координаты, потому что может оказаться так, что игровое поле почти полностью заполнено змейкой и нам придётся очень много раз вызывать функцию rand(), чтобы найти пустую клетку. В своей реализации змейки я делал иначе. Я считал кол-во пустых клеток на карте, а потом брал rand() из диапазона до этого числа, а потом отсчитывал на карте, идя слева направо, сверху вниз пустые клетки. Таким образом, я находил свободную клетку за 1 вызов rand(). Но правда ценой обхода в среднем половины карты. Плюс в моей реализации есть возможность обработать ситуацию, когда клетки заполнены на 100% и яблоко просто некуда поставить. Я считаю эту ситуацию победой игрока.
Спасибо за видео! Уроки полезные! Хотелось бы курс по 3D игре на с++ (слышал, что на c++ игра Minecraft более производительная, чем Minecraft на Java).
OpenGl тебе в помощь... а на чистом C++ без знания высшей математики, а в частности матриц и матричных умножений, делать 3d игры, непонимая как это работает будет нереально сложно. ИМХО ОТВЕТИТЬ
почему в 9:30 tailX[0] = x и аналогично и с у? и почему не завершается игра когда мы проверяем не попали ли мы головой по хвосту: for(int i = 0; ..){ if(tailX[i] == x ...) то gameover}
я посмотрел конечный результат и увидел мерцание, как я понял вы аросто перерисовывали все элементы, но лучше использовать виндовс апи, там можно менять конкретные символы, т.е. нам не надо все перерисовывать, а лишь 3: конец хвоста закрасить, перенести голову, и закрасить старую голову как тело
Я на js делал змейку по книжке, использовав ООП и там я для каждого блока создавал объект (с координатами x, y) и добавлял в массив такие объекты, если игрок нажимал влево я добавлял объект влево если в перед то в перед ну и в право добавлял в право, только если игрок не съел яблоко я отнимал последний элемент, итого: змейка с многоцветной полноценной графикой, 200 строк кода, разделенных на легко читаемые блоки кода, без каких либо багов типа нажатия вперед и сразу назад (я сделал короткую проверку этого). Замечу что в c++ вы могли бы использовать вместо int, short - с вашими лагами это бы очень погло.
еще в 12 лет писал змейку. алгоритм прорисовки хвоста здесь ужасен. а насколько проще и Красивее не очищать экран, а в последнем звене хвоста рисовать пробел! задумайтесь) красиво, изящно, не мигает. на современных ресурсах компа люди совсем думать перестают (( но за видео лайк, отлично грамотно объясняет автор!
Привет, как называется эффект в играх, когда персонаж может быть одновременно с правой и с левой стороны экрана? Это когда персонаж доходит до правой стороны экрана и начинает вроде бы уходить за экран, но на самом деле выходит с левой стороны экрана. Меня интересует лишь общепринятое название, а не алгоритм.
Ну если ты все делаешь по шаблону и не можешь сам решить задачу, а наверняка копи-пастишь исходники, то все очень плохо! Все не пиши мне, я все равно не отвечу!
ага, вот такая я не уникальная снежинка, не изобретаю велосипед с квадартными колесами и не ищу алгоритмов надевания штанов через голову. А наоборот, предпочитаю использовать уже накопленные человечеством знания в области. а про алгоритм с движением змеи даже искать ничего не надо, если хоть чуточку понимаешь что есть игра, что есть state pattern и владеешь базовой логикой ребенка 10 лет :) я столкнулся со змейкой я во время разработки AI для этой игры (:
Уважаемый Гоша, эта рубрика весьма интересна, почему же вам её не продолжить. Когда-то ещё на синклере, практически в детстве пробовал писать. Но там был язык бейсик и производил обновление экрана также, через cls... В любом случае спасибо.
При взятии второго и далее фруктов кусок хвоста сначала появляется в верхнем левом углу (9:48) а потом уже присоединяется к змейке. Довольно смутно понимаю как вообще этот хвост работает, можно ли от этого бага избавиться?
Классные видео снимаешь, но почему ты не сказал, что это перевод видоса NVitanovic? Код ведь идентичен, даже частей как у него 3.) А так, голос приятно слушать и изложено все четко.
Ребят, а есть курс, как сделать хотя бы ту же змейку, но уже в окне, скажем как сапёр, где можно уровень сложности выбрать, чтобы была окошки: закрыть, свернуть, справка и т.д?
у меня почемуто rand() работает не коррекно. после сьедания фрукта новый не появляется. вначале я состался на то что рандомное значение выходит за пределы поля и добавил fruitX = 3 + rand() % (width - 3); fruitY = 3 + rand() % (height - 3); что вы наверняка не вышло, но это не помогает
единственное. )) В коде всегда нужно комментить, что и для чего тот или иной цикл, функция, или переменная. Особенно полезно, когда разбираешься потом в этом коде.
Все классно только когда нажимаю на противоположную кнопку он выходит из игры , например у меня уже 4 "o" на хвосте еду вперед нажимаю на заднюю кнопку и выходит из игры. Нужно сделать так чтобы противоположная кнопка не работала.
хвост не отображается, но при касании об голову геймовер --> хвост есть. Что делать? Вот код блока Draw: void Draw() { system("cls"); for (int i = 0; i < width + 1; i++) { cout
Отличный урок, спасибо. Единственное, что не так - после 3-го съеденного фрукта, если нажимаешь клавишу, противоположную направлению движения, игра завершается. Так не должно быть
Несогласен с двумя моментами. Первое, как рисуется хвост. Легче было бы, если просто удалить последний элемент хвоста (массива) и добавить один элемент перед головой, а не передвигать всю змею. Второе, то что ты творишь с width и height. Зачем весь этот геморой с единицами, если можно было сделать всё нормально.
есть один бак, как его можно поправить. если нажать на кнопку противоположную от направления движения то игра прекратиться, то есть если змейка ползет вверх и нажать клавишу s и т.п.
Понимаю что поздно, но это не баг, по сути это и есть условие пройгрыша, змея пытается съесть свой хвост поэтому и умирает, если это же сделать без хвоста, то ничего не будет
вопрос такой, как запретить двигаться в сторону противоположную движению которое уже происходит. то есть если идет движение влево то запретить двигаться вправо и на оборот, также для вверх и вниз
можешь скинуть код? у меня с хвостом проблемы, просто хочу сравнить и найти ошибку. У меня когда 3 фрукт собираю, то 4-10 части тела не следуют идеально, а только горизонтально. тоесть первые 2 части змейки идут за головой, остальные горизонтальной полосой
Можно было через модуль сделать, без убогих условий, если выходит за границу значит от текущей координаты -10 в модуле, тогда если стенка справа,то 11- 10 =1, если слева, то 0 - 10 в модуле получаем 10, вот и все
Я не понимаю, почему эта игра написана на С++, ведь кроме функций и статических переменных, ничего больше нету. Если не брать во внимание подключенных библиотек, весь код это обычный С.
подскажите, как запустить код в отдельном консольном окне в clion ? у меня после выбора направления, допустим, w появляется бесчисленное количество игровых полей
У вас ошибка примерно на 90-й - 100-й строке кода, в функции логики. А именно в цикле for (int i = 1; i < nTail; i++) { prev2X = tailX[i]; prev2Y = tailY[i]; tailX[i] = prevX; tailY[i] = prevY; //здесь у вас написано tailX[i] = prevY; а должно быть tailY[i] = prevY; prevX = prev2X; prevY = prev2Y; }
извини что не совсем по теме, но у меня просьба, запиши видео "Как сделать личный кабинет для сайта" Отвечаю если запишешь такое видео то уж точно наберешь много просмотров, так как в интернете на эту тему я ни чего не нашел
змея после 3 фрукта у меня, теряет хвост и он бегает по экрану сам, это почему? т.е. ест первый, второй, третий и все бегает с таким хвостом, а остальной хвост на экране сам бегает)))
подскажите пожалуйста, досмотрел до 7.29 минуты и у меня пишет ошибку [Error] incompatible types in assignment of 'int' to 'int [100]' как быть? на эти строчки ругается: tailX = prevX; tailY = prevY;
если не трудно сам посмотри что можно сделать #include #include #include #include using namespace std; bool gameOver; const int width = 20; const int height = 20; int x, y, fruit_x, fruit_y, score; int tailX[100], tailY[100]; int nTail; enum edirect { stop = 0, LEFT, RIGHT, up, down }; edirect dir; void setup() { srand(100); gameOver = false; dir = stop; x = width / 2-1; y = height / 2-1; fruit_x = rand() % width; fruit_y = rand() % height; score = 0; } void draw() { //i-koorfinata po y, j-koordinata po x. system("cls"); for (int j = 1; j
Может кто-нибудь подсказать? Я хотел сделать переключатель перед игрой между режимом, когда стена убивает, а когда позволяет пройти сквозь себя. Как это сделать?
выводишь сначала текст где пишет 1 - такой режим 2 - такой режим с помощью _getch() узнаёшь на что нажали а далее если нажали 1 то запускается первый код иначе второй
Один из неприятных недостатков этого кода, то что когда змейка движется в напрвлении и нажимая клавишу обратного направления змейка получается сьедает свой хвост и игра заканчивается, а как это пофиксить?
зависит от типа приложения, что ты хочешь создать. опенгл используют для рендеринга 3д графики. при чем это довольно-таки низкоуровневая либа, которая требует вменени на вникание в нее. в крупных проектах, обычно, на таком низком уровне делают выборочные куски, которые требуют оптимизации в плане производительности. реже пишут весь проект на опенгл (у нас на работе пишут CAD систему в том числе на opengl, к примеру). sfml - это библиотека для отрисовки 2д графики, написана на с++, но есть байндинги и на несколько других языков. с ее помощью часто делают 2д игры. делать там, к примеру, оконное приложение с юзер интерфейсом - так себе занятие. так же в sfml сузествует поддержка opengl, что значит, что ты можешь использовать OPENGL напрямую в окне sfml. ну а qt - он многоцелевой, там есть возможность довольно быстро делать гибкий UI (оконное приложение), есть возможность писать 2д и кажется 3д игры(про 3д кажись читал, но сам дела не имел). но я бы игру на qt игру писать не стал, разве что в учебных целях.
Бомба!! Спасибо большое за урок, практика которую мы заслуживаем.
Можно и что то добавить, и что то переделать, и понять структуру, и комментарии на каждом знаке, и всё на базовых знаниях...
Ещё раз, ОГРОМНЕЙШЕЕ СПАСИБО!!!!!
Я так понял GTA 6 я так не напишу
C++-это самый сложный язык (он сам это сказал)
@@ФондзащитыСВ-98 Ещё C# и PHP
@@DarknesS-sy6to Что? с-шарп? ПХП?
С-шарп - легкая версия Си, он не такой уж и трудный если смотреть на С.
С пхп начинают новички, о нем говорить вообще смысла нет, легче легкого.
@@constvntine5453 C# - Трудный, но не сложный? Так он трудный или нет?!
К тому же я с тобой не соглашусь так, как испытывал тупые оплошности во время учёбы Python после учёбы PHP!
@@DarknesS-sy6to Я так понял ты не знаешь разницу между "трудным" и "сложным". Питон мне показался легче чем php, у всех по разному. Там синтаксис проще, и книги есть достойные, по которым можно освоить не зная клиентскую часть, и многое другое.
Буквально недавно начал писать свою змейку на С# в окне. Несколько дней гемороился с алгоритмом для хвоста змейки и тут это видео! Применил этот алгоритм, все работает! Большое спасибо! Жирный лайк)
А там мерцание тоже есть?
Мерцание будет, если делать, как автор видео. Используй SetConsoleCursorPosition. Лагов намного меньше.
Функция SetConsoleCursorPosition (библиотека windows.h) устанавливает положение текстового курсора в консольном окне. Например:
COORD cursorPos;
cursorPos.X = 5;
cursorPos.Y = 2;
SetConsoleCursorPosition(hStdOut, cursorPos);
Первым аргументом она принимает дескриптор консольного окна, а вторым - переменную типа COORD (это структура с двумя полями X и Y), в котройдолжны находиться координаты текстового курсора. Т.е. изменяет только выделеный символ. В этой игре, в сетапе, можно было один раз прорисовать карту, а потом, циклично прорисовывать каждый сегмент! И лагов было бы на столько мало, что они были бы просто не заметны! Но автору похуй! И правильно, легче спиздить чужой алгоритм, выложить под видом своего и не париться
#include //Для работы с консолью и т.д. (библиотека много что может)
void ConsolePenCoordinates(int& x, int& y)//Устанавливает курсор консоли по заданным координатам
{
COORD Position;//Объявление необходимой структуры
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);//Получение дескриптора устройства стандартного вывода
Position.X = x;//Установка координаты X
Position.Y = y;//Установка координаты Y
SetConsoleCursorPosition(hStdOut, Position);//Перемещение каретки по заданным координатам
}
@@maximplyashchenko5610 как раз думал, чем можно это реализовать, спасибо
Спасибо большое за уроки. Очень подробно, ясно и не очень усложненно. В комментах некоторые товарищи пишут, что можно лучше. Это понятно, что можно все красивее сделать. Но для начинающих то что нужно - без всяких нагромождений и общая логика понятно. Еще раз спасибо.
Такое ощущение что он каждое видео меняет микрофон __--__--__
Да, уж )
//////////////////////////////////////////////////////////
//ПОДСКАЖИТЕ почему не работает//
//ОШИБОК НЕТ //
//////////////////////////////////////////////////////////
#include
#include
using namespace std;
bool gameOver;
const int width = 20;
const int height = 20;
int x, y;
int fruitX, fruitY;
int score;
int tailX[100], tailY[100];
int nTail;
enum eDirection { STOP = 0, LEFT, RIGHT, UP, DOWN };
eDirection dir;
void Setup()
{
gameOver = false;
dir = STOP;
x = width / 2 - 1;
y = height / 2 - 1;
fruitX = rand() % width;
fruitY = rand() % height;
score = 0;
}
void Draw()
{
system("cls");
for (int i = 0; i < width + 1; i++)
cout
@@David-xd8pu у тебя ошибка значит
Это магия мудацкого монтажа
@@kerikkent вспомни старого maddy murk'a
// Самый готовый код
#include
#include
#include
#include
using namespace std;
bool gameOver;
const int width = 20;
const int height = 20;
int x, y, fruitX, fruitY;
int score;
int speed = 500;
char corm;
int tailX[100], tailY[100];
int nTail = 0;
enum eDirection {STOP = 0, LEFT, RIGHT, UP, DOWN};
eDirection dir;
void Setup();
void Draw();
void Input();
void Logic();
int main() {
system("color 07");
char menu;
cout > menu;
if (menu == 'Y' || menu == 'y') {
system("color 70");
Setup();
while (!gameOver) {
Draw();
Input();
Logic();
if (gameOver)
main();
}
}
else if (menu == 'N' || menu == 'n') {
system("cls");
cout
спасибо добрый вы человек
Спасибо, я не знаю как выразить вам свою благодарность
Спасибо
Играть в нее мы, конечно же, не будем.
Спасибо! Очень понравилось! Нужно больше видео о консольных игрушках на С++ !
#include
#include //для считывания состояния клавиш клавиатуры
#include // для floor
#include //перемещения курсора в консоли, Sleep
#include //для srand(), rand()
#include //время для srand
const int width = 22;
const int height = 14;
char pixel [width][height];
int snake [width][height]{0};
bool gameOver(false);
bool gameStart(false);
enum mover {STOP,LEFT,RIGHT,UP,DOWN};
void displayGraphics(int score){
//установка курсора в 0,0
COORD position; // Объявление необходимой структуры
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);//Получение дескриптора устройства стандартного вывода
position.X = 0; // Установка координаты X
position.Y = 0; // Установка координаты Y
SetConsoleCursorPosition(hConsole, position); // Перемещение каретки по заданным координатам
//system("cls");
for(int j=0;j
а можешь создать репозиторий на гит хабе, а то твой код не работает
Ошибка C4996 стр 99-100
if (kbhit())
fromTheKeyboard = getch();
@@viktorperov3104 if (_kbhit())
fromTheKeyboard = _getch();
нихрена не пашет
от души за туториал, у меня все вышло, спасибо !
тут вроде есть баг, если змейка едет вниз и нажать вверх, то голова начнет движение вверх, а там хвост и гейм овер. нужно еще пару условий (где то в инпут функции) типа: если последняя нажатая кнопка была вниз, то вверх нажать нельзя, только влево или вправо. если было нажато D, то доступно только W или S ну и т.д.
switch (_getch())
{
case 'a':
if (dir != RIGHT || nTail == 0)dir = LEFT; break;
case 'd':
if (dir != LEFT || nTail == 0) dir = RIGHT; break;
case 'w':
if (dir != DOWN || nTail == 0) dir = UP; break;
case 's':
if (dir != UP || nTail == 0) dir = DOWN; break;
case 'q':
dir = STOP; break;
case 'x':
gameOver = true ; break;
void Input() {
if (_kbhit()){
switch(_getch())
{
case 'a':
if (dir != RIGHT)
dir = LEFT;
break;
case 's':
if (dir != UP)
dir = DOWN;
break;
case 'd':
if (dir != LEFT)
dir = RIGHT;
break;
case 'w':
if (dir != DOWN)
dir = UP;
break;
case 'x':
gameOver = true;
break;
}
}
}
@@deniskaliuzhnui2385 зачем q?
@@Alexander0803 а нельзя ли написать типо если было нажато D то A будет false если я неправильно сказал поправьте я только начинаю изучать язык.
@@lon5393 Нет,элементы свича не имеют проверки,её надо создавать отдельно,здесь же проверка уже встроена в кейсы,так просто удобнее(занимает меньше места).Кстати,небольшой вопросик,как учишь(какая-нибудь литература,или чей-то канал)?
можно было чтоб сберечь ресурсы компа все числовые переменные, значение которых в принципе не может превысить 255, объявить как char. char - один байт, а int - 4 байта как правило. Программирование микроконтроллеров приучает так делать)) на ассемблере, конечно проще: байт - это все что ты сам захочешь. Хочешь - целое, хочешь - с точкой, хочешь - отрицательное. хочешь - символ)))
В процессе тестирования нашел 2 бага:
1) не работают кнопки, если включен Caps Lock, это мелочь конечно и исправимо.
2) Последний цикл прохождения через стену нормально работает с -1, иначе когда фрукт около самой стенки, то его никак не взять. поэтому получается так:
if (x >= width - 1)
x = 0;
else if (x < 0)
x = width - 1;
if (y >= height - 1)
y = 0;
else if (y < 0)
y = height - 1;
Спасибо большое за увлекательные видео!
Большое спасибо! Очень хорошо и доступно!
Огромное спасибо за видео
11:52 после gameOver = true неплохо бы и выход из цикла дописать.
Ну и избыточным считаю проверять выход змейки за пределы по x, если она движется по y)
И советую структурировать код и использовать ООП (из-за которого с++ и был придумал собсно :) )
Ami00 чего? Ооп в змейке в консоли? Для чего? Класс с одним методом для вывода в консоль?
количество классов и методов будет зависеть от твоей архитектуры. и более того тут можно использовать и FSM. Вывод\ввод (в том числе в консоль) лучше выносить за пределы логики, можно даже в отдельную подключаемую длл. Это называется нормальным стилем программирования. и это приветствуется, особенно в учебных видео. а стиль аля "пишу все в одной функции@называю это с++" врядли кого-то чему-то научит (хорошему).
"нормальный стиль" используют в "нормальных" проектах, а не темповой змейке в консоли на 100 строк. ООП тут использовать бесполезно.
смотря в чем польза. если это урок, то он должен чему-то научить. с такой точки зрения использовать правильные подходы в создании архитектуры приложения, использовать пару патернов - это полезно. это способствует в обучении программированию. Та и не будет там 1-го класса с одним методом. Золотое правило звучит так: 1 метод выполняет одно логическое действие, длина метода не должна быть больше одного экрана в 90% случаев. если у человека есть знания\опыт в проектировании архитектуры приложений, то ему не составит труда сделать все нормально не зависимо от размера проекта (за исключением очень крупных), поэтому я не вижу, почему бы в учебных целяг не показать наглядно как это делается. во-вторых, пользы с точки зрения экономии в размере сорцов не будет, но будет более наглядный\понятный\структурированный код как результат перекладывания сущностей из реальности на юзер-дефайнед типы(классы). Обычно программисты оставляют место для маневра, допустим, мы захотим сделать, чтолы был не 1 тип фруктов, а несколько. в том виде кода, что представлен в видео - это будет треш, если же будет использоваться ооп парадигма, фактори патерн, то это может быть сделано в течении 5-10 минут без особых усилий и превращения кода в еще большее говно. если вынести взаимодействие юзера с программой в отдельно подключаемый модуль (как частенько и делают), то это позволит нам полностью в коде игровой логики абстрагироваться от I/O, что в дальнейшем облегчит возможность перехода на альтернативный методы I/O - имя один интерфейс общения, может подключить вместо консольного ввода\вывода любую графическую либу. Можем даженаписать несколько реализаций I/O и по типу аддынов подключать в зависимости от выбора пользователя. проще говоря, это называется - расширяемость. если до сих пор непонятно, то я сдаюсь.
А как называется тема по разделению программы на отдельные файлы, подскажите, пожалуйста
Удивительно!
Это одновременно и абсолютное сумасшествие (в болезненной форме) :)))),
и необузданная гениальность!!! :)))
Змейка, блин, мать её, на консоли!!!!! :)))))))))
Потрясающе!!! :)
Достойно лайка! :)
З.Ы. Чем-то напоминает шоу "Чудаки"... Круто и весело, но "не делайте так дома"!!! :)))
Он сплагиатил с запада код
@@dimker4130 можешь скинуть код? у меня с хвостом проблемы, просто хочу сравнить и найти ошибку. У меня когда 3 фрукт собираю, то 4-10 части тела не следуют идеально, а только горизонтально. тоесть первые 2 части змейки идут за головой, остальные горизонтальной полосой
#include
#include
#include
#include
using namespace std;
bool gameOver;
const int width = 20;
const int height = 20;
int x, y, fruitX, fruitY, score;
int tailX[100], tailY[100];
int nTail;
enum eDirection {STOP = 0, LEFT, RIGHT, UP, DOWN};
eDirection dir;
void Setup() {
gameOver = false;
dir = STOP;
x = width / 2 - 1;
y = height / 2 - 1;
fruitX = rand() % width;
fruitY = rand() % height;
score = 0;
}
void Draw() {
Sleep(300);
system("cls"); //SYSTEM CLEAR
for (int i = 0; i < width+1; i++)
cout
Хорошо было бы сделать видео как изменить framerate в console играх!
Спасибо за урок!!!!!
Спасибо за турориал, очень понравилось. Столкнулся с проблемой что слишком быстро обновляется консоль и просто не успеваю управлять змеей. Сначала просто увеличил поля высоты и ширины а потом решил что лучше приостанавливать главный поток(_sleep(time_sleep)).Поставил 100 мс и норм. Думаю можно тип усложнять єтим параметром, по типу больше очей набрал, уменьшил немного time_sleep......все, я спать
Привет, я еще новичок , но не могу понять , где ты прописал команду (_sleep(time_sleep) , помоги пожалуйста .
С точки зрения разбития основноц задачи на подзадачи и объяснения логики - очень классное видео. Но читабельность кода... Я так писал когда пересел с QBasic на C++. Если бы я писал эту игру сейчас, я бы создал класс Segment, который хранил бы свойства сегментов хвоста и создал бы например вектор указателей на такие сегменты. Когда съдаешь фрукт, то в конец вектора добавляется еще один экземпляр класса Segment. И сделал бы наследный класс Head : public Segment. С тем, чтобы if(Head.Coord == Segment. Coord) gameOver = true. Ну примерно так, читабельность кода будет на порядок веселее
Конечно с прорисовкой заново всего поля игры будет брать много ресурсов, думаю лучше сделать массив игрового поля, и торомозить не будет, и проверку делать если край , змея или фрукт, сравнивая координату головы с ячейкой масива, моргать так не будет, когда то давно еще в начале 90х на турбо паскале (похож на С, в универе потом С проще было понять) написал тетрис, и комп у меня был "Искра" так там проц был 4МГерца, и игра не торозила)
Кстати, а я правильно понимаю, что в данной реализации нет защиты от того, что яблоко может появиться прямо на змейке? Это же тоже надо отслеживать. Причём, я считаю, не совсем правильным просто проверять это и брать новые случайные координаты, потому что может оказаться так, что игровое поле почти полностью заполнено змейкой и нам придётся очень много раз вызывать функцию rand(), чтобы найти пустую клетку. В своей реализации змейки я делал иначе. Я считал кол-во пустых клеток на карте, а потом брал rand() из диапазона до этого числа, а потом отсчитывал на карте, идя слева направо, сверху вниз пустые клетки. Таким образом, я находил свободную клетку за 1 вызов rand(). Но правда ценой обхода в среднем половины карты. Плюс в моей реализации есть возможность обработать ситуацию, когда клетки заполнены на 100% и яблоко просто некуда поставить. Я считаю эту ситуацию победой игрока.
Отлично!
Спасибо, пойду на основе змейки сокобан делать :D
на половине 3 видео все сбилось и я понял что буду заниматься фигней
#include
#include
#include
using namespace std;
bool gameOver;
const int width = 20;
const int height = 20;
int x, y, fruitX, fruitY, score;
int tailX[100], tailY[100];
int nTail;
enum eDirecton { STOP = 0, LEFT, RIGHT, UP, DOWN};
eDirecton dir;
void Setup()
{
gameOver = false;
dir = STOP;
x = width / 2;
y = height / 2;
fruitX = rand() % width;
fruitY = rand() % height;
score = 0;
}
void Draw()
{
system("cls"); //system("clear");
for (int i = 0; i < width+2; i++)
cout
спасибо))
Спасибо за видео! Уроки полезные! Хотелось бы курс по 3D игре на с++ (слышал, что на c++ игра Minecraft более производительная, чем Minecraft на Java).
Еще 2D не было, а тебе уже 3D подавай!
Эти школьники недоразработчики и понятия не имеют, насколько это сложно.
Да я уже понял... Нужно изучить типы рендеринга, OpenGL, наложения текстур, добавление 3D объектов и т. д.
OpenGl тебе в помощь... а на чистом C++ без знания высшей математики, а в частности матриц и матричных умножений, делать 3d игры, непонимая как это работает будет нереально сложно. ИМХО
ОТВЕТИТЬ
Уже почти выучил! Благодаря этому курсу - th-cam.com/video/aMHUfGLmv1E/w-d-xo.html
Круто
почему в 9:30 tailX[0] = x и аналогично и с у? и почему не завершается игра когда мы проверяем не попали ли мы головой по хвосту: for(int i = 0; ..){ if(tailX[i] == x ...) то gameover}
я посмотрел конечный результат и увидел мерцание, как я понял вы аросто перерисовывали все элементы, но лучше использовать виндовс апи, там можно менять конкретные символы, т.е. нам не надо все перерисовывать, а лишь 3: конец хвоста закрасить, перенести голову, и закрасить старую голову как тело
Расскажи поподробнее пожалуйста
Прикольно
Я на js делал змейку по книжке, использовав ООП и там я для каждого блока создавал объект (с координатами x, y) и добавлял в массив такие объекты, если игрок нажимал влево я добавлял объект влево если в перед то в перед ну и в право добавлял в право, только если игрок не съел яблоко я отнимал последний элемент, итого: змейка с многоцветной полноценной графикой, 200 строк кода, разделенных на легко читаемые блоки кода, без каких либо багов типа нажатия вперед и сразу назад (я сделал короткую проверку этого). Замечу что в c++ вы могли бы использовать вместо int, short - с вашими лагами это бы очень погло.
еще в 12 лет писал змейку. алгоритм прорисовки хвоста здесь ужасен. а насколько проще и Красивее не очищать экран, а в последнем звене хвоста рисовать пробел! задумайтесь) красиво, изящно, не мигает. на современных ресурсах компа люди совсем думать перестают (( но за видео лайк, отлично грамотно объясняет автор!
Привет, как называется эффект в играх, когда персонаж может быть одновременно с правой и с левой стороны экрана? Это когда персонаж доходит до правой стороны экрана и начинает вроде бы уходить за экран, но на самом деле выходит с левой стороны экрана. Меня интересует лишь общепринятое название, а не алгоритм.
я называю это "телепорт"😁
Абсолютно неэффективная обработка хвоста. Движение змейки, можно сделать просто стерев последний элемент, и добавив его вперед головы.
Каждый решает задачу по разному
да, можно штаны через голову надевать - выбор каждого
Ну если ты все делаешь по шаблону и не можешь сам решить задачу, а наверняка копи-пастишь исходники, то все очень плохо! Все не пиши мне, я все равно не отвечу!
ага, вот такая я не уникальная снежинка, не изобретаю велосипед с квадартными колесами и не ищу алгоритмов надевания штанов через голову. А наоборот, предпочитаю использовать уже накопленные человечеством знания в области. а про алгоритм с движением змеи даже искать ничего не надо, если хоть чуточку понимаешь что есть игра, что есть state pattern и владеешь базовой логикой ребенка 10 лет :) я столкнулся со змейкой я во время разработки AI для этой игры (:
Re Frost это если голова змеи и тело одинаковые символы.
Спасибо
// Готовый код
#include
#include
#include
#include
using namespace std;
bool gameOver;
const int width = 20;
const int height = 20;
int x, y, fruitX, fruitY;
int score;
int speed = 500;
char corm;
int tailX[100], tailY[100];
int nTail = 0;
enum eDirection {STOP = 0, LEFT, RIGHT, UP, DOWN};
eDirection dir;
void Setup();
void Draw();
void Input();
void Logic();
int main() {
system("color 07");
char menu;
cout > menu;
if (menu == 'Y' || menu == 'y') {
system("color 70");
Setup();
while (!gameOver) {
Draw();
Input();
Logic();
if (gameOver)
main();
}
}
else if (menu == 'N' || menu == 'n') {
system("cls");
cout
Наворотил чуши собачьей
Спасибо чувак, неплохой код.
Твое дерьмо даже не запускается ахах
круто))
топ
Уважаемый Гоша, эта рубрика весьма интересна, почему же вам её не продолжить. Когда-то ещё на синклере, практически в детстве пробовал писать. Но там был язык бейсик и производил обновление экрана также, через cls... В любом случае спасибо.
Как наложить текстуры на это всё дело?
Timohavol в консоли никак. Надо делать отдельное приложение
Погугли про SFML
Можно с помощью DirectX, но для такой простой змейки подойтет GLUT - th-cam.com/video/cEWNPLtBTAM/w-d-xo.html
Помогите пожалуйста, когда змейка забирает 3 фрукт, то с 4-го весь хвост растёт только в горизонтальном направлении
есть баг. Дело в том, что, когда выбираешь противоположную сторону, умираешь, так как x равно tailX
круто
При взятии второго и далее фруктов кусок хвоста сначала появляется в верхнем левом углу (9:48) а потом уже присоединяется к змейке. Довольно смутно понимаю как вообще этот хвост работает, можно ли от этого бага избавиться?
можно, если добавлять элементы по другому, просто переоносить хвость в голову
Классные видео снимаешь, но почему ты не сказал, что это перевод видоса NVitanovic? Код ведь идентичен, даже частей как у него 3.) А так, голос приятно слушать и изложено все четко.
Ну, у меня практически получилось, не считая того, что с левой стенкой, явно что-то не так
Ребят, а есть курс, как сделать хотя бы ту же змейку, но уже в окне, скажем как сапёр, где можно уровень сложности выбрать, чтобы была окошки: закрыть, свернуть, справка и т.д?
Зачем тебе еще один курс после этого, не все время же копипастить... SFML вот подсказочка, дерзай.
сам думай, прохрамест...
змейка себя не ест. игра продолжается.
надо чтобы фрукт прямо на хвост змейки не срандомило :D
А что делать, если после съедения первого "фрукта" появляется хвост, а после второго у змейки пропадает этот хвостик?
Кстати у меня также
зачем очищать всё поле, когда можно зачищать по координатам там где была змейка
КАК ОЧИЩАТЬ ПОЛЕ ПО КООРДИНАТАМ? НАПИШИ КОД
Я тоже об этом подумал, но код написать такой пока не смогу. Скинь пожалуйста, если сможешь написать.
Подскажите как работает логика пявления хвоста у змейки.
у меня почемуто rand() работает не коррекно. после сьедания фрукта новый не появляется. вначале я состался на то что рандомное значение выходит за пределы поля и добавил
fruitX = 3 + rand() % (width - 3);
fruitY = 3 + rand() % (height - 3);
что вы наверняка не вышло, но это не помогает
Я конечно не уверен, но в коде размещения еды для змеи может произойти такое, что еда появиться за границами и мы не сможем ее достать...
единственное. )) В коде всегда нужно комментить, что и для чего тот или иной цикл, функция, или переменная. Особенно полезно, когда разбираешься потом в этом коде.
Все классно только когда нажимаю на противоположную кнопку он выходит из игры , например у меня уже 4 "o" на хвосте еду вперед нажимаю на заднюю кнопку и выходит из игры. Нужно сделать так чтобы противоположная кнопка не работала.
хвост не отображается, но при касании об голову геймовер --> хвост есть. Что делать?
Вот код блока Draw:
void Draw() {
system("cls");
for (int i = 0; i < width + 1; i++) {
cout
Отличный урок, спасибо.
Единственное, что не так - после 3-го съеденного фрукта, если нажимаешь клавишу, противоположную направлению движения, игра завершается.
Так не должно быть
Несогласен с двумя моментами. Первое, как рисуется хвост. Легче было бы, если просто удалить последний элемент хвоста (массива) и добавить один элемент перед головой, а не передвигать всю змею. Второе, то что ты творишь с width и height. Зачем весь этот геморой с единицами, если можно было сделать всё нормально.
есть один бак, как его можно поправить. если нажать на кнопку противоположную от направления движения то игра прекратиться, то есть если змейка ползет вверх и нажать клавишу s и т.п.
Понимаю что поздно, но это не баг, по сути это и есть условие пройгрыша, змея пытается съесть свой хвост поэтому и умирает, если это же сделать без хвоста, то ничего не будет
пишите змейку сами. Какой смысл если вы просто подсмотрите решение или просто скопируете код?
вопрос такой, как запретить двигаться в сторону противоположную движению которое уже происходит. то есть если идет движение влево то запретить двигаться вправо и на оборот, также для вверх и вниз
Класс , только как я понял долго
большое спасибо!)
а как данный код написать на C++?
никак
Очень круто! А можно как то задать интервал изменения картинки? А то у меня змея летает как самолет, не успеваю уследить нормально за ней
добавь в самом начале библиотеку и в int main после Logic пропиши Sleep(300)
@@Irizzz886 спасибо)
@@Irizzz886 не работает кстати
У тебя поле 21*20, ты хоть в курсе??! Нельзя чтоли всё по человечески сделать, без всяких "+1" у width
А хотя смысл коммент писать, он всё равно их не читает
Тем лучше, значит у тебя по-другому будет, пусть учатся думать самостоятельно
можешь скинуть код? у меня с хвостом проблемы, просто хочу сравнить и найти ошибку. У меня когда 3 фрукт собираю, то 4-10 части тела не следуют идеально, а только горизонтально. тоесть первые 2 части змейки идут за головой, остальные горизонтальной полосой
Можно было через модуль сделать, без убогих условий, если выходит за границу значит от текущей координаты -10 в модуле, тогда если стенка справа,то 11- 10 =1, если слева, то 0 - 10 в модуле получаем 10, вот и все
Стало интересно, смогу ли я это на Delphi переписать...
Есть исходный код ?
Добрый день, она у меня носится как бешенная в чем причина, из за мощности компуктера?
почему фрукты появляются за пределами поля ?
Я не понимаю, почему эта игра написана на С++, ведь кроме функций и статических переменных, ничего больше нету. Если не брать во внимание подключенных библиотек, весь код это обычный С.
подскажите, как запустить код в отдельном консольном окне в clion ? у меня после выбора направления, допустим, w появляется бесчисленное количество игровых полей
объясните как хвост работает, 30 мин пытаюсь разобраться, хрень полная, там жк цикл и в нем все значения не известны
Скиньте этот полный код, если не сложно. Я сам переписал, но компилятор ругается. Хочу найти свою ошибку, а по видео не удобно. Спасибо заранее!
Помогите пожалуйста, как запустить код???
ctrl + f5
все работает но когда ем третий фрукт хвост не пристраивается сзади , а летает по карте.Подскажите что не так
У вас ошибка примерно на 90-й - 100-й строке кода, в функции логики. А именно в цикле for (int i = 1; i < nTail; i++) {
prev2X = tailX[i];
prev2Y = tailY[i];
tailX[i] = prevX;
tailY[i] = prevY;
//здесь у вас написано tailX[i] = prevY; а должно быть tailY[i] = prevY;
prevX = prev2X;
prevY = prev2Y;
}
извини что не совсем по теме, но у меня просьба, запиши видео "Как сделать личный кабинет для сайта" Отвечаю если запишешь такое видео то уж точно наберешь много просмотров, так как в интернете на эту тему я ни чего не нашел
админская панель.
змея после 3 фрукта у меня, теряет хвост и он бегает по экрану сам, это почему? т.е. ест первый, второй, третий и все бегает с таким хвостом, а остальной хвост на экране сам бегает)))
Интересно, как запустить сию игру на Linux, ведь там нет conio.
подскажите пожалуйста, досмотрел до 7.29 минуты и у меня пишет ошибку
[Error] incompatible types in assignment of 'int' to 'int [100]'
как быть?
на эти строчки ругается:
tailX = prevX;
tailY = prevY;
исправил
int tailX = prevX;
int tailY = prevY;
у меня почему то ругался непонятно, хотя мы эти переменные вначале еще объявили
Ntail можно просто заменить переменной score
Score/10
как насчет OpenGL или других графических библиотек
Гоша там в логике есть один маленький баг. Иногда фрукт отрисовывается так , что его не видно на поле. Как это исправить?
сделай что его координат не должен превышать width and height
опять также
если не трудно сам посмотри что можно сделать
#include
#include
#include
#include
using namespace std;
bool gameOver;
const int width = 20;
const int height = 20;
int x, y, fruit_x, fruit_y, score;
int tailX[100], tailY[100];
int nTail;
enum edirect { stop = 0, LEFT, RIGHT, up, down };
edirect dir;
void setup()
{
srand(100);
gameOver = false;
dir = stop;
x = width / 2-1;
y = height / 2-1;
fruit_x = rand() % width;
fruit_y = rand() % height;
score = 0;
}
void draw()
{
//i-koorfinata po y, j-koordinata po x.
system("cls");
for (int j = 1; j
if (x == fruit_x && y == fruit_y)
{
score += 1;
fruit_x = rand() % width;
fruit_y = rand() % height;//proverit koordinati zmeji i tolko potom otrisovat frukt
nTail++;
while(fruit_x >= width || fruit_y >= width || fruit_x < 0 || fruit_y < 0){
fruit_x = rand() % width;
fruit_y = rand() % height;
}
}
не работает
Может кто-нибудь подсказать? Я хотел сделать переключатель перед игрой между режимом, когда стена убивает, а когда позволяет пройти сквозь себя. Как это сделать?
выводишь сначала текст
где пишет
1 - такой режим
2 - такой режим
с помощью
_getch() узнаёшь на что нажали
а далее если нажали 1 то запускается первый код иначе второй
а ты этот код взял у автора канала NVitanovic с видео C++ Tutorial 18 - Simple Snake Game
Он просто перевёл то видео...
подскажите, как запустить visual studio 2017 на 32bit?
Доделал Змейку, она у меня двигайться быстро почему и как исправить?
Один из неприятных недостатков этого кода, то что когда змейка движется в напрвлении и нажимая клавишу обратного направления змейка получается сьедает свой хвост и игра заканчивается, а как это пофиксить?
я набрал макс 40. xDDDD
(попробуй эту дичь на вкус)
кто наберёт больше тот сверх гений + сверх глаз :
#include
#include
#include
#include
#include
#include
using namespace std;
bool GameOver;
string me = "0";
int width = 52;
int height = 20;
int INTsleep = 50;
int tailX[100], tailY[100];
int nTail;
int x, y, fruitX, fruitY, score;
enum eDirection { STOP = 0, LEFT, RIGHT, UP, DOWN };
eDirection dir;
void Setup() {
GameOver = false;
dir = STOP;
x = width / 2;
y = height / 2;
fruitX = rand() % width;
if (fruitX % 2 == 1)
fruitX--;
fruitY = rand() % height;
if (fruitY % 2 == 1)
fruitY--;
score = 0;
}
void Draw() {
system("cls");//system ("clear");
cout
Извините, что не по теме. Насколько необходима в программировании Булева алгебра?
А как скорость изменить? Очень уж хардкорно когда змейка быстро движется
в main после всего кода написать Sleep(200(*задержка в мс*))
там где координаты фрукта задаются в рандоме есть баг.
Это в main в начале надо написать srand(time(0)); написав в самом начале кода
#include
#include
Просто *
как сделать чтобы играло два игрока и меню игры с выбором типа игры и с таблицей рекордов
для двух игроков можно извернуться но лучше все переделать под ооп
Сколько весит?
Гоша, подскажи пожалуйста, что лучше изучать в добавок к С++ для создания графических приложений.
qt
Ami00 спасибо, но хотелось бы узнать можно ли с помощью openGL или SFML создавать приложения.
зависит от типа приложения, что ты хочешь создать. опенгл используют для рендеринга 3д графики. при чем это довольно-таки низкоуровневая либа, которая требует вменени на вникание в нее. в крупных проектах, обычно, на таком низком уровне делают выборочные куски, которые требуют оптимизации в плане производительности. реже пишут весь проект на опенгл (у нас на работе пишут CAD систему в том числе на opengl, к примеру). sfml - это библиотека для отрисовки 2д графики, написана на с++, но есть байндинги и на несколько других языков. с ее помощью часто делают 2д игры. делать там, к примеру, оконное приложение с юзер интерфейсом - так себе занятие. так же в sfml сузествует поддержка opengl, что значит, что ты можешь использовать OPENGL напрямую в окне sfml. ну а qt - он многоцелевой, там есть возможность довольно быстро делать гибкий UI (оконное приложение), есть возможность писать 2д и кажется 3д игры(про 3д кажись читал, но сам дела не имел). но я бы игру на qt игру писать не стал, разве что в учебных целях.
Ami00 спасибо большое)
а можно скорость змейки менять?
решил проблему со скоростью?