Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 130, средняя оценка - 4.85
Wollen
3 / 3 / 1
Регистрация: 19.08.2013
Сообщений: 26
24.08.2013, 22:18     Примитивная игра на c++ #1
Учу С++ потихоньку, дошёл до структур даннах, классов. Писал пока что консольные приложения. Возникла идея написать простенькую 2d игру, например, змейку/крестики-нолики/тетрис.
Подкажите в какую сторону копать. Нужно ли Qt или OpenGL или можно пока без них обойтись? Можно ли в привычном Code::Blocks сделать или проще в Borland Builder? Что почитать по этой теме?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2013, 22:18     Примитивная игра на c++
Посмотрите здесь:

C++ Игра
C++ Игра на C++
Примитивная графика (Dev-C++) C++
C++ Примитивная графика си++
C++ Игра слов, игра Scrabble
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
24.08.2013, 22:20     Примитивная игра на c++ #2
Можешь написать змейку в консоли. Потом (в будущем) сделай для нее графический интерфейс.
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
24.08.2013, 22:25     Примитивная игра на c++ #3
можно использовать библиотеку SDL
напишите игру "Жизнь" - клеточный автомат, просто и интересно

Добавлено через 1 минуту
Естестевенно на Qt делается всё не сложно. Но это уже C++ + ещё что-то, в отличии от других библиотек.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
24.08.2013, 23:07     Примитивная игра на c++ #4
Консольная змейка
Wollen
3 / 3 / 1
Регистрация: 19.08.2013
Сообщений: 26
24.08.2013, 23:19  [ТС]     Примитивная игра на c++ #5
Цитата Сообщение от VLK Посмотреть сообщение
прикольно
Hugra
 Аватар для Hugra
47 / 47 / 1
Регистрация: 18.07.2013
Сообщений: 138
Записей в блоге: 1
25.08.2013, 00:09     Примитивная игра на c++ #6
Цитата Сообщение от VLK Посмотреть сообщение
Отличное поле для изучения.
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
25.08.2013, 00:14     Примитивная игра на c++ #7
Цитата Сообщение от Wollen Посмотреть сообщение
прикольно
тока если вы будете изучать написание змейки по этому коду, к вашим ошибкам добавятся ещё и ошибки этого товарища.
Первое впечатление о коде "любопытно, но это не C++"
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
25.08.2013, 00:31     Примитивная игра на c++ #8
Ни разу не C++, автор кода на момент его написания не проникся стилем программирования на C++, а, вероятно, использовал прошлый опыт Turbo Pascal или C.
Довольно просто и интересно новичку будет сделать игры вроде пакмана, арканоида, также сюда можно отнести разные платформеры.
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
25.08.2013, 01:05     Примитивная игра на c++ #9
Решать задачу идеально совсем не нужно, хватит для начала очень примитивной программы. Это учебный пример, и нужно учиться именно на учебных проектах.
Любая среда. пишите игру, которая умеет только самое главное(то что в правилах). Интерфейс игры продумывать не надо, главное чтоб работали основные функции.
потом смело удаляете проект. и идёте изучать вопросы, которые у вас возникали в процессе написания. готовитесь к след. учебную проекту.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
25.08.2013, 11:51     Примитивная игра на c++ #10
Цитата Сообщение от XRuZzz Посмотреть сообщение
тока если вы будете изучать написание змейки по этому коду, к вашим ошибкам добавятся ещё и ошибки этого товарища.
Первое впечатление о коде "любопытно, но это не C++"
Не надо путать ТС, если вы знаете все библиотеки и всё умеете, это не значит что он умеет все тоже самое, просто на него зашло затмение и он не знает что ему дальше делать.

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

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

Сделает свою змейку, потом сравнит с тем кодом, найдет свои слабые места, найдет слабые места той программы, одна польза короче.
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
25.08.2013, 12:33     Примитивная игра на c++ #11
видеолекции на которые я давал ссылку буду куда полезнее Для того чтобы выучить С++ по книге Бьёрна Страуструпа
и вам и ему. Там написание такой простой игры начинается после того как студенты уже освоили работу с классами.
хорошо бы дать ещё ссылку на какую нибудь книгу по математике, но такой универсальной книги для новичков-программистов не встречал.

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

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

Не по теме:

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

XRuZzz
25.08.2013, 13:47
  #13

Не по теме:

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

Wollen
3 / 3 / 1
Регистрация: 19.08.2013
Сообщений: 26
27.08.2013, 20:49  [ТС]     Примитивная игра на c++ #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++  
Hugra
 Аватар для Hugra
47 / 47 / 1
Регистрация: 18.07.2013
Сообщений: 138
Записей в блоге: 1
27.08.2013, 20:53     Примитивная игра на c++ #15
Цитата Сообщение от Wollen Посмотреть сообщение
А всё-таки как для неё написать графический интерфейс?
OpenGL
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2013, 16:24     Примитивная игра на c++
Еще ссылки по теме:

Примитивная лаба по классам. Уже написана. Не компилится C++
C++ Примитивная 3D-визуализация
C++ Игра

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

Или воспользуйтесь поиском по форуму:
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
28.08.2013, 16:24     Примитивная игра на c++ #16
вот как раз в видеолекциях на которую я давал ссылку, говорилось про вынесение классов в отдельные файлы. Сейчас это может быть не критично, но вы уже спрашиваете про графический интерфейс, а это сильно увеличит количество кода, и без модульности исходник невозможно поддерживать.

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

В идеале нужно писать абстрактные классы, которые позволят используя один интерфейс, запускать змейку и на OpenGL и на SDL возможно даже на Qt.
Yandex
Объявления
28.08.2013, 16:24     Примитивная игра на c++
Ответ Создать тему
Опции темы

Текущее время: 17:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru