Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Jak dodawać kolejne elementy do gry typu snake ?

Ostatnio zmodyfikowano 2015-05-29 17:28
Autor Wiadomość
pekfos
» 2015-05-28 15:53:57
std::swap().
P-132895
arek213
Temat założony przez niniejszego użytkownika
» 2015-05-28 17:08:51
Nawet nie wiesz jak mi pomogłeś !

Teraz tylko jakoś musze ustawić aby czyściło mi tylko wybrane elementy tablicy oraz aby po dodaniu już 3 elementu nie robiły się dziury między wężem oraz uporządkować kod. Czy o to chodziło z tym swapem ?:

C/C++
#include <iostream>
#include <windows.h>
#include<cstdlib>
#include<conio.h>
#include<vector>
#include <algorithm>
#include<ctime>

using namespace std;

class Plansza
{
private:
    char sciana = 219;
   
public:
    char tablica[ 23 ][ 70 ];
   
    void wypelnij()
    {
        for( int i = 0; i < 23; i++ )
        {
            for( int j = 0; j < 70; j++ )
            {
                tablica[ i ][ j ] = 0;
            }
        }
       
        for( int j = 0; j < 70; j++ )
        {
            tablica[ 0 ][ j ] = sciana;
        }
       
        for( int i = 1; i < 23; i++ )
        {
            tablica[ i ][ 0 ] = sciana;
            tablica[ i ][ 69 ] = sciana;
        }
       
        for( int j = 0; j < 70; j++ )
        {
            tablica[ 22 ][ j ] = sciana;
        }
    }
    void rysuj() const
    {
        for( int i = 0; i < 23; i++ )
        {
            for( int j = 0; j < 70; j++ )
            {
                cout << tablica[ i ][ j ];
            }
            cout << endl;
        }
    }
};
class segment
{
public:
    int x, y;
   
    segment( int x, int y )
        : x( x )
         , y( y )
    { }
};
class waz
{
public:
    vector < segment > tab;
    char znak = 219;
};

class Jedzenie
{
public:
    char znak = '@';
    int poz_x;
    int poz_y;
    Jedzenie( int x, int y )
        : poz_x( x )
         , poz_y( y )
    { };
};

int main()
{
    Plansza mapa;
    Jedzenie jablko( 40, 15 );
    mapa.wypelnij();
    mapa.tablica[ jablko.poz_y ][ jablko.poz_x ] = jablko.znak;
   
    waz Waz;
    segment pierwszy( 39, 15 );
    Waz.tab.push_back( pierwszy );
    mapa.tablica[ Waz.tab[ 0 ].y ][ Waz.tab[ 0 ].x ] = Waz.znak;
    mapa.rysuj();
    char c = 'w';
    int a;
    int b;
    int d;
    int e;
   
    for( int j = 0;; ++j )
    {
       
        if( kbhit() )
        {
            c = getch();
        }
        for( int i = 0; i < Waz.tab.size(); ++i )
        {
            mapa.tablica[ Waz.tab[ i ].y ][ Waz.tab[ i ].x ] = ' ';
           
            d = Waz.tab[ i ].y;
            e = Waz.tab[ i ].x;
           
            if( i >= 1 )
            {
                Waz.tab[ i ].y = a;
                Waz.tab[ i ].x = b;
                mapa.tablica[ Waz.tab[ i ].y ][ Waz.tab[ i ].x ] = Waz.znak;
            }
           
            a = Waz.tab[ i ].y;
            b = Waz.tab[ i ].x;
            swap( d, a );
            swap( b, e );
           
            if( i == 0 )
            {
                switch( c )
                {
                case 's':
                    Waz.tab[ 0 ].y++;
                    break;
                case 'w':
                    Waz.tab[ 0 ].y--;
                    break;
                case 'a':
                    Waz.tab[ 0 ].x--;
                    break;
                case 'd':
                    Waz.tab[ 0 ].x++;
                    break;
                }
                mapa.tablica[ Waz.tab[ i ].y ][ Waz.tab[ i ].x ] = Waz.znak;
            }
           
            if( Waz.tab[ 0 ].y == jablko.poz_y && Waz.tab[ 0 ].x == jablko.poz_x )
            {
                srand( time( NULL ) );
                Waz.tab.push_back( segment( b, a ) );
                jablko.poz_y = rand() % 21 + 1;
                jablko.poz_x = rand() % 68 + 1;
                mapa.tablica[ jablko.poz_y ][ jablko.poz_x ] = jablko.znak;
                break;
            }
           
        }
        system( "cls" );
        mapa.rysuj();
    }
   
    return 0;
}
P-132901
pekfos
» 2015-05-28 20:06:18
Czy o to chodziło z tym swapem ?:
Mniej więcej. Wystarczyły by 2 zmienne: Dla głowy zapisujesz współrzędne i wykonujesz ruch, dla reszty podmieniasz zapisane współrzędne z tymi z aktualnie przerabianego segmentu.
P-132906
arek213
Temat założony przez niniejszego użytkownika
» 2015-05-28 20:27:25
Da się zrobić tak aby tylko czyściło te miejsca  których jest wąż ? Bo jak tak czyszcze całą konsole to dość dziwnie wygląda.

Próbuje to zrobić dla dwóch zmiennych i nie wychodzi.
P-132908
notabigthreat
» 2015-05-28 22:10:48
Sam nigdy nie próbowałem i nic nie gwarantuję. Możesz cofać kursor (
'\b'
) i nadpisywać zamiast czyścić ekran.
P-132914
stevy
» 2015-05-29 08:28:38
W plik nagłówkowym Windows.h masz wszystko czego potrzebujesz. Zakładam że Twój problem jest trywialny i nie oczekujesz robić tego szybciej niż przesuwać karetkę (tak, ten wskaźnik konsoli to karetka) w odpowiednie miejsca.

Będziesz potrzebował lekkiej znajomości swojego pierwszego uchwytu do okna (HANDLE z Windows.H) np. tak się ją deklaruje:

C/C++
HANDLE poruszanie = GetStdHandle( STD_OUTPUT_HANDLE ); // uchwyt do Twojego okienka

jest tam też:
C/C++
SetConsoleTextAttribute( poruszanie, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE ); //ustawia atrubuty wyświetlanego tekstu

czy w końcu coś co pozwoli Ci ustawić tą karetkę:
C/C++
COORD pozycja_karetki; // zawiera ona pola x i y

pozycja_karetki.x = 22;
pozycja_karetki.y = 11;
SetConsoleCursorPosition( poruszanie, Pozycja_karetki );
printf( "tekst w pozycji (22,11);

I wiele wiele innych. Snake to byłą moja 2 gra jaką napisałem, mniej więcej po 2 tygodniach od rozpoczęcia nauki programowania w C, więc mam do niej duży sentyment. Mam nadzieję, że pomogłem.
P-132917
arek213
Temat założony przez niniejszego użytkownika
» 2015-05-29 11:03:18
Jak się ucyzłeś języka, że jużpo dwóch tygodniach od nauki zaczęłeś pisać snake ? Jak długo go pisałeś ?
P-132923
stevy
» 2015-05-29 12:28:21
Właśnie pisząc gry nauczyłem się programować. Kółko i krzyżyk, snake czy sokoban dobrze wpływają na naukę algorytmowego myślenia. Samego snake pisałem koło tygodnia, bo brakowało mi wiedzy o samym języku, bibliotekach, funkcjach, itd., podobnjie jak Tobie. Kod miał koło 1000 linijek, może mniej... Oglądałem go ostatnio, aż się łezka w oku kręci:)
P-132924
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona