Probleme mit Schleifen

Gast #4019616
Lesenswert?

Hallo,

ich moechte Minesweeper programmieren und finde meinen Fehler einfach 
nicht.
Das Programm heangt sich immer auf wenn er die Arrays auf null setzen 
soll.

Die Randomzahl funktioniert auch nicht, obwohl sie es in einem anderem 
Programm schon hat.

Die If Abfrage in der ich Button GREEN Abfrage geht auch nur wenn ich 
entweder das Array markierer oder selected abfrage.

Vielleicht kann mir hier ja wer helfen.

Danke!
1
#include "ims_avga.h"
2
#include "io_api.h"
3
#include "tileset.h" 
4
#include <stdbool.h>
5
#include <util/delay.h>
6
#include <stdlib.h>
7

8

9

10

11
bool stop = false;
12

13

14

15
// Bilder
16
const char leer[] PROGMEM = {0};
17
const char mine[] PROGMEM = {6};
18
const char choose[] PROGMEM = {8};
19

20

21

22

23
int main( void )
24
{
25

26
//Variablen
27
uint16_t x_pos = 50;
28
uint16_t y_pos = 480;
29

30
uint16_t startx=8;   // Beginn des SPielfeldes
31
uint16_t starty=16;  // Beginn des SPielfeldes
32

33
uint16_t x=1;    // xPosition des Tiles auf dem Spielfeld
34
uint16_t y=2;    // yPosition des Tiles auf dem Spielfeld
35
uint16_t xpos=0;  // xPosition des Markierers
36
uint16_t ypos=0;  // yPosition des Markierers
37

38

39
uint16_t random;
40

41
uint16_t flag=0;
42

43
bool mienen=0;
44
bool pushed=0;
45
bool fahne=0;
46

47

48
uint16_t  spielfeld[12][12]; //wo sind die minen
49
uint16_t  markierer[12][12];  //fahne setzen ja nein
50
uint16_t  selected[12][12]; //ein feld frei gelegt ja nein
51

52

53
// Loads
54
avga_init(VGA2, x_pos, y_pos);
55

56
config_gamepad();
57
config_leds();
58
  
59
  //Zufallszahl
60

61
  //Arrays auf 0 setzen
62
  
63
      for (int a=0; a<13;a++)
64
      {
65
        for (int b=0; b<13;b++)
66
          {
67
            selected[a][b]=0;
68
            markierer[a][b]=0;
69
          }
70
      }
71
  
72

73
  //Mienen setzen
74
    for (int k=1; k<13;k++)
75
      {
76
        for (int l=2; l<13;l++)
77
          {
78
            random=generate_rand();
79
            if (random%2==1)
80
            {spielfeld[k][l]=1;}
81
            else 
82
            {spielfeld[k][l]=0;}
83
          }
84
      }
85

86
  // Background(Spielfeld)
87
    for (int i=1; i<13;i++)
88
      {
89
        for (int j=2; j<13;j++)
90
          {
91
            if (spielfeld[i][j]==1)
92
            background_draw(i,j,leer,1,1);
93
            else 
94
            background_draw(i,j,mine,1,1);
95
          }
96
      }
97

98

99

100
  while(1)
101
  {
102
    
103
    //Headline
104
    DrawCenteredText (0, PSTR("Minesweeper"));
105
  
106
        
107
      
108

109
    //Markieren
110
    
111

112
    
113
    if ((get_button(GREEN)==1) && (markierer[x][y]==0) && (flag==0) && (selected[x][y]==0))
114
    {
115
    flag=1;
116
    markierer[x][y]=1;  
117
    background_draw(x,y,mine,1,1);
118
    }
119

120
      
121
    if ((get_button(GREEN)==1) && (markierer[x][y]==1) && (flag==0) && (selected[x][y]==0))
122
    {
123
    flag=1;
124
    markierer[x][y]=0;  
125
    background_draw(x,y,leer,1,1);
126
    }
127

128
            
129
    if((get_button(GREEN)==0) && (flag==1))
130
    {
131
    flag=0;
132
    }
133

134
      
135
        //Bewegen
136
    overlay_draw_sprite(startx,starty,5);
137

138
    if (get_button(RIGHT)==1 && pushed==0 && startx <= 94)
139
    {
140
      pushed=1;
141
      overlay_draw_sprite(startx=startx+8,starty,5);
142
      x=x+1;
143
    
144
    
145
    }
146
    if (get_button(LEFT)==1 && pushed==0 && startx >= 16)
147
    {
148
      pushed=1;
149
      overlay_draw_sprite(startx=startx-8,starty,5);
150
      x=x-1;
151
      
152
    
153
    }
154
    if (get_button(UP)==1 && pushed==0 && starty >= 24 )
155
    {
156
      pushed=1;
157
      overlay_draw_sprite(startx,starty=starty-8,5);
158
      y=y-1;
159
    
160
    
161
    }
162
    if (get_button(DOWN)==1 && pushed==0 && starty <= 88)
163
    {
164
      pushed=1;
165
      overlay_draw_sprite(startx,starty=starty+8,5);
166
      y=y+1;
167
      
168
      
169
    
170
    }
171
  
172
    if (get_button(DOWN) == 0 && get_button(UP) == 0 && get_button(RIGHT) == 0 && get_button(LEFT) == 0 && pushed == 1)
173

174
      {
175
      pushed=0;
176
      }
177

178
  
179
    //Select
180

181
    if ((get_button(RED)==1))
182
    {
183
    background_draw(x,y,choose,1,1);
184
    selected[x][y]=1;
185
    }
186

187

188
  
189

190
    sync();
191

192

193
    
194
    overlay_clear();
195

196
    
197

198
  }
199
}

--

Für Quelltext haben wir hier [ c ] [ /c ] -Tags, wie man auch
leicht sehen kann, wenn man sich ein paar Sekunden Zeit nimmt, den 
Text zu lesen, der oberhalb des Editorfensters steht, freundlich mit 
"Formatierung" überschrieben ...

-rufus
#4019630
Lesenswert?

Deine Array besitzen jeweils 12 Elemente. In der Schleife laufen die 
Laufvariablen aber von 0 bis "<13", also von 0 bis 12, was 13 Elemente 
anspricht. Du musst die Abbruchbedingung in "<12" ändern, dann 
durchläufst Du die Elemente 0, 1, ... 11, was geneu den 12 Elementen 
Deines Arrays entspricht.


... und sicherlich bearbeitest Du Minen und keine Mienen, oder? ;-)
Gast #4019633
Lesenswert?

Peter II schrieb:
> schöner Speicher überschreiber
>
> uint16_t  selected[12][12];
>
> for (int b=0; b<13;b++)
>           {
>             selected[a][b]=0;
>
> man kann halt nicht 13 Elemente von 12 Elementen überschreiben.
>
> spätestens jetzt sollte du einfach die größe vom Array als Define global
> festzulegen.

oder einfach sizeof() benutzen
 * und x, y grenzewerte überwachen
 * und Code lesbarer schreiben
 *
#4021134
Lesenswert?

Minesweeper schrieb:
> Hey,
> danke erstmal fuer die Antworten.
> Ja Minen ;D...
> An den Arraygroessen hab ich gerade die ganze Zeit rumgefummelt gehabt,
> deswegen da die 12.

und genau deswegen solltest du Arraygrössen mittels einem #define 
festlegen
1
#define DATA_SIZE 8
2

3
uint8_t myData[ DATA_SIZE ];
4

5
int main()
6
{
7
  uint8_t i;
8

9
  for( i = 0; i < DATA_SIZE; i++ )
10
    myData[i] = 0;
11

12
  for( i = 0; i < DATA_SIZE; i++ )
13
    myData[i] = 2*i;
14

15
  for( i = 0; i < DATA_SIZE; i++ )
16
    printf( "%d \n", myData[i] );
17
}

Jetzt hast du nur eine einzige Stelle im Programm, an der die Größe des 
Arrays als Zahl auftaucht! Musst du die Zahl ändern (weil du zb zu wenig 
Speicher hast), dann passt der Präprozessor für dich all die anderen 
Stellen im Programm an, an denen genau diese Zahl relevant ist. Keine 
magischen Konstanten im Programmtext! Wenn es Zusammenhänge quer durch 
ein Programm gibt, dann die immer so formulieren, dass der Compiler die 
Anpassarbeit macht und nicht der Programmierer. Denn der Programmierer 
vergisst Dinge und macht Fehler. Der Präprozessor macht aber keine 
Fehler bei der Textersetzung.
Das alles kostet dir so gut wie keine Entwicklungszeit. Die Zeit, die du 
jetzt durch deine Grössefehler bereits verloren hast, ist zig-fach 
höher, als wenn du dich gleich ordentlich organisiert hättest. Das 
betrifft auch die Codeformatierung als Ganzes. Es ist meiner Meinung 
nach kein Zufall, dass immer die mit dem scheuslichsten Code auch die 
sind, die die dümmsten Fehler im Programm haben.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren