Zufällige Stelle im Feld Frage!



  • Hallo an alle!
    Vielleicht haben einige meinen Beitrag von gestern gelesen, ansonsten:
    Ich programmiere erst seit 4 Tagen mittlerweile ungefähr, also bitte nicht all zu böse bei Anfängerfehlern schreiben!

    Das ist mein Programm:

    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <string.h>
    #include <math.h>
    
    int main(int argc, char *argv)
    
    {
        char feld[8][4]={ {'o','o','o','o'},
                          {'o','o','o','o'},
                          {'o','o','o','o'},
                          {'o','o','o','o'},
                          {'o','o','o','o'},
                          {'o','o','o','o'},
                          {'o','o','o','o'},
                          {'o','o','o','o'} };
        int x=0;
        int y=0;
        int i;
        int w=1;
        int s=1;
        int d=1;
        int a=1;
        char eingabe;
        int j;
    
        for(j=0;j<99;j++)
        {
        eingabe=getch();
        switch(eingabe)
        {
        case 'w' :  printf("rauf"); if(y>0) {y--;} ; feld[y][x]='x'; feld[y+1][x]='o';  break;    
        case 's' :  printf("runter"); if(y!=7) {y++;}; feld[y][x]='x'; feld[y-1][x]='o'; break; 
        case 'd' :  printf("rechts"); if(x!=3) {x++;}; feld[y][x]='x'; feld[y][x-1]='o'; break;
        case 'a' :  printf("links"); if(x>0) {x--;} feld[y][x]='x';  feld[y][x+1]='o'; break;    
        }
        printf("\n%d / %d\n",x,y);
    
        printf("\n              \n     +---+---+---+---+\n");
        for(i=0;i<8;i++)
        {
           printf("     | ");
           printf("%c",feld[i][0]);
           printf(" | ");
           printf("%c",feld[i][1]);
           printf(" | ");
           printf("%c",feld[i][2]);
           printf(" | ");
           printf("%c",feld[i][3]);
           printf(" | \n");
        }
        printf("     +---+---+---+---+\n\n\n\n\n\n\n\n\n\n\n");
        }
        getchar();
        return 0;   
    }
    

    Wie könnte ich da an einer zufälligen Stelle des Feldes ein 'p' einfügen?
    Das will dich dann einfach fressen und dann einen Punktestand hochzählen.
    Das hochzählen geht und das vergleichen glaub ich auch, also die positionen, aber das einfügen an einer zufälligen stelle außer natürlich an der stelle wo ich gerade bin!

    Hoffe auch Hilfe!



  • Hallo!
    Weiß ich bin unmöglich!
    Habe mir selbst die Frage beantwortet!
    Bin nur so ungedulgig, aber man soll ja selbst üben!

    Hier meine Lösung!
    Würd mich freuen wenn wer seine Meinung dazu abgibt!

    Nur time.h habe ich im internet geschaut, weil meine random zahl immer gleich war!

    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <string.h>
    #include <math.h>
    #include <time.h>
    
    int main(int argc, char *argv)
    
    {
        int zufall1;
        int zufall2;
        time_t t;
        time(&t);
        srand((unsigned int)t);
    
        char feld[8][4]={ {'o','o','o','o'},
                          {'o','o','o','o'},
                          {'o','o','o','o'},
                          {'o','o','o','o'},
                          {'o','o','o','o'},
                          {'o','o','o','o'},
                          {'o','o','o','o'},
                          {'o','o','o','o'} };
        int x=0;
        int y=0;
        int i;
        int w=1;
        int s=1;
        int d=1;
        int a=1;
        char eingabe;
        int j;
        int k;
        int punkte=0;
    
        for (k=0;k<99;k++)
        {
        zufall1 = rand()%7+1; 
        zufall2 = rand()%3+1; 
        feld[zufall2][zufall1]='p';
    
        for(j=0;j<99;j++)
        {
        eingabe=getch();
        switch(eingabe)
        {
        case 'w' :  /*printf("rauf");*/ if(y>0) {y--;} ; feld[y][x]='x'; feld[y+1][x]='o';  break;    
        case 's' :  /*printf("runter");*/  if(y!=7) {y++;}; feld[y][x]='x'; feld[y-1][x]='o'; break; 
        case 'd' :  /*printf("rechts");*/  if(x!=3) {x++;}; feld[y][x]='x'; feld[y][x-1]='o'; break;
        case 'a' :  /*printf("links");*/  if(x>0) {x--;} feld[y][x]='x';  feld[y][x+1]='o'; break;    
        }
    
        printf("\n(%d / %d)\n",x,y);
    
        printf("\n              \n     +---+---+---+---+\n");
        for(i=0;i<8;i++)
        {
           printf("     | ");
           printf("%c",feld[i][0]);
           printf(" | ");
           printf("%c",feld[i][1]);
           printf(" | ");
           printf("%c",feld[i][2]);
           printf(" | ");
           printf("%c",feld[i][3]);
           printf(" | \n");
        }
        printf("     +---+---+---+---+\n\n\n\n\n\n\n\n\n\n\n");
    
        if(feld[zufall2][zufall1]==feld[y][x])
        {
        zufall1=rand()%7+1;  zufall2=rand()%3+1; printf("\nPunkt gemacht!\n"); feld[zufall2][zufall1]='p';
        punkte++;
        printf("%d Punkte",punkte);
        }
    
        }
        }
        getchar();
        return 0;   
    }
    


  • es geht auch kürzer mit

    srand(time(NULL));
    
    zufall1=rand()%7+1;  zufall2=rand()%3+1;
    

    das Erzeugt Zufallszahlen im Bereich [1, 8] bzw [1, 4]. Aber Arrays werden ab 0 gezählt. zufall=rand()%8; ist eher das was du willst.

    btw. solltest du den Code übersichtlicher einrücken. Also nach jedem { eine Einrückungsstufe weiter und nur einen Anweisungsblock pro Zeile.



  • Danke!
    Werde ich beides umsetzen!



  • Hey!
    Das funktioniert echt gut!
    DANKE!



  • C pflegt eine einfache Anordnung der Werte im Speicher. Deshalb kannst du auch mit halb so vielen rand()'s sagen:

    feld[rand() % 32] = 'p';
    

    🙂

    Hmm, so einfach ist es doch nicht. feld[4] ist kein L-Wert, d.h. darf nicht auf der linken Seite einer Zuweisung stehen. Das ist so, weil man an Arrays als ganzes keine Zuweisungen machen darf. Aber man darf casten, wenn man weiss, was man tut:

    ((char *)feld)[rand() % 32] = 'p';
    

    Sieht aber schon ein wenig ugly aus.


Anmelden zum Antworten