www.mikrocontroller.net

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


Autor: Herbert Köhler (planlos91)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Nils S. (kruemeltee) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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#...

Autor: Alex G. (alex94) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
wie wärs mit interrupts?

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Herbert Köhler (planlos91)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Wie wäre es damit

int AugenZahl1;   // Die Augenzahl von Würfel 1   0..5
int AugenZahl2;   // Die Augenzahl von Würfel 2   0..5
int AugenZahl3;   // Die Augenzahl von Würfel 3   0..5
int AugenZahl4;   // Die Augenzahl von Würfel 4   0..5
int AugenZahl5;   // Die Augenzahl von Würfel 5   0..5

...


int main()
{
  ...

  while( 1 ) {

    // behandle Würfel 1
    // wenn sein Schalter auf ein steht, dann würfelt er und
    // zählt seine Augenzahl rum. Wenn nicht, dann macht er nichts
    if( w0 == 0 ) {
      AugenZahl1++;
      if( AugenZahl1 > 5 )
        AugenZahl = 0;
    }

    // Würfel 1 hat gewürfelt (oder auch nicht, je nach Schalter)
    // aber auf jeden Fall kann seine Augenzahl angezeigt werden
    Steuer = wuerfel[0];
    Daten = leds[ AugenZahl1 ];

    // Ein wenig warten, damit die LEDs auch leuchten können
    wait();


    // behandle Würfel 2
    // wenn sein Schalter auf ein steht, dann würfelt er und
    // zählt seine Augenzahl rum. Wenn nicht, dann macht er nichts
    if( w1 == 0 ) {
      AugenZahl2++;
      if( AugenZahl2 > 5 )
        AugenZah2 = 0;
    }

    // Würfel 2 hat gewürfelt (oder auch nicht, je nach Schalter)
    // aber auf jeden Fall kann seine Augenzahl angezeigt werden
    Steuer = wuerfel[0];
    Daten = leds[ AugenZahl2 ];

    // Ein wenig warten, damit die LEDs auch leuchten können
    wait();

    ...
  }
}

void wait()
{
  int x;

  for( x = 0; x < 150; +x )
    ;
}


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.

Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal so als Gedankenanstoss...
main
....
while(1){
  for (i=0;1;5){
    If Taste[i] == 0{
      If Würfelnr[i][augenzahl] < 6 
        Würfelnr[i][augenzahl]++;
      else
        Würfelnr[i][augenzahl]=0;
    }
    Steuer = i;
    Daten = leds[ würfelnr[i][augenzahl] ];
  }
}
waitms(100);

Autor: Nils S. (kruemeltee) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.