Forum: Mikrocontroller und Digitale Elektronik Probleme mit Schleifen


von Minesweeper (Gast)


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

: Bearbeitet durch User
von Zähler (Gast)


Lesenswert?

Kleiner tip:
Arraygröße in indexzähler mal überprüfen.

von Peter II (Gast)


Lesenswert?

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.

von Thilo L. (bc107)


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? ;-)

von Zähler (Gast)


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
 *

von Peter II (Gast)


Lesenswert?

Zähler schrieb:
> oder einfach sizeof() benutzen

geht leider nur wenn man die Daten global hat, wenn sie einer Funktion 
übergeben werden geht es schon nicht mehr.

Und da er eh die größe je festlegen muss, kann er es auch im Define 
machen.

von Minesweeper (Gast)


Lesenswert?

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

Hab schon jegliche Variation ausprobiert, der Bildschirm gibt entwedern 
nur Schwarz oder ein Wirrwarr an Tiles aus.

von Walter (Gast)


Lesenswert?

Wieviel RAM hast du zur Verfügung?

von Minesweeper (Gast)


Lesenswert?

Ich hab 1Kbytes internal SRAM auf dem Microcontroller, ist ein 
ATmega168.

von abc (Gast)


Lesenswert?

Deine 3 Array verbraten schon fast den ganzen Speicher.
12 * 12 = 144 * 2Byte = 288 * 3Arrays = 864 Byte.

Du solltest wenigstens die Arrayspeicherwerte auf uint8_t ändern, damit 
wird der Speicherbedarf halbiert.

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.