Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/55: Рейтинг темы: голосов - 55, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 01.05.2015
Сообщений: 13

Создание 2D-игры для C++ "Волк-яйцелов"

31.05.2015, 19:00. Показов 11701. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Насколько сложно на самом деле создать игру на C++. Скоро курсовая.... Тема курсовой "Волк-яйцелов". Возможно ли в короткие сроки на слабом уровне сделать эту игру? Дайте советы и помогите, чем можете.. Огромное спасибо.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.05.2015, 19:00
Ответы с готовыми решениями:

Игра Волк ловит яйца (Яйцелов, Ну погоди)
Нужно создать игру на пободии Волк ловит яйца. Яйцелов. Ну погоди. Может у кого-нибудь есть какие-нибудь исходники?

Графическая часть игры "Волк и Овцы"
Игра состоит из доски и 4 шашек одного(овцы) типа и 1 шашки второго типа(волк). Для шахматной доски нужно создать двух вымеренный массив...

Яйцелов на MIDletPascal
Тупит волк,плохо реагирует на команды. Как использовать парралельные потоки или сделать яйцам тамер? program NuPogodi; var...

13
 Аватар для _Valera_
495 / 377 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
31.05.2015, 19:09
http://www.sfml-dev.org/
Это для графики.

Игру сделать не сложно, а вот время затраченное на нее зависит от знания с++ и графических библиотек.

Цитата Сообщение от Zak_Zelman Посмотреть сообщение
Тема курсовой "Волк-яйцелов".
Эту сделать легко и быстро.
0
0 / 0 / 0
Регистрация: 01.05.2015
Сообщений: 13
31.05.2015, 19:16  [ТС]
Познания почти никакие.... А если быть честным с собой, то они отсутствуют. Но вот хочется, все равно что-то начать делать. Если вам не трудно, напишите с чего начать и вообще, т.н. порядок действий. Я в этом полный 0, а работу предоставить необходимо уже в скором времени.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
31.05.2015, 19:23
Как написать книгу на английском без знания английского? Вам в рифму ответить?)
0
 Аватар для _Valera_
495 / 377 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
31.05.2015, 19:25
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Как написать книгу на английском без знания английского?
Верно!

Цитата Сообщение от Zak_Zelman Посмотреть сообщение
а работу предоставить необходимо уже в скором времени.
Ну в Вашем случае похоже копипаст.
0
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
31.05.2015, 19:53
Цитата Сообщение от Zak_Zelman Посмотреть сообщение
Познания почти никакие.... А если быть честным с собой, то они отсутствуют. Но вот хочется, все равно что-то начать делать. Если вам не трудно, напишите с чего начать и вообще, т.н. порядок действий. Я в этом полный 0, а работу предоставить необходимо уже в скором времени.
Купить С.Прата "Язык программирования С++" , читать и делать примеры - желательно всё свободное время(если уж вы хотите сами её сделать). Скажем где-то на наследовании можно остановиться и начать делать курсовую.
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
31.05.2015, 19:58
Цитата Сообщение от Zak_Zelman Посмотреть сообщение
Насколько сложно на самом деле создать игру на C++
При наличии библиотеки способной подгружать BMP и блитить их одна в другую с прозрачностью фона - мелочи. Если под винду то такая либа есть в любой среде разработки, так же как и под большинство остальных ОС. Основная сложность в самих спрайтах (покадровых картинках движений волка и всего остального).
0
3 / 3 / 1
Регистрация: 24.05.2015
Сообщений: 67
31.05.2015, 22:47
Если время ОЧЕНЬ поджимает, единственный выход скачать готовые исходники и ХОТЯ БЫ разобраться в них.
0
1 / 1 / 0
Регистрация: 20.10.2009
Сообщений: 40
01.06.2015, 08:39
https://www.youtube.com/channe... FP0NlRHqBA За неделю научишься xD

Добавлено через 1 минуту
А сколько у тебя времени осталось?
0
518 / 410 / 188
Регистрация: 08.04.2013
Сообщений: 1,750
01.06.2015, 10:59
http://gameshaker.ucoz.ru/publ... 49-1-0-206 И кучу ссылок по SFML
0
 Аватар для idm
120 / 34 / 19
Регистрация: 19.03.2015
Сообщений: 90
01.06.2015, 18:24
Лучший ответ Сообщение было отмечено gru74ik как решение

Решение

Zak_Zelman,
В общем, в графических редакторах работать не умею, максимум кота в paint'е могу нарисовать(правда, кроме paint ничего и нет на тачках). Если нужна анимация покрасивее то это уже не ко мне, а что касается кода вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
#include <SFML/Graphics.hpp> // Подключение графики SFML
#include <time.h> // Время для rand
#include <sstream> // Поток для отображения очков
using namespace sf; // sf пространство для удобства
unsigned int EggRand(unsigned int &EggDir) // Принимаем адрес переменной сценария
    {
        EggDir = rand()%4; // Присваиваем рандом от 0 до 3
        return EggDir; // Возвращаем значение
    }
int main()
{
//-------------------Привязка ко времени -------------------------
    Clock clock; // Переменная времени
//----------------------Создание окна ----------------------------
    RenderWindow window(VideoMode(800, 600), "***Game For Zak Zelman***"); 
//----------------------Создание персонажа -----------------------
    Image stay2; // Создаем объект изображения
    stay2.loadFromFile("stay2.png"); // Подгружаем картинку
    stay2.createMaskFromColor(Color(255,255,255)); // Используем загрузку через Image только ради маски(убираем белый фон программно)
 
    Texture stay2t; // Создаем текстуру для персонажа
    stay2t.loadFromImage(stay2); // Подгружаем картинку в текстуру
 
    Sprite stay2s; // Создаем спрайт для персонажа
    stay2s.setTexture(stay2t); // Текстуру заливаем в спрайт
    stay2s.setTextureRect(IntRect(0,0,315,281)); // Вырезаем кадр из спрайта
    stay2s.setPosition(242.5,300); // Координаты куда рисуем
//----------------------Контроль состояния -----------------------
    int direction(0); // Будет принимать от 0 до 3 в зависимости от состояния
//------------------------Создание фона --------------------------
    Texture Background; // Создаем текстуру для фона
    Background.loadFromFile("Background2.png"); // Заливаем картинку сразу в текстуру
 
    Sprite Back; // Создаем спрайт для фона
    Back.setTexture(Background); // Заливаем текстуру в спрайт
//-------------------------Создание яйца -------------------------
    Image eggI; // Создаем объект изображения
    eggI.loadFromFile("Egg.png"); // Подгружаем картинку
    eggI.createMaskFromColor(Color(255,255,255)); // Используем загрузку через Image только ради маски(убираем белый фон программно)
 
    Texture eggT; // Создаем текстуру для яйца
    eggT.loadFromImage(eggI); // Подгружаем картинку в текстуру
 
    Sprite egg; // Создаем спрайт для яйца
    egg.setTexture(eggT); // Текстуру заливаем в спрайт
    egg.setTextureRect(IntRect(0,0,46,62)); // Вырезаем кадр из спрайта
    egg.setPosition(100,100); // Координаты куда рисуем
    egg.setOrigin(23,31); // Отсчет координа из центра для вращения
    double speed(0.1); // Скорость вращения яйца
//-------------------------Движение яйца -------------------------
        // Рассмотрим четыре сценария появления и движения яйца
    srand(time(NULL)); // Генерация псевдослучайных чисел
    unsigned int EggDir; // Переменная сценария (принимает значение от 0 до 3)
    EggDir = EggRand(EggDir); // Выбирается позиция яйца рандомно через функцию EggRand
    bool force = true; // Состояние яйца
    int tmp(0); // Храним итерацию для setPosition
    int count(0); // Считаем очки
    int lose(3); // Считаем жизни
//---------------------Вывод очков и жизни -----------------------
    Font font; // Создаем шрифт
    font.loadFromFile("CyrilicOld.ttf"); // Подгружаем наш шрифт
    Text CountText("", font, 20); // Создаем текст с путой строкой
    CountText.setColor(Color::Blue);// Задаем цвет
    CountText.setPosition(10,10);//задаем позицию текста, центр камеры
 
    Text life("", font, 20); // Создаем текст с путой строкой
    life.setColor(Color::Black);// Задаем цвет
    life.setPosition(700,10);//задаем позицию текста, центр камеры
//--------------------Основной цикл программы --------------------
    while (window.isOpen()) // Пока окно открыто
    {
        float time = clock.getElapsedTime().asMicroseconds(); // Ласт тайм в микросекундах
        clock.restart(); // Перезагружаем тайм
        time = time/800;
        Event event;
        while (window.pollEvent(event)) // Обработка события "закрытие окна"
        {
            if ((event.type == Event::Closed)||(Keyboard::isKeyPressed(Keyboard::Q)))
                window.close(); //  Закрываем окно если нажат крестик или Q
        }
//--Подблок в основном цикле программы - "Обработка объектов egg" --
        // В нашей игре яйца будут появляться последовательно,что разрешает отказаться от динамической памяти
        egg.rotate(speed*time); // Постоянно вращаем яйцо со скорость speed
        if(lose==0){window.close();} // Если жизни закончились выходим из игры
        if(force) // Если яйцо еще не разбилось или не было поймано
        {
            if(EggDir==0) // Яйцо катится слева сверху
            {
                    if(!tmp)egg.setPosition(0,153); // Если первая итерация то перемещаем яйцо в нужную позицию
                    egg.move(0.15*time,0); // Двигаем яйцо
                    tmp++; // Итерация уже не первая
                    if(egg.getPosition() .x >= 230) // Если палка по которой катиться яйцо закончилась
                        {
                        egg.move(0,0.15*time); // Двигаем яйцо вниз
                        if(egg.getPosition() .x >= 275)egg.move(-0.15*time,0); // Если выровнялись то балансируем наклонное движение
                        //Если яйцо в диапазоне корзины и волк стоит правильно яйцо поймали,яйцо переместили(false),итерацию обнулили,очки зачли
                        if((egg.getPosition() .y > 300)&&(direction==1)&&(egg.getPosition() .y < 320)){force = false;tmp=0;count++;} 
                        // Если яйцо упало,яйцо переместили,итерацию обнулили,жизнь вычли
                        if(egg.getPosition() .y >= 500){force = false;tmp=0;lose--;}
                        }
            }
            if(EggDir==1) // Яйцо катится справа сверху
            {
                    if(!tmp)egg.setPosition(800,153); // Если первая итерация то перемещаем яйцо в нужную позицию
                    egg.move(-0.15*time,0); // Двигаем яйцо
                    tmp++; // Итерация уже не первая
                    if(egg.getPosition() .x <= 530) // Если палка по которой катиться яйцо закончилась
                        { 
                        egg.move(0,0.15*time);  // Двигаем яйцо вниз
                        if(egg.getPosition() .x <= 520)egg.move(0.15*time,0); // Если выровнялись то балансируем наклонное движение
                        //Если яйцо в диапазоне корзины и волк стоит правильно яйцо поймали,яйцо переместили(false),итерацию обнулили,очки зачли
                        if(((egg.getPosition() .y > 300)&&(direction==0))&&(egg.getPosition() .y < 320)){force = false;tmp=0;count++;}
                        // Если яйцо упало,яйцо переместили,итерацию обнулили,жизнь вычли
                        if(egg.getPosition() .y >= 500){force = false;tmp=0;lose--;}
                        }
            }
            if(EggDir==2) // Яйцо катится слева снизу
            {
                    if(!tmp)egg.setPosition(0,353); // Если первая итерация то перемещаем яйцо в нужную позицию
                    egg.move(0.15*time,0); // Двигаем яйцо
                    tmp++; // Итерация уже не первая
                    if(egg.getPosition() .x >= 230) // Если палка по которой катиться яйцо закончилась
                        {
                        egg.move(0,0.15*time); // Двигаем яйцо вниз
                        if(egg.getPosition() .x >= 275)egg.move(-0.15*time,0); // Если выровнялись то балансируем наклонное движение
                        //Если яйцо в диапазоне корзины и волк стоит правильно яйцо поймали,яйцо переместили(false),итерацию обнулили,очки зачли
                        if((egg.getPosition() .y > 400)&&(direction==3)&&(egg.getPosition() .y < 420)){force = false;tmp=0;count++;}
                        // Если яйцо упало,яйцо переместили,итерацию обнулили,жизнь вычли
                        if(egg.getPosition() .y >= 500){force = false;tmp=0;lose--;}
                        }
            }
            if(EggDir==3) // Яйцо катится справа снизу
            {
                    if(!tmp)egg.setPosition(800,353); // Если первая итерация то перемещаем яйцо в нужную позицию
                    egg.move(-0.15*time,0); // Двигаем яйцо
                    tmp++; // Итерация уже не первая
                    if(egg.getPosition() .x <= 530) // Если палка по которой катиться яйцо закончилась
                        {
                        egg.move(0,0.15*time); // Двигаем яйцо вниз
                        if(egg.getPosition() .x <= 520)egg.move(0.15*time,0); // Если выровнялись то балансируем наклонное движение
                        //Если яйцо в диапазоне корзины и волк стоит правильно яйцо поймали,яйцо переместили(false),итерацию обнулили,очки зачли
                        if(((egg.getPosition() .y > 400)&&(direction==2))&&(egg.getPosition() .y < 420)){force = false;tmp=0;count++;}
                        // Если яйцо упало,яйцо переместили,итерацию обнулили,жизнь вычли
                        if(egg.getPosition() .y >= 500){force = false;tmp=0;lose--;}
                        }
            }
        }
        else // Если force=false, значит яйцо или поймано или разбилось, делаем снова true и перемещаем на новое направление
        {
            EggDir = EggRand(EggDir);// Вызываем функцию генерации случайного события для появления яйца
            force = true; // Яйцо "живое"
        }
//--------Подблок в основном цикле программы - "Управление" -------
        if (Keyboard::isKeyPressed(Keyboard::Right)) // Если жмем направо
        {
            if(direction==1){stay2s.setTextureRect(IntRect(0,0,315,281));direction=0;} // Если стояли и смотрели налево, меняем флаг состояния
            if(direction==3){stay2s.setTextureRect(IntRect(338,0,360,281));direction=2;} // Если сидели и смотрели налево, меняем флаг состояния
        }
        if (Keyboard::isKeyPressed(Keyboard::Left)) // Если жмем налево
        {
            if(direction==0){stay2s.setTextureRect(IntRect(0+315,0,-315,281));direction=1;} // Если стояли и смотрели направо, меняем флаг состояния
            if(direction==2){stay2s.setTextureRect(IntRect(338+360,0,-360,281));direction=3;} // Если сидели и смотрели направо, меняем флаг состояния
        }
        if (Keyboard::isKeyPressed(Keyboard::Up)) // Если жмем вверх
        {
            if(direction==2){stay2s.setTextureRect(IntRect(0,0,315,281));direction=0;} // Если сидели и смотрели направо, меняем флаг состояния
            if(direction==3){stay2s.setTextureRect(IntRect(0+315,0,-315,281));direction=1;} // Если сидели и смотрели налево, меняем флаг состояния
        }
        if (Keyboard::isKeyPressed(Keyboard::Down)) // Если жмем вниз
        {
            if(direction==0){stay2s.setTextureRect(IntRect(338,0,360,281));direction=2;} // Если стояли и смотрели направо, меняем флаг состояния 
            if(direction==1){stay2s.setTextureRect(IntRect(338+360,0,-360,281));direction=3;} // Если стояли и смотрели налево, меняем флаг состояния
        }
//--------Подблок в основном цикле программы - "Обновление" -------
        window.clear(); // Очищаем экран
        window.draw(Back); // Рисуем фон
        window.draw(stay2s); // Рисуем персонажа
        window.draw(egg); // Рисуем яйцо
//--------------------------Выводим текст--------------------------
        // Яйца
        std::ostringstream CountEgg;
        CountEgg << count; // В поток кидаем количество пойманых яиц
        CountText.setString("Собрано яиц: "+ CountEgg.str());// В потоке инт преобразуем в строку
        window.draw(CountText);// Рисуем текст
        // Жизни
        std::ostringstream CountLife;
        CountLife << lose; // В поток кидаем количество жизни
        life.setString("Жизни: "+ CountLife.str());// В потоке инт преобразуем в строку
        window.draw(life);// Рисуем текст
 
        window.display(); // Выводим на экран
    }
    return 0;
}
Не использовал ООП, динамическую память, функция и то одна, так что с понимание проблем быть не может. Материала по SFML сейчас достаточно много, освоите при желании, скрины и source прикрепляю.
Кликните здесь для просмотра всего текста

Если возникнет "Такс, мне дали рабочий код, как же скомпилировать эту фигню..." то:
Среда: Microsoft Visual Studio Ultimate 2012 (11.0) у меня лично x86 (винда х64 не смущает) стянул на {ссылка вырезана}
SFML для этой студии: тут
Подключать: так
Весь source положить в папку с проектом где main.cpp как на скрине №3
Во втором архиве полностью весь debug проект и двухсекундный ролик если найдутся любопытные и ленивые(хотя все это полная , так что качать не стоит).
Миниатюры
Создание 2D-игры для C++ "Волк-яйцелов"   Создание 2D-игры для C++ "Волк-яйцелов"   Создание 2D-игры для C++ "Волк-яйцелов"  

Вложения
Тип файла: rar source.rar (882.4 Кб, 207 просмотров)
Тип файла: rar Full Debug Project+Video.rar (9.05 Мб, 239 просмотров)
4
 Аватар для idm
120 / 34 / 19
Регистрация: 19.03.2015
Сообщений: 90
03.06.2015, 12:54
Цитата Сообщение от Zak_Zelman Посмотреть сообщение
работу предоставить необходимо уже в скором времени
Zak_Zelman, Последняя активность: 31.05.2015 22:19
Сказали бы что не срочно, я бы и не торопился.
1
0 / 0 / 0
Регистрация: 01.05.2015
Сообщений: 13
15.02.2016, 08:52  [ТС]
Большое спасибо, что сделали это. Мне очень пригодится в дальнейшем.
0
0 / 0 / 0
Регистрация: 05.12.2021
Сообщений: 2
12.12.2021, 15:43
а как сделать так чтобы яица и бомбы падали с задержкой?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.12.2021, 15:43
Помогаю со студенческими работами здесь

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

Создание игры для детей
Здравствуйте обитатели форума. Теперь к делу. Есть у меня весь графический материал для игры, а именно картинки: естественно они все...

Создание логотипа для игры
Здравствуйте все, с прошедшими! Подскажите в каком формате и каких размеров должен создаватса логотип для игры? В данном случае фотошоп5

Создание мультиплеера для игры
Привет, программисты! :) Хотел бы узнать, что нужно изучать, чтобы написать мультиплеер к игре GTA San Andreas? Боюсь, что пойду не по...

Создание лаунчера для игры
В общем от нечего делать решил я сделать (попытаться) лаунчер для любимой игры. Пытаюсь сделать это чудо я через VS2010E. (не бейте...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru