Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/441: Рейтинг темы: голосов - 441, средняя оценка - 4.52
4 / 4 / 2
Регистрация: 19.08.2013
Сообщений: 26

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

24.08.2013, 22:18. Показов 91461. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Учу С++ потихоньку, дошёл до структур даннах, классов. Писал пока что консольные приложения. Возникла идея написать простенькую 2d игру, например, змейку/крестики-нолики/тетрис.
Подкажите в какую сторону копать. Нужно ли Qt или OpenGL или можно пока без них обойтись? Можно ли в привычном Code::Blocks сделать или проще в Borland Builder? Что почитать по этой теме?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.08.2013, 22:18
Ответы с готовыми решениями:

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

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

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

16
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
24.08.2013, 22:20
Можешь написать змейку в консоли. Потом (в будущем) сделай для нее графический интерфейс.
1
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
24.08.2013, 22:25
можно использовать библиотеку SDL
напишите игру "Жизнь" - клеточный автомат, просто и интересно

Добавлено через 1 минуту
Естестевенно на Qt делается всё не сложно. Но это уже C++ + ещё что-то, в отличии от других библиотек.
1
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
24.08.2013, 23:07
Консольная змейка
1
4 / 4 / 2
Регистрация: 19.08.2013
Сообщений: 26
24.08.2013, 23:19  [ТС]
Цитата Сообщение от VLK Посмотреть сообщение
прикольно
0
 Аватар для Hugra
50 / 50 / 9
Регистрация: 18.07.2013
Сообщений: 138
Записей в блоге: 1
25.08.2013, 00:09
Цитата Сообщение от VLK Посмотреть сообщение
Отличное поле для изучения.
0
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
25.08.2013, 00:14
Цитата Сообщение от Wollen Посмотреть сообщение
прикольно
тока если вы будете изучать написание змейки по этому коду, к вашим ошибкам добавятся ещё и ошибки этого товарища.
Первое впечатление о коде "любопытно, но это не C++"
2
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
25.08.2013, 00:31
Ни разу не C++, автор кода на момент его написания не проникся стилем программирования на C++, а, вероятно, использовал прошлый опыт Turbo Pascal или C.
Довольно просто и интересно новичку будет сделать игры вроде пакмана, арканоида, также сюда можно отнести разные платформеры.
0
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
25.08.2013, 01:05
Решать задачу идеально совсем не нужно, хватит для начала очень примитивной программы. Это учебный пример, и нужно учиться именно на учебных проектах.
Любая среда. пишите игру, которая умеет только самое главное(то что в правилах). Интерфейс игры продумывать не надо, главное чтоб работали основные функции.
потом смело удаляете проект. и идёте изучать вопросы, которые у вас возникали в процессе написания. готовитесь к след. учебную проекту.
0
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
25.08.2013, 11:51
Цитата Сообщение от XRuZzz Посмотреть сообщение
тока если вы будете изучать написание змейки по этому коду, к вашим ошибкам добавятся ещё и ошибки этого товарища.
Первое впечатление о коде "любопытно, но это не C++"
Не надо путать ТС, если вы знаете все библиотеки и всё умеете, это не значит что он умеет все тоже самое, просто на него зашло затмение и он не знает что ему дальше делать.

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

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

Сделает свою змейку, потом сравнит с тем кодом, найдет свои слабые места, найдет слабые места той программы, одна польза короче.
0
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
25.08.2013, 12:33
видеолекции на которые я давал ссылку буду куда полезнее Для того чтобы выучить С++ по книге Бьёрна Страуструпа
и вам и ему. Там написание такой простой игры начинается после того как студенты уже освоили работу с классами.
хорошо бы дать ещё ссылку на какую нибудь книгу по математике, но такой универсальной книги для новичков-программистов не встречал.

Добавлено через 2 минуты
про сети я ничего не говорил, но возможно Таненбаума почитать будет полезно.
1
 Аватар для Hugra
50 / 50 / 9
Регистрация: 18.07.2013
Сообщений: 138
Записей в блоге: 1
25.08.2013, 12:41
Цитата Сообщение от XRuZzz Посмотреть сообщение
видеолекции на которые я давал ссылку буду куда полезнее Для того чтобы выучить С++ по книге Бьёрна Страуструпа
и вам и ему. Там написание такой простой игры начинается после того как студенты уже освоили работу с классами.
хорошо бы дать ещё ссылку на какую нибудь книгу по математике, но такой универсальной книги для новичков-программистов не встречал.

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

Не по теме:

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

0
25.08.2013, 13:47

Не по теме:

Цитата Сообщение от Hugra Посмотреть сообщение
Не по теме:
Это твои курсы чтоли? В каждой теме, где есть ты, есть данная ссылка.
да чего то я уже переборщил, ну реально полезно, не самому же всё это пересказывать в каждой теме

0
4 / 4 / 2
Регистрация: 19.08.2013
Сообщений: 26
27.08.2013, 20:49  [ТС]
Написал свою змейку. Буду благодарен, если укажете ошибки. Наверняка упустил что-то важное
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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
#include <iostream>
#include <windows.h>
#include <time.h>
#include <conio.h>
using namespace std;
 
bool stop=0;
bool lite=1;
bool food=0;
bool boostspeed=1;
int speed=2; //1-slow, 2-normal, 3-fast
int framecount=0;
int food_x,food_y;
const int m=10,n=20;
char field[m][n];
 
class Snake{
    public:
    struct Part{
        int x,y;
        Part* next;
    };
    Part*body,*tale;
    int x,y,vx,vy,size,speed;
    void MoveSnake();
    void AddPart();
    void RemovePart();
    void DeleteBody();
} snake;
void StartMenu();
void Init();
void KeySwitch();
void GameOver();
void GenerateFood();
void GenerateField();
void DrawField();
 
int main(){
    StartMenu();
    while(!stop){
        for(int i=0;i<2;++i){
            if(kbhit()==true)
                KeySwitch();
            Sleep(100/snake.speed);
        }
 
        GenerateField();
        DrawField();
    }
}
 
void Snake::MoveSnake(){
    Part* bodycheck=body;
    while(bodycheck){
        if(bodycheck->x==snake.x&&bodycheck->y==snake.y){
            GameOver();
            break;
        }
        bodycheck=bodycheck->next;
    }    //check collision
    if(!lite&&(snake.x==0 || snake.x==n-1 || snake.y==0 || snake.y==m-1)){
        GameOver();
    }    //hard mode
    else{
        if(snake.x==0 || snake.x==n-1){
            snake.vx=snake.x==0? -1 : 1;
            snake.vy=0;
            snake.x=n-1-snake.x;
        }
        if(snake.y==0 || snake.y==m-1){
            snake.vy=snake.y==0? -1 : 1;
            snake.vx=0;
            snake.y=m-1-snake.y;
        }
    }    //lite mode
    if(snake.x==food_x&&snake.y==food_y){
        food=0;
        ++snake.size;
        AddPart();
        if(boostspeed)
            ++snake.speed;
    }
    else if(body){
        AddPart();
        RemovePart();
    }
    snake.x+=snake.vx;
    snake.y+=snake.vy;
}
void Snake::AddPart(){
    Part* NewPart = new Part;
    if(!body){
        body=NewPart;
        tale=NewPart;
    }
    else{
        tale->next=NewPart;
        tale=NewPart;
    }
    NewPart->next=0;
    NewPart->x=snake.x;
    NewPart->y=snake.y;
}
void Snake::RemovePart(){
    Part* Item=body;
    body=Item->next;
    delete Item;
}
void Snake::DeleteBody(){
    Part* del = body;
    while(del){
        body=del->next;
        delete del;
        del=body;
    }
}
void Init(){
    snake.x=1;
    snake.y=1;
    snake.vx=1;
    snake.vy=0;
    snake.size=0;
    snake.body=0;
    snake.tale=0;
    snake.speed=speed;
    GenerateField();
}
void StartMenu(){
    cout<<"Lite mode? Press 1.\nHard mode? Press 2.\nEsc for exit";
    char c=0;
    while(c!=27){
        c=_getch();
        switch(c){
            case '1':
                lite=1;
                c=27;
                break;
            case '2':
                lite=0;
                c=27;
                break;
            case 27: //ESC
                stop=1;
                break;
        }
    }
    Init();
}
void GameOver(){
    snake.DeleteBody();
    system("cls");
    cout<<"Your score is "<<snake.size<<"\n Again?\n";
    StartMenu();
}
void KeySwitch(){
    char c =_getch();
    switch(c){
        case 27: stop=1; snake.DeleteBody(); break; //ESC
        case 72: if(snake.vx) {snake.vx=0; snake.vy=-1;} break; //up
        case 80: if(snake.vx) {snake.vx=0; snake.vy=1;} break; //down
        case 75: if(snake.vy) {snake.vx=-1; snake.vy=0;} break; //left
        case 77: if(snake.vy) {snake.vx=1; snake.vy=0;} break; //right
        default: break;
    }
}
void GenerateFood(){
    bool error=1;
    while(error){
        srand(time(NULL));
        food_x=1+rand()%(n-1);
        food_y=1+rand()%(m-1);
        if(field[food_y][food_x]==' ') {
            error=0;
        }
    }
    food=1;
}
void GenerateField(){
    snake.MoveSnake();
    for(int i=0;i<m;++i){
        for(int j=0;j<n;++j){
            if(i==0 || i==m-1 || j==0 || j==n-1){
                field[i][j]='*';
            }
            else if(i==snake.y && j==snake.x){
                field[i][j]='@';
            }
            else{
                field[i][j]=' ';
            }
            if(food)
                field[food_y][food_x]='$';
        }
    }
    Snake::Part* bodycheck=snake.body;
    while(bodycheck){
        field[bodycheck->y][bodycheck->x]='#';
        bodycheck=bodycheck->next;
    }
    if(!food){
        GenerateFood();
    }
}
void DrawField(){
    system("cls");
    for(int i=0;i<m;++i){
        for(int j=0;j<n;++j){
            cout<<field[i][j];
        }
        cout<<"\n";
    }
}
А всё-таки как для неё написать графический интерфейс? Поидее вот вместо этой функции вывода на экран надо сделать, чтобы каждый из символов заменялся на картинку.
C++
1
2
3
4
5
6
7
8
9
void DrawField(){
    system("cls");
    for(int i=0;i<m;++i){
        for(int j=0;j<n;++j){
            cout<<field[i][j];
        }
        cout<<"\n";
    }
}
Чтобы вот что-то такое получилось, что обычно используют?
Миниатюры
Примитивная игра на c++  
1
 Аватар для Hugra
50 / 50 / 9
Регистрация: 18.07.2013
Сообщений: 138
Записей в блоге: 1
27.08.2013, 20:53
Цитата Сообщение от Wollen Посмотреть сообщение
А всё-таки как для неё написать графический интерфейс?
OpenGL
0
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
28.08.2013, 16:24
вот как раз в видеолекциях на которую я давал ссылку, говорилось про вынесение классов в отдельные файлы. Сейчас это может быть не критично, но вы уже спрашиваете про графический интерфейс, а это сильно увеличит количество кода, и без модульности исходник невозможно поддерживать.

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

В идеале нужно писать абстрактные классы, которые позволят используя один интерфейс, запускать змейку и на OpenGL и на SDL возможно даже на Qt.
1
19 / 19 / 16
Регистрация: 17.08.2015
Сообщений: 125
13.01.2017, 12:14
Хорошо рассказано здесь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.01.2017, 12:14
Помогаю со студенческими работами здесь

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

примитивная рекурсия
Привет! Задача: какая ф-я получается из ф-й g(x)=0 и h(x,y,z)=|z-x| с помощью примитивной рекурсии ? Моё решение: f(x,0) = g(x)...

Примитивная рекурсивность
Помогите, пожалуйста показать примитивную рекурсивность функции f(x,y) f(x,y)= фигурная скобка | 0,у меньше x, 1,y больше или...

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

Примитивная Нейросеть
Чую, что вопрос не для этой ветки, но так как в нейросетях совсем начинающий так что сюда, если что администраторы переложите. Доброго...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru