Forum: Mikrocontroller und Digitale Elektronik Würfelspiel in C: Runde 2


von Herbert K. (planlos91)


Angehängte Dateien:

Lesenswert?

Hallo,
ich bins wieder, der mit dem Würfelspiel in C :)
Das Hardware Problem wurde inzwischen von meinem Lehrer behoben und ich 
habe selbst noch weiterprogrammiert und ein Stücken geschafft. Und zwar 
„würfeln“ jetzt alle Würfel und wenn man einen Schalter von einem 
x-beliebigen Würfel betätigt hält dieser an und zeigt das gewürfelte 
Ergebnis. Leider würfeln in der Zeit die anderen Würfel nicht weiter und 
die restlichen Aufgabenpunkte fehlen auch noch da ich keine Ahnung habe 
wie ich das realisieren soll.
Ich hoffe ihr könnt mir wieder ein wenig helfen, alleine schaffe ich das 
nicht.
Hier ist noch mal der Link zu meinem letzten Thread: 
Beitrag "Re: Würfelspiel programmieren in C, leider keine Ahnung wie"
Das Aufgabenblatt lade ich noch mal hoch.

Quelltext:
/**** globale Variablendeklaration 
*******************************************************/
sfr Daten=0x90; //Port1
sfr Steuer=0x0A0; //Port2
sfr Schalter=0x0B0; //Port3

bit merker0;
bit merker1;
bit merker2;
bit merker3;
bit merker4;

char wuerfel [5]={0xFE,0xFD,0xFB,0xF7,0xEF};  //die 5 würfel
char leds [6]={0x01,0x04,0x05,0x0C,0x0D,0x0E}; //die zaheln 1-6

//char aus[1]={0x00};



sbit w0=Schalter^0;
sbit w1=Schalter^1;
sbit w2=Schalter^2;
sbit w3=Schalter^3;
sbit w4=Schalter^4;

int i,y,b;
long int x;
int blub;





/**** Funktionen 
************************************************************************ 
*/
/**** Hauptprogramm 
**********************************************************************/
main()
{
while(1)  // Endlosschleife => Programmabbruch mit RESET
{
//Würfel 0
i=0;


  while(!w0&&!w1&&!w2&&!w3&&!w4){
  Daten=0x00;
  for(i=0;i<=6;i++)
  Steuer=wuerfel[i];
    Daten=leds[blub];
    for(x=0;x<=150;x++); //ich weis nicht wo das hinmuss
    if(blub>5) blub=0;
    else   blub++;
  }
  if (w0==1){
   Steuer=wuerfel[0];
   Daten=leds[blub];
   }

     if (w1==1){
   Steuer=wuerfel[1];
   Daten=leds[blub];
   }
     if (w2==1){
   Steuer=wuerfel[2];
   Daten=leds[blub];
   }
     if (w3==1){
   Steuer=wuerfel[3];
   Daten=leds[blub];
   }
     if (w4==1){
   Steuer=wuerfel[4];
   Daten=leds[blub];
   }

}    // Ende der Endlosschleife
}    // END MAIN

Mit freundlichen Grüßen,
Carsten

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

Benenn erstmal deine Variablen richtig und versuche den Code mal 
ordentlich einzurücken.
Indent nach K&R sieht jeder gern :)
http://de.wikipedia.org/wiki/Einr%C3%BCckungsstil#Variation:_Original_K.26R_.2F_Kernel_.2F_Linux_.2F_UNIX_.2F_Stroustrup

von Alex G. (alex94) Benutzerseite


Lesenswert?

Hi,
wie wärs mit interrupts?

Achso noch ein tip: Bunutze die C Formatanweisung des Forums :)
Alex

von Karl H. (kbuchegg)


Lesenswert?

Carsten Stulgies schrieb:

> habe selbst noch weiterprogrammiert und ein Stücken geschafft. Und zwar
> „würfeln“ jetzt alle Würfel und wenn man einen Schalter von einem
> x-beliebigen Würfel betätigt hält dieser an und zeigt das gewürfelte
> Ergebnis. Leider würfeln in der Zeit die anderen Würfel nicht weiter

Ich würde mal sagen, da würfelt überhaupt nur 1 Würfel. blub (welch 
selten dämlicher Name) hält die Augenzahl eines Würfels. Zumindest ist 
das die einzige Variable, die würfelähnliches Verhalten einprogrammiert 
bekommen hat.

>     if(blub>5) blub=0;
>     else   blub++;

Du hast ergo nur einen einzigen Würfel in deinem Programm, zeigst diesen 
aber auf allen LED-Würfel an. Kein Wunder, dass die immer alle dasselbe 
anzeigen.

Du brauchst 5 Variablen, wobei jede einzeln die Augenzahl eines eigenen 
Würfels repräsentiert.

von Herbert K. (planlos91)


Angehängte Dateien:

Lesenswert?

Hallo,
vielen Dank für die Antworten, das mit dem Einrücken tut mir leid wie 
haben das in der Schule groß nicht gelernt, aber ich habe mich bemüht 
das ganze ein wenig übersichtlicher zu gestalten.
Also, ich habe jetzt auf kbuchegg´s Rat für jeden Würfel eine eigene 
Schleife zum durchwürfeln. Aktuell sieht es so aus das alle Würfel 
würfeln und wenn man einen schalter betätigt geht der entsprechende 
Würfel aus und die restlichen würflen weiter. Leider zeigt der gestoppte 
Würfel kein Ergebnis mehr an. Ich hoffe ihr könnt mir sagen woran das 
liegt und wie ich die reslichen Aufgabenpunkte angehen soll.
Ich freue mich über Antworten.
Mir freundlichen Grüßen,
Carsten

von Karl H. (kbuchegg)


Lesenswert?

Primär liegt das meiner Meinung nach daran, dass du ziemlich konzept- 
und planlos an die Sache rangehst

Wie wäre es damit
1
int AugenZahl1;   // Die Augenzahl von Würfel 1   0..5
2
int AugenZahl2;   // Die Augenzahl von Würfel 2   0..5
3
int AugenZahl3;   // Die Augenzahl von Würfel 3   0..5
4
int AugenZahl4;   // Die Augenzahl von Würfel 4   0..5
5
int AugenZahl5;   // Die Augenzahl von Würfel 5   0..5
6
7
...
8
9
10
int main()
11
{
12
  ...
13
14
  while( 1 ) {
15
16
    // behandle Würfel 1
17
    // wenn sein Schalter auf ein steht, dann würfelt er und
18
    // zählt seine Augenzahl rum. Wenn nicht, dann macht er nichts
19
    if( w0 == 0 ) {
20
      AugenZahl1++;
21
      if( AugenZahl1 > 5 )
22
        AugenZahl = 0;
23
    }
24
25
    // Würfel 1 hat gewürfelt (oder auch nicht, je nach Schalter)
26
    // aber auf jeden Fall kann seine Augenzahl angezeigt werden
27
    Steuer = wuerfel[0];
28
    Daten = leds[ AugenZahl1 ];
29
30
    // Ein wenig warten, damit die LEDs auch leuchten können
31
    wait();
32
33
34
    // behandle Würfel 2
35
    // wenn sein Schalter auf ein steht, dann würfelt er und
36
    // zählt seine Augenzahl rum. Wenn nicht, dann macht er nichts
37
    if( w1 == 0 ) {
38
      AugenZahl2++;
39
      if( AugenZahl2 > 5 )
40
        AugenZah2 = 0;
41
    }
42
43
    // Würfel 2 hat gewürfelt (oder auch nicht, je nach Schalter)
44
    // aber auf jeden Fall kann seine Augenzahl angezeigt werden
45
    Steuer = wuerfel[0];
46
    Daten = leds[ AugenZahl2 ];
47
48
    // Ein wenig warten, damit die LEDs auch leuchten können
49
    wait();
50
51
    ...
52
  }
53
}
54
55
void wait()
56
{
57
  int x;
58
59
  for( x = 0; x < 150; +x )
60
    ;
61
}


Deine Code formatierung ist immer noch scheuslich. Bei jeder öffnenden { 
wird das nachfolgende eingerückt, bis wieder die schliessende } kommt!

Viel zuviele Variablen für nichts uasser dass man ständig überall 
rumkopieren muss. Da gibts die io und die merker und eigentlich machen 
alle dasselbe.

> Leider zeigt der gestoppte Würfel kein Ergebnis mehr an.
Doch das tut er. Aber er tut es so kurz, dass du es nicht mehr siehst.

von Werner (Gast)


Lesenswert?

Mal so als Gedankenanstoss...
1
main
2
....
3
while(1){
4
  for (i=0;1;5){
5
    If Taste[i] == 0{
6
      If Würfelnr[i][augenzahl] < 6 
7
        Würfelnr[i][augenzahl]++;
8
      else
9
        Würfelnr[i][augenzahl]=0;
10
    }
11
    Steuer = i;
12
    Daten = leds[ würfelnr[i][augenzahl] ];
13
  }
14
}
15
waitms(100);

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

>das mit dem Einrücken tut mir leid wie
>haben das in der Schule groß nicht gelernt, aber ich habe mich bemüht
>das ganze ein wenig übersichtlicher zu gestalten.

Naja, aber sieht ja schon besser aus, aber Rücke mit Tabs ein, nicht mit 
Leerzeichen.
Jedes mal nach "{" und Enter kommt einfach noch ein Tab, wenn du einen 
guten Editor hast, der nicht nach jedem Enter wieder an den Zeilenanfang 
geht.
Und zwischendrin haste auch einige vergessen.

Durch das wird der Code schon gut lesbar.

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.