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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Не по теме:

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

0
XRuZzz
25.08.2013, 13:47
  #13

Не по теме:

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

0
4 / 4 / 2
Регистрация: 19.08.2013
Сообщений: 26
27.08.2013, 20:49  [ТС] 14
Написал свою змейку. Буду благодарен, если укажете ошибки. Наверняка упустил что-то важное
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
50 / 50 / 9
Регистрация: 18.07.2013
Сообщений: 138
Записей в блоге: 1
27.08.2013, 20:53 15
Цитата Сообщение от Wollen Посмотреть сообщение
А всё-таки как для неё написать графический интерфейс?
OpenGL
0
Антикодер
1804 / 869 / 48
Регистрация: 15.09.2012
Сообщений: 3,081
28.08.2013, 16:24 16
вот как раз в видеолекциях на которую я давал ссылку, говорилось про вынесение классов в отдельные файлы. Сейчас это может быть не критично, но вы уже спрашиваете про графический интерфейс, а это сильно увеличит количество кода, и без модульности исходник невозможно поддерживать.

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

В идеале нужно писать абстрактные классы, которые позволят используя один интерфейс, запускать змейку и на OpenGL и на SDL возможно даже на Qt.
1
18 / 18 / 16
Регистрация: 17.08.2015
Сообщений: 125
13.01.2017, 12:14 17
Хорошо рассказано здесь
0
13.01.2017, 12:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.01.2017, 12:14
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru