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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.01.2012, 19:44   #61
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Сильно не вникал, попробуй

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

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

        for(int i=0;i<ps;i++){
                SetConsoleCursorPosition(hStdOut,pit[i]);
                cout<<"0";
        }
Заменить на

Код:
        pit.insert(pit.begin(),pit.front());
    
        SetConsoleCursorPosition(hStdOut,pit.end());
        cout<<".";
    
        pit.erase(pit.end());

        SetConsoleCursorPosition(hStdOut,pit.begin());
        cout<<"0";
  }
Я не компилировал, посмотри на что будет ругаться, может в SetConsoleCursorPosition неправильно передаю указатели.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 05.01.2012, 19:52   #62
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а std::vector::front, std::vector::back не?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.01.2012, 20:01   #63
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а std::vector::front, std::vector::back не?
вообще да, так лучше.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 05.01.2012, 20:29   #64
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

вот написал так, но оно еще хуже..

Код:
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:{(*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.front());

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

        pit.erase(pit.end());

        SetConsoleCursorPosition(hStdOut,(*pit.begin()));
        cout<<"0";


} //-- end move ()



};//---end class
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 05.01.2012, 21:59   #65
CaHb4ec
Пользователь
 
Регистрация: 02.01.2012
Сообщений: 25
По умолчанию

обрати внимание на этот участок кода:

Код:
        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.front());
рассмотрю на примере нажатия UP:
для головы ты уменьшаешь координату Y на единицу, далее переходишь к вставке элемента перед pit.begin() и вставляешь pit.front(), т.е. тот же самый элемент с координатами головы. Значит у тебя получается два первых элемента имеют одинаковые координаты, в следствии чего, когда до них дойдет хвост будет образована визуальная дырка.
Заинтересовали меня этой темой, решил тоже змейку написать. только без классов.
В своей проге аналогичный участок реализую примерно так:
Код:
switch(way){
                        case UP:{COORD head=pit->front();//создаем временную переменную, и копируем координаты начала
					head.Y--;//уменьшаем необходимую координату
					pit->insert(pit->begin(),head); break;}//добавляем данный элемент первым в вектор
                        case DOWN:{(*pit.begin()).Y++; break;}
                        case RIGHT:{(*pit.begin()).X++; break;}
                        case LEFT:{(*pit.begin()).X--; break;}

        }//--end switch
аналогично с остальными клавишами.
P.s. в вашей проге вместо стрелочек наверное точки будут..

Последний раз редактировалось CaHb4ec; 05.01.2012 в 22:19.
CaHb4ec вне форума Ответить с цитированием
Старый 05.01.2012, 22:12   #66
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

Цитата:
Сообщение от sVasilich Посмотреть сообщение
Код:
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 тоже нет смысла хранить в виде поля.
CaHb4ec, смысл в том чтобы отказаться от использования head and tail .
но как я понял их обязательно использовать..

как должно происходить передвижение:
1.Смотрим направление. (например UP)
2.Берем временную переменную haed и присваиваем ей координаты первого элемента питона. Берем переменную tail и присваиваем ей координаты последнего элемента питона.
3.изменяем определенную координату переменной head.
4.Добавляем в начало питона элемент с координатами head.
5.Удаляем из питона элемент с координатами tail.
6.На месте с координатами tail рисуем пустую клеточку.
7.Выводим питона по координатам.
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 05.01.2012, 22:37   #67
CaHb4ec
Пользователь
 
Регистрация: 02.01.2012
Сообщений: 25
По умолчанию

почему бы не использовать временную переменную head? без tail можно обойтись, даже нужно, поскольку дополнительная переменная для перерисовки и последующего удаления ее не нужна.
Цитата:
3.изменяем определенную координату переменной head.
4.Добавляем в начало питона элемент с координатами head.
Я вам еще раз намекаю, что именно из-за этого у вас такой косяк и наблюдается. У вас получается два элемента вектора с одинаковыми координатами. рано или поздно этот элемент станет хвостом, по координатам хвоста произойдет перерисовка, а так как координаты такого хвоста не правильные(т.к. указывают на элемент выше), то и закрасится не он. А в следствии этого образуется дырка.
Хорошо, если вы не хотите использовать вспомогательную переменную, то делайте так:
Код:
case UP:{	(*pit.begin()).Y--; 
			pit.insert(pit.begin(),pit.front());
			(pit.begin()+1)->Y++;
			break;
		}
а дальше перерисовка.

Последний раз редактировалось CaHb4ec; 05.01.2012 в 23:04.
CaHb4ec вне форума Ответить с цитированием
Старый 07.01.2012, 00:19   #68
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

Господа, змейка практически готова, вот только не могу разобраться как проверять на, что питон сам в себя врезался, и выводить табличку, что игрок проиграл.
вот код.. проверка написана в функции validPiton..
Код:
//---------------------------------------------------------------------------

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

#pragma hdrstop

using namespace std;

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

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

//--------settings-----------------------------------------------------------

HANDLE hStdOut=GetStdHandle(STD_OUTPUT_HANDLE);  //--handle console
char sp='0';    //--symbol piton
char sa='.';    //--symbol area
char sw='H';    //--symbol wall
int ps=7;        //--start piton size
int delay=100;   //--delay step
int width=30;    //--width Area
int height=20;   //--height Area

//--------prototype----------------------------------------------------------

void gotoxy(int x, int y);
void showArea();
void setWalls();
void validWalls(COORD &temp);
void newMouse();
bool ifMouseEating();
void move(Way way);
void init();

//--------end prototype------------------------------------------------------

void gotoxy(int x, int y)
{
        COORD temp={x,y};
        SetConsoleCursorPosition(hStdOut,temp);
}

//---------------------------------------------------------------------------
void showArea()
{
        int i,j;

        for(i=1; i<width+1; i++){
                for(j=1; j<height+1; j++){
                        gotoxy(i,j);
                        cout<<sa;
                }
        }
}

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

void setWalls()
{
        int i,j;

        for(i=0; i<width+2; i++){
                for(j=0; j<height+2; j++){
                        if(j==0 || j==height+1 || i==0 ||i==width+1){
                                gotoxy(i,j);
                                cout<<sw;
                        }
                }
        }
}

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

class Piton{

private:

        vector<COORD> pit;
        Way way;
        COORD head;
        COORD mouse;
        int i;



void validWalls(COORD &temp)
{
        switch(temp.X){
                case 31:{temp.X=1; break;}
                case 0:{temp.X=width; break;}
        }
        switch(temp.Y){
                case 0:{temp.Y=height; break;}
                case 21:{temp.Y=1; break;}
        }
}

bool validPiton()
{
        for(size_t i=0; i<8; i++){

                if(pit.back().X==pit[i].X && pit.back().Y==pit[i].Y){

                        return true;
                }

        }

        return false;

}

void gameOver()
{
        exit(0);
        //cout<<"rfrfrf"<<endl;

}

void newMouse()
{
        mouse.X=rand()%30+1;
        mouse.Y=rand()%20+1;

        for(int i=0; i<pit.size(); i++) {

                if(pit[i].X==mouse.X && pit[i].Y==mouse.Y) {
                        newMouse();
                }
        }

        SetConsoleCursorPosition(hStdOut,mouse);
        cout<<"*";
}

bool ifMouseEating()
{
        return (pit.front().X==mouse.X && pit.front().Y==mouse.Y);
}
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 07.01.2012, 00:20   #69
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

Код:
public:

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

                for(i=0; i<ps;i ++){
                        temp.Y++;
                        pit.push_back(temp);
                        SetConsoleCursorPosition(hStdOut,pit[i]);
                        cout<<sp;
                } //--end for

                newMouse();

}//--- end Piton

void move(Way way)
{



        head=pit.front();

        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);

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

        pit.erase(pit.end());

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

                validWalls(pit[i]);

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

        if(ifMouseEating()){

                pit.insert(pit.end(),mouse);
                newMouse();
        }

        if(!validPiton()){

                gameOver();
        }


} //-- end move ()

};//---end class

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

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

        srand((unsigned)time(NULL));

        init();

        Piton pit;

        Way way=UP;

        while(1){
                if(kbhit()){
                        key=getch();
                        if(key==0){
                                key=getch();
                                switch(key){
                                        case 72:{if(way!=DOWN){way=UP;}
                                                break;}
                                        case 80:{if(way!=UP){way=DOWN;}
                                                break;}
                                        case 75:{if(way!=RIGHT){way=LEFT;}
                                                break;}
                                        case 77:{if(way!=LEFT){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(delay);

        } //-- end while


}
//---------------------------------------------------------------------------
И да, можете посмотреть в целом на код и высказать замечания.

Спасибо за уделенное время !
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 07.01.2012, 00:53   #70
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

все решил.. весь день думал, что не так..

Код:
bool validPiton()
{
        for(i=1; i<pit.size()-2; i++){

                if(pit.front().X==pit[i].X && pit.front().Y==pit[i].Y){

                        return true;
                }

        }

        return false;

}
просто я начинал проверять с 0 элемента вектора.

теперь думаю как меня сделать..
если есть какие идеи киньте..
и да, напишите замечания к коду, или что считается "грубым тоном".
Спеши медленно.

Последний раз редактировалось asmars; 07.01.2012 в 01:08.
asmars вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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