Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как улучшить программу? 
:(
    Опции темы
m1kle
Дата 23.5.2007, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 2.5.2007
Где: Москва, Россия

Репутация: нет
Всего: нет



У меня есть программа, но работать с ней мне совсем не удобно, есть ли какие то специальный способы, хитрости, как сделать код лучше.
К стати вот и сам код:
#include"TXLib.h"
// Используемые функции
Код

void Man(int x, int y, int width, int legs, int plechi, int hands, int headrad, COLORREF color , int nogi, int leg1n, int leg2n, int hand1, int hand2);
void Action();
void DelAll();
void m1();
void strela(int x, int y, int width, COLORREF color);
void DrawRamka();

int main() // Главная часть
{
    txTextCursor(false);
    txCreateWindow(1000, 720);
    Action();
    return 0;
}
// Все функции

void DrawRamka() // Рисование рамки
{
    txSetColor(TX_WHITE);
    txLine(2,   2,   998, 2);
    txLine(2,   2,   2,   700);
    txLine(2,   700, 998, 700);
    txLine(2,   701, 998, 701);
    txLine(998, 2,   998, 700);
}

void strela(int x, int y, int width, COLORREF color)
{
    txSetColor(color);
    txLine ( x, y, x+width, y );
    txLine ( x, y, x+width/3, y+3 );
    txLine ( x, y, x+width/3, y-3 );
}

void m1() // Надпись
{
    txSetColor(TX_LIGHTGRAY);
    txSelectFont ("Arial", 12);
    txTextOut (850, 708, "© .m1kle Studios 2007");
}

void DelAll() // Удалить все
{
    txSetFillColor(TX_BLACK);
    txCircle(500, 360, 1000);
}
void Man(int x, int y, int width, int legs, int plechi, int hands, int headrad, COLORREF color , int nogi, int leg1, int leg2, 
        int hand1, int hand2) // Рисование человека
{
    txSetColor(color);
    txSetFillColor(color);
    txLine ( x, y+nogi, x, y-width );
    txLine ( x, y+nogi, x-leg1, y+legs );
    txLine ( x, y+nogi, x+leg2, y+legs );
    txLine ( x, y-width/2, x-plechi, y-width/2 );
    txLine ( x, y-width/2, x+plechi, y-width/2 );
    txLine ( x-plechi, y-width/2, x-hand1, y+hands );
    txLine ( x+plechi, y-width/2, x+hand2, y+hands );
    txCircle ( x, y-width, headrad );
}

void Action() // Действие
{
//_______Параметры чела_______________________________________________________________
    int width     =12;       // Высота тела 12
    int legs      =20;       // Ноги 20
    int plechi    =2;        // Плечи
    int hands     =6;        // Руки
    int headrad   =3;        // Радиус головы
    COLORREF color=TX_YELLOW; // Цвет человека
    int nogi      =6;        // Ноги
    int leg1      =3;        // Наклон 1-й ноги
    int leg2      =3;        // Наклон 2-й ноги
    int hand1     =4;        // Наклон 1-й руки
    int hand2     =4;        // Наклон 2-й руки
//______Параметры чела_______________________________________________________________
    int    count =0;            // Счетчик
    int    x     =810;          // Изначальное расположение чела в длинну _
    int    y     =500;          // Изначальное расположение чела в высоту |
    int    speed =40;           // Скорость чела
    int    s;                   // Кнопка, нажатая пользователем
    int    rad   =leg1+count%6; // Радиус, для стены
    int    a     =0;            // Для действия
    int    razvar=0;            // Для разварота
    int    stat  =1;            // Статус, для прыжков и наклонов, если лишняя, убрать
    int    prig  =1;            // Статус, для прыжка
    int    tex   =0;            // Техническая переменная, для прыжков и наклонов
    int    activ =0;            // Стреляет ли стрела
    int    xstrel=1000;         // Координата X стрелы
    int    ystrel=0;            // Координата Y Стрелы
    int    points=0;            // Ваши очки
    y        -=legs;
    int    g;                   //Рандом, для стрел
    int    zeml=700;            //Земля, для будующих версий
    int    r=1;                 //Рандом, для стрелы
    int    ra=0;                //Технический рандом
    int    time=0;              //Время в игре
    int    tex2=0;              //Вторая тех. переменная
    int    tex3=0;              //Для приседания
         
    while(a==0)
    {
        txBegin();
        DelAll();
        if(kbhit() && s!=119 && s !=115)
            s=getch();
        if(s==97 && x/2-rad > 2 ) // Влево
        {
            x--;
            count++;
            Man(x, y, width, legs, plechi, hands, headrad, color, nogi, leg1+count%3, leg2+count%3, hand1+count%3, hand2+count%3 );
        }
        if(s==100 && x+leg2+count%6 < 998) // Вправо
        {   
            x++;
            count++;
            Man(x, y, width, legs, plechi, hands, headrad, color, nogi, leg1+count%3, leg2+count%3, hand1+count%3, hand2+count%3 );
        }
        if(s!=100 && s != 97 & s != 119 & s != 115)
        {
            Man(x, y, width, legs, plechi, hands, headrad, color, nogi, leg1+count%3, leg2+count%3, hand1+count%3, hand2+count%3 );
        }
        if(activ==0)
        {
            g=random(2)+1;
        }
        if(g==2)
           ystrel=672;
        else
           ystrel=689;
        activ=1;
        ra=random®+0;  
        if(xstrel+50<x)
        {
            activ=0;
            xstrel=1000;
            points++;
            if(!(points%10))
               r++;
            if(speed>1)
               speed--;
        }
        else
           xstrel--;
    // DWN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        if(s==115)
        {
            if(tex3 <= 9 && prig==1)
            {          
                y++;
                legs--;
                width--;
                tex3++;
                Man(x, y, width, legs, plechi, hands, headrad, color, nogi, leg1+count%3, leg2+count%3, hand1+count%3, hand2+count%3 );
            }
        else
        {
            prig=2;
            tex3--;
            width++;
            y--;
            legs++;
            Man(x, y, width, legs, plechi, hands, headrad, color, nogi, leg1+count%3, leg2+count%3, hand1+count%3, hand2+count%3 );
            if(tex3==0)
            {
                s=111;
                prig=1;
            }
        }
    }               
     if(y+legs>=zeml-24 && tex2==0) // UP
         tex=24; //Высота прыжка, сделать потом, чтобы цифру можно было изменять
     else
     {
         tex=-1;
         tex2=1;
     }
     if(y+legs==zeml)
         tex2=0;
     if(y+legs<zeml && s!= 119)
     {
         Man(x, y, width, legs, plechi, hands, headrad, color, nogi, leg1+count%3, leg2+count%3, hand1+count%3, hand2+count%3);
         y+=2;
         if(y+legs==zeml-3)
             y++;
     }
     if(s==119)
     {
         if(tex>=0)
         {
             tex--;
             y--;
             count++;  
             Man(x, y, width, legs, plechi, hands, headrad, color, nogi, leg1+count%3, leg2+count%3, hand1+count%3, hand2+count%3);
         }
         else
         {
             s=111;
             tex=0;
         }
     }
     if (txGetPixel(xstrel+1, ystrel+ra) == color || txGetPixel(xstrel+2, ystrel+ra) == color)
     {
         freopen("Достижения.txt", "a+", stdout);
         time=time/1000;
         printf("Очки: %d\n Время: %d\n", points, time);
         break;
     }          
     m1();
     DrawRamka();
     strela(xstrel, ystrel+ra, 15, TX_ORANGE);
     txSleep(speed);
     time+=speed;
     txEnd();
     }
}


+
И еще желательно скажите мне ошибки, которые я туту допустил(т.е. те, где можно было сделать лучше )

Это сообщение отредактировал(а) m1kle - 23.5.2007, 19:43
PM MAIL WWW MSN   Вверх
JackYF
Дата 23.5.2007, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(m1kle @  23.5.2007,  17:19 Найти цитируемый пост)
У меня есть программа, но работать с ней мне совсем не удобно, есть ли какие то специальный способы, хитрости, как сделать код лучше.


Способ, работающий в 99% случаев - переписать заново.

Цитата(m1kle @  23.5.2007,  17:19 Найти цитируемый пост)
К стати вот и сам код:

+1.

Цитата(m1kle @  23.5.2007,  17:19 Найти цитируемый пост)
void Man(int x, int y, int width, int legs, int plechi, int hands, int headrad, COLORREF color , int nogi, int leg1n, int leg2n, int hand1, int hand2);

Слишком много параметров функции, сделай передачу структуры в функцию.

Цитата(m1kle @  23.5.2007,  17:19 Найти цитируемый пост)
void Man(int x, int y, int width, int legs, int plechi, int hands, int headrad, COLORREF color , int nogi, int leg1n, int leg2n, int hand1, int hand2);
void Action();
void DelAll();
void m1();
void strela(int x, int y, int width, COLORREF color);
void DrawRamka();

Информативность имен страдает.

Слишком много констант в коде.

Комментарии к работе функций желательно переносить в раздел объявлений функций, а не описания их тел.

Дальше не осилил...



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
nickless
Дата 23.5.2007, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата(m1kle @  23.5.2007,  16:19 Найти цитируемый пост)
способы, хитрости, как сделать код лучше

Для начала начни пользоваться тэгами "код", потому что читать невозможно.
А так на первый взгляд:
- функция Action длиной где-то на 90% кода - разделить на мелкие функции и передавать им нужные параметры
- в той же функции целый экран переменных - используй лучше структуры (и параметров меньше передавать надо будет)
- функция Man с 13(!) параметрами это жесть (см. пункт 2)



--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
JackYF
Дата 23.5.2007, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Да, кстати. Наверху в форме ответа есть кнопочка "код". Применяй ее, и твой код станет гораздо более читабельным для остальных форумчан.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
m1kle
Дата 23.5.2007, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 2.5.2007
Где: Москва, Россия

Репутация: нет
Всего: нет



Стоп, а как сделать передачу из структур в функции? (сорри за нубоватость, только начинаю. smile )
1,2, спасибо.
PM MAIL WWW MSN   Вверх
DigitSphinx
Дата 23.5.2007, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 28.4.2007
Где: Москва

Репутация: 1
Всего: 3



что то типа :
Код

struct ForMult
{
    double a;
    double b;
}
double Mult(ForMult & Variable)
{
    return Variable.a * Variable.b;
}
main()
{
    ForMult VAR;
    VAR.a = 12.2;
    VAR.b = 13.3;
    double Result = Mult(VAR);
}



--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
bsa
Дата 23.5.2007, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Лучше так:
Код
struct ForMult
{
    double a;
    double b;
}
double Mult(const ForMult & Variable)
{
    return Variable.a * Variable.b;
}
main()
{
    ForMult VAR;
    VAR.a = 12.2;
    VAR.b = 13.3;
    double Result = Mult(VAR);

}

или так, если пишешь на Си:
Код
struct ForMult
{
    double a;
    double b;
}
double Mult(const ForMult *Variable)
{
    return Variable->a * Variable->b;
}
main()
{
    ForMult VAR;
    VAR.a = 12.2;
    VAR.b = 13.3;
    double Result = Mult( &VAR );

}
Для тех, кто разницы не видит - я добавил const в определение Mult().
PM   Вверх
m1kle
Дата 23.5.2007, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 2.5.2007
Где: Москва, Россия

Репутация: нет
Всего: нет



Помойму структурами наоборот хуже будет, и долше.
Насчет остального согласен. А есть еще какие то хитрости
PM MAIL WWW MSN   Вверх
MAKCim
Дата 23.5.2007, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



bsa, 
Код

double Mult(const struct ForMult *Variable)
{
    return Variable->a * Variable->b;
}

 smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
JackYF
Дата 24.5.2007, 02:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(m1kle @  23.5.2007,  22:31 Найти цитируемый пост)
Помойму структурами наоборот хуже будет, и долше.


13 (или сколько там...) параметров, которые передаются в функцию - не дело.
Все параметры запихни в одну структуру и передавай указатель на неё в функцию.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
m1kle
Дата 24.5.2007, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 2.5.2007
Где: Москва, Россия

Репутация: нет
Всего: нет



JackYF
Я не понял, а как стрктуру передать в функцию.
Значит создаю я стрктуру
Код

struct ForMult
{
 int x;
 intx;
}
// А потом передаю
int function(struct ForMult)
{
}

Может похоже на бред, но насколько я понял надо как то так.

Это сообщение отредактировал(а) m1kle - 24.5.2007, 11:55
PM MAIL WWW MSN   Вверх
bsa
Дата 24.5.2007, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Точно. Это бред и есть. Тебе дали 100% рабочий вариант. Там все написано:
Код
struct ForMult
{
 int x;
 int y;
};

int function(const struct ForMult *fm)
{
    return fm->x * fm->y;
}

int main(int argc, char *args[])
{
     struct ForMult formult = {11, 12}; /* x = 11, y = 12 */
     int t;
     t = function( &formult );
....
     return 0;
}

PM   Вверх
m1kle
Дата 25.5.2007, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 2.5.2007
Где: Москва, Россия

Репутация: нет
Всего: нет



А эти структуры хоть ускорят работу программы, а то столько текста, а толку 0.
PM MAIL WWW MSN   Вверх
JackYF
Дата 25.5.2007, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(m1kle @  25.5.2007,  14:11 Найти цитируемый пост)
А эти структуры хоть ускорят работу программы, а то столько текста, а толку 0. 

Не думаю.

Они сделают ее более читабельной и расширяемой.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
adLucem
Дата 25.5.2007, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 17.4.2007
Где: Украина, Донецк

Репутация: нет
Всего: 5



Читал - плакаль, ниасилил. Афтар выпей йаду.

(Прошу меня правильно понять - комментирую в том же стиле, в котором написана программа.)

Я конечно понимаю, что всем нужно с чего то начинать, но проблема не в том, что некоторые люди пишут, проблема в том, что они считают нужным это показывать другим людям (перефраз Чехова).

JackYF, Я думаю эту программу ничто не сделает ни читабельной ни расширяемой кроме переписывания.

PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0637 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.