حرکت در صفحه(بازی snake) - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

حرکت در صفحه(بازی snake)

+1 امتیاز
سلام

در نوشتن بازی مار برای چاپ حرکت هاش اگر نخوایم صفحه را دوباره پاک کنیم و با حرکت بعدی دوباره چاپ کنیم

راه دیگه یی برای حرکتش هست ؟؟؟
سوال شده فروردین 26, 1393  بوسیله ی Azar (امتیاز 628)   29 43 61
داخل کنسول منظورته ؟!
اگر داخل کنسول هستش یک Map بساز و هر بار که عوضش کردی  کلش رو دوباره چاپ کن
چرا نمیخوای صفحه رو دوباره پاک کنی ؟
بله
چرا Map?
میخوام ببینم غیر از این راه دیگه ای هم هست یا نه ؟
و یه سوال دیگه اینکه من فقط position head  مار رو عوض میکنم و بدنه، هر کدوم از position قبلی
مهره قبلی پیروی میکنن درسته ؟
منظورم از map یک آرایه ۲ بعد برای ذخیره  محل مار و نقشه  بودش .(مثل یک عکس که یک آرایه ۲ بعدی از پیکسل هاست )
آره اگر سر مار رو عوض کنی باید خودکاربقیه بدنش هم براساس موقعیت جدید عوض بشن

1 پاسخ

+4 امتیاز

به قول معروف برو حالشو ببر

 

//*****************[email protected]************************
//age tooye bazi kardan moshkel dashti safhato fullscreen kon
//dokme haye "A,S,D,W" mitooni baraye harekat estefade koni
//*************************************************************
#include <vector>
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <ctime>

class Snake
{
private:
    int x,z,Dollars,y,Bonus,time,tail;
    char *map;
    bool L,R,D,U,A;
    std::vector <int> past;

public:
    Snake()
    {
        map = new char [2000];
        L = 0;
        R = 1;
        D = 0;
        U = 0;
        A = 0;
        tail = 1;
        x = 1000;
        Dollars = 0;
        Bonus = 0;
        time = 40;
        z = 1;
	}

    ~Snake()
    {
        delete [] map;
    }

    void Graphics ();
    void GameLogic();
    void KEYBOARD ();
    void Pineapple();
    int GameOver ();
    void Start();
    friend void clearscreen();
    friend void sp();
    friend void s();
};
void clearscreen()
{
    HANDLE hOut;
    COORD Position;

    hOut = GetStdHandle(STD_OUTPUT_HANDLE);

    Position.X = 0;
    Position.Y = 0;
    SetConsoleCursorPosition(hOut, Position);
}

void sp(int choosecolor)
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), choosecolor);
}
void s()
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);

}
void Snake::Start()
{
    for(int p = 0;p < 2000;p++)
    {
        map[p] = ' ';
    }

    map[ x ] = char(219);
    Pineapple();
    Graphics();
}
int Snake::GameOver()
{
    Sleep(2500);
    system("cls");
    std::cout <<     std::endl << "Kesafat!!! Bakhidi!!! ...You earned " << Dollars + Bonus << " Dollars...";
    Sleep(1800);
    return 0;
}
void Snake::Graphics()
{
    sp(697);
    std::cout << Dollars + Bonus << " Apple ";
    std::cout << "\n";
    s();
    for(int u = 0;u < 50;u++)
    {
        sp(750);
        std::cout << char(219);
        s();
    }

	std::cout <<     std::endl;
    for(int x1 = 0;x1 < 2000 ; x1++)
    {
        if(x1 % 50 == 0 && x1 != 0)
        {
            std::cout <<     std::endl;
        }
        if(x1 % 50 == 0 || (x1-(x1 / 50)) % 49 == 0)
		{
            map[x1] = char(219);
            sp(750);
            std::cout << map[x1];
            s();
		}
	else if(map[x1]!=char(219) && map[x1]!=map[z])
    {
        std::cout << map[x1];
    }
    else if(x1 == z)
    {
        sp(10);
        std::cout << map[x1];
        s();
    }
    else
    {
        sp(750);
        std::cout << map[x1];
        s();
	}

    }

	std::cout <<     std::endl;
    for(int u = 0;u < 50;u++)
    {
        sp(750);
        std::cout << char(219);
        s();
    }
    if(U == 1 || D == 1)
	{
        Sleep(19);
    }
    if(map[z] == char(5))
    {
        time--;
        if(time == 0)
		{
            Dollars++;
            time = 40;
            Pineapple();
        }
    }

    clearscreen();
    GameLogic();
}

void Snake::Pineapple()
{
    map[z] = ' ';
    if(Dollars % 8 != 0 || Dollars == 0)
    {
        while(map[z] != ' ' && z % 50 != 0 && (z-(z/50)) % 49!= 0);
        {
            z = rand()%2000 + 1;
		}

	    map[z] = char(229);
    }
    else
    {
        while(map[z] != ' ' && z % 50 != 0 && (z-(z/50)) % 49 != 0);
        {
            z = rand()%2000 + 1;
        }
        map[z] = char(5);
    }

}

void Snake::KEYBOARD()
{
if(_kbhit())
{
    char key;
    key = _getch();
    switch( key )
    {
        case 'd':
        {
            if (L == 0)
            {
                L = 0, U = 0, D = 0,
                R = 1;
			}
            break;
        }
        case 'w':
        {
            if (D == 0)
            {
                L = 0, D = 0, R = 0,
                U = 1;
            }
        break;
        }

        case 'a':
        {
            if (R == 0)
            {
                D = 0, U = 0, R = 0,
                L = 1;
			}
        break;
        }

        case 's':
        {
            if (U == 0)
            {
                L = 0, U = 0, R = 0,
                D = 1;
            }
        break;
        }

    }

}
}
void Snake::GameLogic()
{
    past.insert(past.begin(),x);
    KEYBOARD();
    if(R == 1)
    {
        x++;
    }
    else if(L == 1)
    {
        x--;
    }
    else if(U == 1)
    {
        x-= 50;
    }
    else
    {
        x+= 50;
    }
    if(map[ x ] == char(219) || x % 50 == 0 || x > 2000 || x < 0 || (x-(x / 50)) % 49 == 0)
    {
        GameOver();
        return;
    }
    if(map[x] == char(229))
    {
        A = true;
        tail++;
        Pineapple();
        Dollars++;
	}
    else if (map[x] == char(5))
    {
        A = true;
        tail++;
        Pineapple();
        Bonus+=time;
    }

    map[x] = char(219);
    if(A == false)
    {
        y = past[past.size() - tail];
        map[y] = ' ';
    }

    A = false;
    if(tail!=1)
    {
        for(int u = past.size() - 2;u > 0;u--)
		{
            past[u+1] = past[u];
        }
    past.erase(past.end()-tail);
    }
    else
    {
        past.erase(past.begin());
    }
    Graphics();
}
int main()
{
    srand((unsigned)time(0));
    Snake SNAKE;
    SNAKE.Start();
}

درباره سوالتون باید بگم توی سی پلاس تحت کنسول تنها راهش همینه اما توی وی سی پلاس میشه از آبجکت ها استفاده کرد و اونارو حرکت داد بگو تا با ویبی یه حرفه ایش بذارم البته یه راهش اینه حتی میتونی از directx هم استفاده کنی

پاسخ داده شده فروردین 27, 1393 بوسیله ی Fire360Boy (امتیاز 2,524)   6 24 43
ویرایش شده فروردین 28, 1393 بوسیله ی Fire360Boy
ممنونم که کدش را گذاشتید
ولی من کد نمیخواستم
فک کنم کد یه مشکلی هم داره ...
 "Kesafat!!! Bakhidi!!! ...!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
نه خیرم        اتفاقاً درسته درسته درسته اگه مشتری نیستی تو سر مال نزن
به سلامت میتونی بری جای دیگه
بنده خدا برنامه هه که احساساتی میشه فحش میده

درباره سوالتون باید بگم توی سی پلاس تحت کنسول تنها راهش همینه اما توی وی سی پلاس میشه از آبجکت ها استفاده کرد و اونارو حرکت داد بگو تا با ویبی یه حرفه ایش بذارم البته یه راهش اینه حتی میتونی از directx هم استفاده کنی
سیبو که میخوره ارور میده!!!
شیرازی با چی کامپایل کردی که موقعی که سیبو!! رو میخوره ارور میده
عکس و ارورشو و اطلاعات مورد نیاز رو بزار تا دیباگ کنم

همونطور که میبینی من کامپایل کردم سه تا سیبم کوفت کرد اما ارور نداد
تو سرش نزدم که .. اشکالشو گفتم .. بده ؟
خیلی احساساتیه پس ...
با ویژوال.
من با سی پلاس میخوام فقط.
با vc++ یا borland c++خوبه
...