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

Пишем рогалик: пояснения по коду и его критика - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
rennnorb
8 / 8 / 2
Регистрация: 28.05.2014
Сообщений: 122
16.08.2014, 19:29     Пишем рогалик: пояснения по коду и его критика #1
Здравствуйте! Сегодня сел писать рогалик, в процесе возникло несколько вопросов (в виде коментариев в коде):


main.cpp
Кликните здесь для просмотра всего текста


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
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include "hero.h"
#include "control.h"
 
 
using namespace std;
 
int main()
{
    srand (time(NULL));
    hero me(1);
    
    
    const int size_a = 5;
    const int size_b = 5;
    
    char fi[size_a][size_b][2]; // тут два уровня:
                                // в первом находится все поле,
                                // по второму ходит герой (изначально
                                // весь уровень закрыт) 
                                
    //generate(size_a, size_b, *fi[size_a][size_b]); // хотел вынести в функцию, 
    for(int i =0; i<size_a; i++)                   // не получилось
    {
        for(int j=0; j<size_b; j++)
        {
            int a=random()%25;
            if(a>20)
                fi[i][j][0] = '$';//это враг
            else
                fi[i][j][0] = ' ';
            fi[i][j][1] = '#';  
        }
    }
    fi[random()%size_a][random()%size_b][0] = '@';//это портал  
    
    for(;;)// может лучше while(true)? И если да то чем?
    {
        fi[me.x][me.y][1] = 'i';//это наш герой
        
        for(int i =0; i<size_a; i++)
        {
            for(int j=0; j<size_b; j++)
                cout<<fi[i][j][1];
            cout<<endl; 
        }
        
        if (fi[me.x][me.y][0]=='$')             //тут выводится
            cout<<"Ther is an enemy"<<endl; //содержимое клетки
        else if (fi[me.x][me.y][0]=='@')                //на которой мы стоим
            cout<<"There is a portall"<<endl;
        fi[me.x][me.y][1] = fi[me.x][me.y][0];
        
        
        
        
        control(&me.x, &me.y);
        back(&me.x, &me.y, size_a, size_b);
        
        
        cout<<"\033[2J";        //это очистка 
        cout<<"\033[0;0f";      //экрана
    }
    
    cout<<endl;
    
    
    return 0;
}



hero.h
Кликните здесь для просмотра всего текста


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
#include <stdlib.h>
#include <fstream>
using namespace std;
class hero
{
    public:                 //я слышал что переменные должны в private,
        int strength;       //но не кто не обьяснил почему 
        int health;
        int luck;
        int exp;
        int x;
        int y;
        
        void print();
        void hit(hero *en);
        hero(bool a = false, int X = 0, int Y = 0)                    // если а - правда,
        {                                            //то вы - герой
            strength = random()%10 + 6;
            health = random()%20 + 15;
            luck = random()%9 + 2;
            exp=0;
            
            if(a)
            {
                strength = 5;
                health = 6;
                luck = 3;
            }
            
            x = X;
            y = Y;
             
        }
};
 
void hero::print()
{
    cout<<" health = "<<health<<endl;
    cout<<" strength = "<<strength<<endl;
    cout<<" luck = "<<luck<<endl;
}
 
void hero::hit(hero *en)
{
    if(luck>random()%10)                       //для критических ударов
    {
        en->health -= strength*1.5;
    }
    else
        en->health -= strength;
}



control.h

Кликните здесь для просмотра всего текста


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
void back(int *x, int *y, int size_a, int size_b)
{
    if(*x>size_a)
        *x=0;
    if(*y>size_b)                    // это чтобы герой не убегал 
        *y=0;                         // за приделы поля
    if(*y<0)
        *y=size_b;
    if(x<0)
        *x=size_a;
}
 
void control(int *x, int *y)
{
    char dir;
    dir = getchar();                   // в винде была ф-я getch()
                            // хотелось бы что-то такое же
        
 
    if(dir=='d')
        *y+=1;
        
    if(dir=='a')                        // по совершенно не понятным
        *y-=1;          // причинам, у++ и х++ 
                        // не работали =(
    if(dir=='s')        
        *x+=1;          
            
    if(dir=='w')
        *x-=1;
}


Также хотелось бы услышать советы по коду и по его организации.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.08.2014, 19:29     Пишем рогалик: пояснения по коду и его критика
Посмотрите здесь:

C++ Функция вывода символа по коду его клавиши: есть ли такая?
Пояснения условия C++
Необходимы пояснения по коду C++
Что Вы можете сказать о индусе по его коду C++
C++ Пояснения кода
Как выводить символ по его коду? C++
C++ Нужны некоторые пояснения
C++ Нужны пояснения

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
16.08.2014, 19:51     Пишем рогалик: пояснения по коду и его критика #2
Для начала небольшое замечание: если где-то говорится, что переменные в классе надо делать private, но не объясняется почему, то выяснить стоящие за этой рекомендацией причины лучше, чем безоговорочно действовать вопреки.
По поводу разработки советую идти мелкими шагами, ставить перед собой небольшие, быстро достижимые цели. Например, сначала просто гонять символ по пустому экрану, затем добавить случайно расставленные препятствия, и так далее. Попутно желательно изучать всякие полезные сведения о написании программ.
tehnar5
31 / 31 / 12
Регистрация: 03.05.2011
Сообщений: 84
16.08.2014, 21:30     Пишем рогалик: пояснения по коду и его критика #3
while(true) лучше, возможно, так как более понятно, что происходит, хотя и чуть длиннее

можно писать scanf("%c", &c), или cin >> c

Пишите лучше так:
C++
1
void control(int &x, int &y)
тогда не придется ставить каждый раз лишние звездочки, и код будет получше выглядеть:
C++
1
2
3
4
5
6
7
8
9
10
11
    if(dir=='d')
        y+=1;
        
    if(dir=='a')                        // по совершенно не понятным
        y-=1;          // причинам, у++ и х++ 
                        // не работали =(
    if(dir=='s')        
        x+=1;          
            
    if(dir=='w')
        x-=1;
и уже в таком случае можно будет писать х++ и у--(в изначальном варианте надо было бы написать *х++)
Yandex
Объявления
16.08.2014, 21:30     Пишем рогалик: пояснения по коду и его критика
Ответ Создать тему
Опции темы

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