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
boolstop=false;
12
13
14
15
// Bilder
16
constcharleer[]PROGMEM={0};
17
constcharmine[]PROGMEM={6};
18
constcharchoose[]PROGMEM={8};
19
20
21
22
23
intmain(void)
24
{
25
26
//Variablen
27
uint16_tx_pos=50;
28
uint16_ty_pos=480;
29
30
uint16_tstartx=8;// Beginn des SPielfeldes
31
uint16_tstarty=16;// Beginn des SPielfeldes
32
33
uint16_tx=1;// xPosition des Tiles auf dem Spielfeld
34
uint16_ty=2;// yPosition des Tiles auf dem Spielfeld
35
uint16_txpos=0;// xPosition des Markierers
36
uint16_typos=0;// yPosition des Markierers
37
38
39
uint16_trandom;
40
41
uint16_tflag=0;
42
43
boolmienen=0;
44
boolpushed=0;
45
boolfahne=0;
46
47
48
uint16_tspielfeld[12][12];//wo sind die minen
49
uint16_tmarkierer[12][12];//fahne setzen ja nein
50
uint16_tselected[12][12];//ein feld frei gelegt ja nein
--
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
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.
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? ;-)
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
*
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.
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.
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.
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_tmyData[DATA_SIZE];
4
5
intmain()
6
{
7
uint8_ti;
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.