Rand() - Funktion



  • Hey,
    beim programmieren meines Snake-Spiels muss man, wie bekanntlich Früchte "spawnen" lassen.

    Das wird bei mir mit dieser Funktion gemacht.

    int breite = 25;
    int höhe = 20;
    char Feld[20][25];
    
    int Frucht = 0;
    int xFrucht[] = { rand() % ((breite-1)-1)+1};
    int yFrucht[] = { rand() % ((höhe-1)-1)+1};
    
            void spawn_fruit()
    	     {	
    		Feld[yFrucht[Frucht]][xFrucht[Frucht]] = '@';
    		Frucht++;
             }
    


    Deswegen dürfen bei meiner Funktion nur Werte zwischen 1 und 25 bzw. 1 und 20 rauskommen.
    Dafür habe ich mir "rand()%(maxzahl-minzahl)+minzahl" rausgesucht.
    Leider funktioniert das nicht.

    Ein zweites Problem ist, das die Früchte immer an den selben stellen "spawnen", obwohl es Zufallszahlen sind.
    Ich habe deswegen extra immer eine neue Frucht[] erstellt, hat aber nichts geholfen.

    Danke für die Hilfe schonmal.



  • D.J. schrieb:

    int breite = 25;
    int höhe = 20;
    char Feld[20][25];
    

    <sarcasm> Jaaa, globale Variablen sind was Tolles 👍 </sarcasm>

    D.J. schrieb:

    int Frucht = 0;
    int xFrucht[] = { rand() % ((breite-1)-1)+1};
    int yFrucht[] = { rand() % ((höhe-1)-1)+1};
    

    Beschreib' bitte mal in eigenen Worten, was du glaubst was in diesen drei Zeilen passiert!

    D.J. schrieb:

    Dafür habe ich mir "rand()%(maxzahl-minzahl)+minzahl" rausgesucht. Leider funktioniert das nicht.

    Wird in der Funktion spawn_fruit ja auch nicht ausgeführt.

    D.J. schrieb:

    Ein zweites Problem ist, das die Früchte immer an den selben stellen "spawnen", obwohl es Zufallszahlen sind.

    Das ist dasselbe "Problem": rand() wird in deinem Codeschnipsel genau Zweimal aufgerufen. Einmal bei der Initialisierung von xFrucht[] und einmal bei der Initialisierung von yFrucht[] .

    D.J. schrieb:

    Ich habe deswegen extra immer eine neue Frucht[] erstellt, [...]

    Nein, das hast du nicht.



  • Beschreib' bitte mal in eigenen Worten, was du glaubst was in diesen drei Zeilen passiert!

    Naja jedesmal wenn ich ein neues Frucht-Array erstelle bekommt es eine neue Rnd-Zahl.

    <sarcasm>Jaaa, globale Variablen sind was Tolles 👍 </sarcasm>

    Für das was ich momentan programmiere und kann ist es eig. egal ob sie public,private usw. sind.



  • D.J. schrieb:

    Beschreib' bitte mal in eigenen Worten, was du glaubst was in diesen drei Zeilen passiert!

    Naja jedesmal wenn ich ein neues Frucht-Array erstelle bekommt es eine neue Rnd-Zahl.

    Ok, spielen wir das doch weiter durch: In welcher Zeilennummer erzeugt obiger Code ein "neues Frucht-Array"?

    D.J. schrieb:

    <sarcasm>Jaaa, globale Variablen sind was Tolles 👍 </sarcasm>

    Für das was ich momentan programmiere und kann ist es eig. egal ob sie public,private usw. sind.

    Eben genau nicht. Gerade am Anfang ist es esenziell, sich einen sauberen Stil anzugewöhnen. Bezogen auf Variablen: so lokal wie möglich!



  • k, spielen wir das doch weiter durch: In welcher Zeilennummer erzeugt obiger Code ein "neues Frucht-Array"?

    Naja jedesmall wenn ich die Funktion spawn_fruit() ausführe.



  • Na, eben ned. span_fruit() erhöht lediglich jedesmal Frucht . Da wird nichts "angelegt".
    Wie lernst du? Trial & Error?

    Poste mal den gesamten Code ...



  • // Snake.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <windows.h>
    #include <String>
    #include <conio.h>
    
    using namespace std;
    
    void Feld_Z();
    void spielen();
    
    int Score = 0;
    int Highscore = 0;
    
    int Level = 1;
    int Geschwindigkeit = ( 1/Level ) * 100;
    
    int breite = 25;
    int höhe = 20;
    char Feld[20][25] =		      {{   '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' },   // 0 = nichts , 1 = Schlange , 2 = Frucht , 3 = Wand
                                   {   '#' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , '#' },
                                   {   '#' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , '#' },
                                   {   '#' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , '#' },
                                   {   '#' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , '#' },
                                   {   '#' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , '#' },
                                   {   '#' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , '#' },
                                   {   '#' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , '#' },
                                   {   '#' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , '#' },
                                   {   '#' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , '#' },
                                   {   '#' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , '#' },
                                   {   '#' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , '#' },
                                   {   '#' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , '#' },
                                   {   '#' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , '#' },
                                   {   '#' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , '#' },
                                   {   '#' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , '#' },
                                   {   '#' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , '#' },
                                   {   '#' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , '#' },
                                   {   '#' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , '#' },
    							   {   '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' , '#' }};  
    
    int Frucht = 0;
    int xFrucht = rand() ;    
    int yFrucht = rand() ; 
    
    char Schlange[] = {'O'};
     int x = 5;	
     int y = 10;
     int Länge = 0;
    
    void Leerzeichen(int x)	{ for(int i = 0 ; i < x ; i++){ cout << " ";}};
    void Leerzeilen(int x)	{	for(int i = 0 ; i < x ; i++){ cout << endl;}};
    
    // /////////////////////////////////////////////////////////// FUNKTIONEN
    
    	void set_console(short hight, short width, LPCTSTR title) {
        HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
        SMALL_RECT size;
        COORD b_size;
    
        size.Left = 0;
        size.Top = 0;
        size.Right = width;
        size.Bottom = hight;
        b_size.X = width+1; //breite+1
        b_size.Y = hight+1; //höhe+1
    
        SetConsoleWindowInfo(hCon, true, &size);
        SetConsoleScreenBufferSize(hCon, b_size);
        SetConsoleTitle(title);
    }
    
    	void MoveForward()
    	{
    		do
    		{
    			x++;
    			Feld[y][x-Länge-1] = ' ';
    			spielen();
    			Sleep(Geschwindigkeit);
    		} while(_kbhit() == 0);
    	}
    
    	void MoveBack()
    	{
    		do
    		{
    			x--;
    			Feld[y][x+Länge+1] = ' ';
    			spielen();
    			Sleep(Geschwindigkeit);
    		} while(_kbhit() == 0);
    	}
    
        void MoveUp()
    	{
    		do
    		{
    			y--;
    			Feld[y+Länge+1][x] = ' ';
    			spielen();
    			Sleep(Geschwindigkeit);
    		} while(_kbhit() == 0);
    	}
    
    	void MoveDown()
    	{
    		do
    		{
    			y++;
    			Feld[y-Länge-1][x] = ' ';
    			spielen();
    			Sleep(Geschwindigkeit);
    		} while(_kbhit() == 0);
    
    	}
    
    	void spawn_fruit()
    	{	
    		yFrucht = yFrucht % ((höhe-2)-2)+2;
    		xFrucht = xFrucht % ((breite-2)-2)+2;	//rand()%(maxzahl-minzahl)+minzahl
    		Feld[yFrucht][xFrucht] = '@'; 
    	} 
    
    	void Feld_leeren()
    	{	
    		for(int j = 1 ; j < höhe-1 ; j++)
    		{
    			for(int i = 1 ; i < breite-1 ; i++)
    			{
    				Feld[j][i] = ' ';
    			}
    		}
    	}
    
    	void Feld_Z()
    	{
    		system("cls");
    		Leerzeilen(2);
    		for(int j = 0 ; j < höhe ; j++)
    		{ 
    			Leerzeichen(5);
    			for(int i = 0 ; i < breite ; i++)
    			{
    				cout << Feld[j][i];
    			}
    			cout << endl;
    		}
    	}
    
    	void spielen()
    	{
    		Feld[y][x] = Schlange[0];
    		Feld_Z();
    		Leerzeilen(2);
    		cout << "Score:" << Score;
    
    			if(Schlange[0] == Feld[yFrucht][xFrucht])
    		{
    			Länge++;
    			Feld[y][x-Länge] = Schlange[Länge];
    
    			Score = Score + 100;
    			spawn_fruit();
    		}
    
    		if(Schlange[0] == Feld[y][0] || Schlange[0] == Feld[y][25] || Schlange[0] == Feld[0][x] || Schlange[0] == Feld[20][x])
    		{
    			system("cls");
    			system("pause");
    		}
    
    		if(Score > Highscore)
    		{
    			Highscore = Score;
    		}  
    
    	}  
    
    	void Spiel()
    	{
    		Feld_leeren();
    		spawn_fruit();
    		system("color 0E");
    
    		while(true)
    		{
    		Feld[y][x] = Schlange[0];
    		Feld_Z();
    		Leerzeilen(2);
    		cout << "Score:" << Score ;
    
    		_kbhit();
    		if(_kbhit())
    		{
    			char Befehl = _getch();
    			switch(Befehl)
    			{
    				case 'w':  MoveUp();
    					break;
    				case 's':  MoveDown();
    					break;
    				case 'a':  MoveBack();
    					break;
    				case 'd':  MoveForward();
    					break;
    			}
    		}
    
    		}
    
    	}
    
    int _tmain(int argc, _TCHAR* argv[])
    {	
    	setlocale(LC_ALL, "German");
    	set_console( 26 , 79, _T("Snake V1.1"));
    
    	Spiel();
    
    }