Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.01.2012, 13:08   #41
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

Спасибо, господа !
Вроде со всем разобрался, только вот разберусь как работать с vector, так как ни разу его не юзал..
Сяду буду царапать..
Постараюсь вечером показать какой-то результат!
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 02.01.2012, 14:27   #42
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Serge_Bliznykov, а зачем? Текущей точке можно узнать куда ползти по разнице координат с предыдущей точкой: изменился x - ползём влево или вправо, изменился y - ползём вверх или вниз. Так что направление важно только голове. Ну или вообще, смотри мой вариант с добавлением новой головы на каждом шаге: там пересчитывать координаты тела питона не нужно.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 02.01.2012, 15:23   #43
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

Соглашусь с тем что хранить в каждой ячейке змейки её направление - довольно бессмысленно.
Важно направление головы.
onewho вне форума Ответить с цитированием
Старый 05.01.2012, 00:28   #44
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

Эх..
Не могу сделать часть игры, где осуществляется передвижение питона.
вот код того, что имею.. move() переписывал уже раза 4, и так и эдак..
Код:
#include <vcl.h>
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <vector.h>

#pragma hdrstop

using namespace std;

//---------------------------------------------------------------------------

HANDLE hStdOut=GetStdHandle(STD_OUTPUT_HANDLE);  //--handle console
char sp='0';    //--symbol pitona
char sa='.';    //--symbol area
int ps=3;       //--piton size
int delay=800; //--

//---------------------------------------------------------------------------

enum Way{
        UP,
        DOWN,
        RIGHT,
        LEFT
};

//---------------------------------------------------------------------------
void showArea()
{
        for(int i=0;i<20;i++){
                for(int j=0;j<20;j++){
                        cout<<sa;
                }
                cout<<endl;
        }
}

//---------------------------------------------------------------------------

void init()
{
        showArea();
        _setcursortype(_NOCURSOR);
}

//------------------------------------------------------------------------
class Piton{

        vector<COORD> pit;
        Way way;
        COORD temp;
        COORD f;
        COORD head;
        COORD tail;

public:

Piton(){
                COORD temp={10,7};

                for(int i=0;i<ps;i++){

                        temp.Y++;
                        pit.push_back(temp);
                        SetConsoleCursorPosition(hStdOut,pit[i]);
                        cout<<sp;

                } //--end for
}//--- end Piton

void move(Way way)
{
        head=pit.front();
        tail=pit.back();

        switch(way){

                        case UP:{
                                temp.Y--;
                                break;}
                        case DOWN:{
                                temp.Y++;
                                break;}
                        case RIGHT:{
                                temp.X++;
                                break;}
                        case LEFT:{
                                temp.X--;
                                break;}

        }//--end switch

        pit.insert(pit.begin(),temp);
        pit.erase(pit.end());

        SetConsoleCursorPosition(hStdOut,tail);
        cout<<".";

        for(int i=0;i<ps;i++){

                SetConsoleCursorPosition(hStdOut,pit[i]);
                cout<<"0";
        }
}

};//---end class

#pragma argsused
void main()
{
        int i,j,a,m,n,x,y;
        int key;

        init();

        Piton pit;

        Way way=UP;

        while(1){
                if(kbhit()){
                        key=getch();
                        switch(key){
                                case 0:{
                                        key=getch();
                                        switch(key){
                                                case 72:{
                                                        way=UP;
                                                        break;
                                                }
                                                case 80:{
                                                        way=DOWN;
                                                        break;
                                                }
                                                case 75:{
                                                        way=LEFT;
                                                        break;
                                                }
                                                case 77:{
                                                        way=RIGHT;
                                                        break;
                                                }
                                        } //--end switch
                                }
                                case 27:{
                                        exit(0);
                                        break;
                                }
                        }//-- end switch
                }  //-- end if

                pit.move(way);
                Sleep(delay);

        } //-- end while
}
не могу понять, что не так..

реализация должна быть такая:
1.В move передаем направление.
2.Смотря по направлению, в начало вектора добавляется новый элемент.
3.Последний элемент удаляем и на место где он был ставим пустую клеточку.

как то так осуществляется передвижение, НО оно не работает!!
вроде все правильно..
уже 2 голову ломаю, и 4 раза переписывал реализацию move() .

подскажите, может лучше совсем по-другому сделать?
или этот вариант не такой уж и плохой, но тогда, что в нем ни так?
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 05.01.2012, 01:45   #45
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

Все исправил..

Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <vector.h>

#pragma hdrstop

using namespace std;

//---------------------------------------------------------------------------

HANDLE hStdOut=GetStdHandle(STD_OUTPUT_HANDLE);  //--handle console
char sp='0';    //--symbol pitona
char sa='.';    //--symbol area
int ps=7;       //--piton size
int delay=800; //--

//---------------------------------------------------------------------------

enum Way{
        UP,
        DOWN,
        RIGHT,
        LEFT
};

//---------------------------------------------------------------------------
void showArea()
{
        for(int i=0;i<20;i++){
                for(int j=0;j<20;j++){
                        cout<<sa;
                }
                cout<<endl;
        }
}

//---------------------------------------------------------------------------

void init()
{
        showArea();
        _setcursortype(_NOCURSOR);
}

//---------------------------------------------------------------------------

class Piton{

        vector<COORD> pit;
        Way way;
        COORD temp;
        COORD f;
        COORD head;
        COORD tail;

public:

Piton(){
                COORD temp={10,7};

                for(int i=0;i<ps;i++){

                        temp.Y++;
                        pit.push_back(temp);
                        SetConsoleCursorPosition(hStdOut,pit[i]);
                        cout<<sp;

                } //--end for
}//--- end Piton

void move(Way way)
{
        head=pit.front();
        tail=pit.back();

        switch(way){
                        case UP:{head.Y--; break;}
                        case DOWN:{head.Y++; break;}
                        case RIGHT:{head.X++; break;}
                        case LEFT:{head.X--; break;}

        }//--end switch

        pit.insert(pit.begin(),head);
        pit.erase(pit.end());

        SetConsoleCursorPosition(hStdOut,tail);
        cout<<".";

        for(int i=0;i<ps;i++){
                SetConsoleCursorPosition(hStdOut,pit[i]);
                cout<<"0";
        }

} //-- end move ()



};//---end class


#pragma argsused
void main()
{
        int i,j,a,m,n,x,y;
        int key;

        init();

        Piton pit;

        Way way=UP;

        while(1){
                if(kbhit()){
                        key=getch();
                        if(key==0){
                                key=getch();
                                switch(key){
                                        case 72:{way=UP; break;}
                                        case 80:{way=DOWN; break;}
                                        case 75:{way=LEFT; break;}
                                        case 77:{way=RIGHT; break;}
                                } //--end switch
                        }//---end if 0
                        else{
                                switch(key){
                                        case 27:{exit(0); break;}
                                }//--- end switch key
                        }//-- end else

                }  //-- end if

                pit.move(way);
                Sleep(100);

        } //-- end while

}
//---------------------------------------------------------------------------
теперь буду делать валидность стен, добавление яблок, подсчет очков.

в близлежащим будущем хочу еще меню и настройки.
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 05.01.2012, 02:39   #46
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Код:
class Piton{

        vector<COORD> pit;
        Way way;
        COORD temp;
        COORD f;
        COORD head;
        COORD tail;

public:
Код:
        pit.insert(pit.begin(),temp);
        pit.erase(pit.end());

        SetConsoleCursorPosition(hStdOut,tail);
        cout<<".";

        for(int i=0;i<ps;i++){

                SetConsoleCursorPosition(hStdOut,pit[i]);
                cout<<"0";
        }
А для чего ты хранишь отдельно голову и хвост, если они у тебя всегда известны: pit.begin() и pit.end(), соответственно.

Я бы от них отказался, а при движении сначала закрашивал хвост, а потом удалял его из вектора.

Ещё, подозреваю что переменные типа tmp тоже нет смысла хранить в виде поля.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 05.01.2012, 14:10   #47
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

sVasilich, pit.begin() и pit.end() можно использовать только с итераторами.
правильно?

потому что, если я пишу вот так, компилятор ругается..
Код:
void move(Way way)
{
        switch(way){
                        case UP:{pit.begin().Y--; break;}
                        case DOWN:{pit.begin().Y++; break;}
                        case RIGHT:{pit.begin().X++; break;}
                        case LEFT:{pit.begin().X--; break;}

        }//--end switch

        pit.insert(pit.begin(),pit.begin());
        pit.erase(pit.end());

        SetConsoleCursorPosition(hStdOut,pit.end());
        cout<<".";

        for(int i=0;i<ps;i++){
                SetConsoleCursorPosition(hStdOut,pit[i]);
                cout<<"0";
        }

} //-- end move ()
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 05.01.2012, 14:25   #48
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Нет, не правильно. pit.begin() и pit.end() это и есть итераторы. Попробуй написать:
Код:
case UP:{pit.begin()->Y--; break;}
или
Код:
case UP:{(*pit.begin()).Y--; break;}
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 05.01.2012, 14:33   #49
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

а в чем отличие "->" и "." ??

и если Вас не затруднит, объясните что такое итератор и где его надо применять ?
прочитал не в одной книге про него, знаю как его написать и использовать, но до понимания далеко ..
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 05.01.2012, 14:37   #50
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от asmars Посмотреть сообщение
а в чем отличие "->" и "." ??

и если Вас не затруднит, объясните что такое итератор и где его надо применять ?
прочитал не в одной книге про него, знаю как его написать и использовать, но до понимания далеко ..
Что такое классы, знаешь?
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal движение змейки zhenka619 Помощь студентам 0 29.12.2011 22:45
Обработка нажатия клавиш в TButton mLight Помощь студентам 4 11.11.2011 20:53
Обработка клавиш на TListBox Melanholly Общие вопросы Delphi 2 31.10.2011 14:06
Обработка событий клавиш клавиатуры Synapse Visual C++ 2 20.10.2011 18:37
обработка нажатия клавиш VC++ консоль rest Помощь студентам 0 06.10.2009 07:53