Как сделать игру на c

[OpenGL С++] Пишем змейку на C++

Всем привет! Что-то последнее время много уроков по конструкторам игр, и не так много по различным языкам программирования. Что бы устранить эту не справедливость, я решил запилить урок по OpenGL C++, надеюсь вы оцените)

Сразу же перейдем к геймдеву и будем писать маленькую игрульку нашего детства.

Для начала подключаем библиотеку OpenGL к своей среде разработки, я лично программирую в Microsoft Visual Studio 2013.

200?’200px’:”+(this.scrollHeight+5)+’px’);”>
#include “stdafx.h”
#include
#include
#include
#include // подключаем все необходимые инклюды.

int N = 30, M = 20; // т.к. змейка будем ездить по квадратикам, создадим их, для нашего окна в идеале будет 30×20 квадратов
int scale = 25; // размер квадрата. Когда OpenGL будет расчерчивать поле для игры, расстояние между гранями квадрата будет 25 пикселей

int w = scale*N; // ширина поля
int h = scale*M; // его высота

int dir, num = 4; // 4 направления и начальный размер змеи.
struct < int x; int y; >s[100]; // структура змеи, X и Y координаты, массив с длинной.

class fruct // класс фруктов, тех самых, которые будет есть наша змея
<
public:
int x, y; //координаты фруктов, что и где будет находится

void New() // паблик с новыми фруктами. Он будет вызываться в начале игры и в тот момент, когда змея съест один из фруктов
<
x = rand() % N; // вычисление X координаты через рандом
y = rand() % M; // вычисление Y координаты через рандом
>

void DrawFruct() // паблик, отрисовывающий фрукты
<
glColor3f(0.0, 1.0, 1.0); // цвет фруктов. в openGL он задается от 0 до 1, а не от 0 до 256, как многие привыкли
glRectf(x*scale, y*scale, (x + 1)*scale, (y + 1)*scale); // “Закрашиваем” квадрат выбранным цветом, таким образом в нем “появляется” фрукт
>
> m[5]; // масив с фруктами, таким образом, у нас появится одновременно 5 фруктов в разных местах, а не один, как мы привыкли

void Draw() // функция, которая отрисовывает линии
<
glColor3f(1.0, 0.0, 0.0); // цвет наших линий, в данном слуае – красный
glBegin(GL_LINES); // начинаем рисовать и указываем, что это линии
for (int i = 0; i 0; –i) // движение змеи. Система остроумна и проста : блок перемешается вперед, а остальные X блоков, на X+1( 2 блок встанет на место 1, 3 на место 2 и т.д. )
<
s[i].x = s[i – 1].x; // задаем Х координату i блока координатой i – 1
s[i].y = s[i – 1].y; // то же самое делаем и с Y координатой
>
// далее у нас система направлений.
if (dir == 0) s[0].y += 1; // если направление равно 0, то первый фрагмент массива перемещается на один по Y
if (dir == 1) s[0].x -= 1; // если направление равно 1, то первый фрагмент массива перемещается на минус один по X
if (dir == 2) s[0].x += 1; // аналогиная система
if (dir == 3) s[0].y -= 1; // аналогичная система

Читать еще:  Какой маникюр можно сделать на море

for (int i = 0; i N) dir = 1; // Ей обратное направление. Например, если она выйдет за экран по высоте, то задаем ей направление, при котором она ползет
if (s[0].y > M) dir = 3; // вниз
if (s[0].x Порядок вывода комментариев:

Примитивная игра на c++

Примитивная графика си++
Доброго времени суток, ребят. Задали программу написать Задание: Разработать подпрограмму.

Примитивная 3D-визуализация
Всем привет. Возникла довольно простая задача: необходимо визуализировать в трехмерном виде.

Примитивная графика (Dev-C++)
Здравствуйте. Есть консольная "Жизнь", хотелось бы сделать для неё хоть какую-нибудь графику. Думал.

Примитивная лаба по классам. Уже написана. Не компилится
Здравствуйте! Прога выдает ошибку. Делал по примеру друга. Прога аналогичная. Оба кода прилагаю.

Примитивная игра червячок
Нужно написать программу под тип игры ЧЕРВЯЧОК в PascalABC (модули graph и crt), просто примитивная.

можно использовать библиотеку SDL
напишите игру “Жизнь” – клеточный автомат, просто и интересно

Добавлено через 1 минуту
Естестевенно на Qt делается всё не сложно. Но это уже C++ + ещё что-то, в отличии от других библиотек.

Не надо путать ТС, если вы знаете все библиотеки и всё умеете, это не значит что он умеет все тоже самое, просто на него зашло затмение и он не знает что ему дальше делать.

Из первого сообщения ясно, что он не то, что не знает какие библиотеки, он даже не знает где писать ее и как это вообще выглядит, а вы ему предлагаете змейку по сети, больные что ли? Вы еще ему предложите написать свою игру по аналогии с World of Warcraft.

Из моего примера он хотя бы узнает какие библиотеки использовать (т.е. ответ на свой вопрос – в какую сторону рыть), а по поводу кода, я ему не предлагал, да и сомневаюсь что он сам имеет цель переписать этот код и гордится этим.

Сделает свою змейку, потом сравнит с тем кодом, найдет свои слабые места, найдет слабые места той программы, одна польза короче.

видеолекции на которые я давал ссылку буду куда полезнее Для того чтобы выучить С++ по книге Бьёрна Страуструпа
и вам и ему. Там написание такой простой игры начинается после того как студенты уже освоили работу с классами.
хорошо бы дать ещё ссылку на какую нибудь книгу по математике, но такой универсальной книги для новичков-программистов не встречал.

Читать еще:  Как сделать игру монополия

Добавлено через 2 минуты
про сети я ничего не говорил, но возможно Таненбаума почитать будет полезно.

видеолекции на которые я давал ссылку буду куда полезнее Для того чтобы выучить С++ по книге Бьёрна Страуструпа
и вам и ему. Там написание такой простой игры начинается после того как студенты уже освоили работу с классами.
хорошо бы дать ещё ссылку на какую нибудь книгу по математике, но такой универсальной книги для новичков-программистов не встречал.

Добавлено через 2 минуты
про сети я ничего не говорил, но возможно Таненбаума почитать будет полезно.

Это твои курсы чтоли? В каждой теме, где есть ты, есть данная ссылка.

вот как раз в видеолекциях на которую я давал ссылку, говорилось про вынесение классов в отдельные файлы. Сейчас это может быть не критично, но вы уже спрашиваете про графический интерфейс, а это сильно увеличит количество кода, и без модульности исходник невозможно поддерживать.

Фаулер советует писать в начале тест для класса, а потом реализацию класса, то есть это некий отдельный файл с классом типа TestSnakes, в котором находятся методы для тестирования методов Snakes. Именно написание тестов уводит вас от большого количества ошибок при написании кода, интерфейсы становятся более гибкими. Их изучают в конце курсов C++. Но лучше знать о их существовании, чем не знать.

В идеале нужно писать абстрактные классы, которые позволят используя один интерфейс, запускать змейку и на OpenGL и на SDL возможно даже на Qt.

Примитивная игра “змейка”
Появилась необходимость написать примитивную игру в текстовом режиме. В процессе разработки.

Графика (примитивная)
Нужно создать 3 класа 1Наследие JPanel с изображением(примитивным) печатного издания 2Наследие.

Примитивная рекурсия
Помогите пожалуйста,не могу понять закономерность ,из которой следует функция F(x,y)? Спасибо.

Создание игры «Жизнь» на C++

Место действия игры — «вселенная» — размеченная на клетки ограниченная плоскость. Каждая клетка на этой плоскости может быть «живой» или «мертвой» (пустой). У клетки есть 8 соседей — окружающие ее клетки.

Правила игры

Первое поколение — это положение игровых клеток в начале игры. Будем заполнять его случайным образом. Каждое новое поколение рассчитывается на основе предыдущего по таким правилам:

  • В пустой клетке, рядом с которой ровно три живые клетки, зарождается жизнь.
  • Если у живой клетки есть две или три живые соседки, то эта клетки продолжает жить. Иначе, клетка умирает (от «одиночества» или «перенаселенности»).

Игра прекращается, если на поле не останется ни одной живой клетки или при очередном шаге ни одна клетка не меняет своего состояния (складывается стабильная конфигурация).

Читать еще:  Как правильно сделать подсыпку под фундамент

Игровое поле

Игровое поле будет храниться в двумерном массиве побитовых структур. Количество строк которого — высота поля, а столбцов — его ширина.

Первое поколение игры будет генерироваться случайным образом. Для этого воспользуемся библиотекой из C++ 11.

После формирования первого поколения начнется игровой цикл, который завершится, когда все клетки умрут, либо будет найдена оптимальная конфигурация (одинаковое состояние клеток на текущем и предыдущем шаге).

Клетки-соседи

Подсчетом количества живых клеток будет заниматься функция get_live_count .

Для каждого шага цикла нужно сгенерировать новое поколение, в соответствии с правилами игры. Напишем функцию, которая будет определять координаты соседей клетки.

Функция read_point_neighbors принимает указатель на двумерный массив (для записи результата) и координаты x , y точки, для которой ищем соседей.

Необходимо знать количество живых соседей клетки. Для этого напишем функцию get_live_neighbors .

Функция принимает ссылку на массив игрового поля и координаты x, y клетки.

Смена поколения

Теперь мы можем быстро получить все данные, нужные для того, чтобы построить следующее поколение клеток. Напишем функцию next_generation для формирование нового поколения:

Еще одно условие для завершения игры — когда у двух поколений, идущих друг за другом, идентичное состояние клеток. Для сравнения двух поколений создадим две функции — copy_world и cmp_world . Первая будет копировать состояние игрового поля во временный массив перед генерацией следующего поколения. Вторая будет сравнивать расположение клеток на двух игровых полях.

Функция print_world будет выводить на экран состояние игрового поля для каждого нового поколения.

Игровой цикл

Определим функцию main , которая будет запускать игровой процесс.

Компиляция

Для компиляции проекта нужна поддержка C++ 11. В GCC 4.7 такая поддержка включается так:

Для включения поддержки C++ 11 в Dev C++, зайдите в меню «Tools → Compiler Options → (выберите ваш компилятор) → Settings → Code Generation». Установите значение опции «Language standard» на C++11.

В Visual Studio 2010 есть частичная поддержка C++ 11. По крайней мере, должен быть.

Пример работы игры размером 20 × 20 клеток:

Внимательный читатель мог заметить, что в правилах игры присутствует «периодическая конфигурация» — когда текущее состояние игры повторяет любое предыдущее состояние на всех шагах.

В этом примере мы не стали писать такой функционал, потому что при большом количестве итераций может понадобиться много места для хранения истории. Но при желании, вы можете реализовать эту фишку и поделиться ей с другими читателями в комментариях.

Источники:

http://gcup.ru/publ/gamedev/opengl_s_pishem_zmejku_na_c/1-1-0-562

http://www.cyberforum.ru/cpp-beginners/thread943190.html

http://code-live.ru/post/cpp-life-game/

Ссылка на основную публикацию
Статьи на тему: