a

Dependencies:   Led-libary TextLCD mbed

Fork of Mbed-Mensch-8 by Projekte_werkstatt

Revision:
5:31d406df862a
Parent:
4:2acb70f9cd22
Child:
6:ca3d431f2daf
--- a/main.cpp	Mon Feb 08 18:59:08 2016 +0000
+++ b/main.cpp	Fri Mar 11 19:07:06 2016 +0000
@@ -1,5 +1,6 @@
 #include "mbed.h"
 #include "WS2812B.h"
+#include "TextLCD.h"
 
 I2C i2c(P0_5,P0_4);
 Serial port(P0_19,P0_18);
@@ -10,9 +11,11 @@
 //BusIn btn(P1_16,P0_23,P0_10,P0_15);
 
 RGBOut rgb(P0_21,P0_9,P1_15);
-
-LedOut Feld (P0_13);
-//LedOut Other(P0_13); //-> Würfel (ersten 3 LED in Binär-4. LED für 7. Zustand), Spieler, Start, Ziel, Referenz(auch RGB am board)
+                    //Old: P0_13
+LedOut Feld (P1_23);//P1_23 ->14
+LedOut Home (P1_20);//P1_20->13
+LedOut Dice (P1_21);//P1_21->12
+//-> Würfel (ersten 3 LED in Binär-4. LED für 7. Zustand), Spieler, Start, Ziel, Referenz(auch RGB am board)
 // übrige 8 LED für zeit-Anzeige des Zuges einer KI
 
 InterruptIn Button0(P0_1);
@@ -22,7 +25,7 @@
 InterruptIn Button4(P0_15);
 
 Timer Random;
-Timer Dice;
+Timer RandomDice;
 
 Ticker DiceAnim;
 void DiceStart();
@@ -41,8 +44,8 @@
 #define Steine 4
 
 char PlayPos[Spieler*Steine];   //Zahl zwischen 0 & 47 ((0xC0 -> Spieler)>>2 / 0x03 -> Stein)
-char Start[Spieler];           //Enthält den Index für PlayPos (nur das 'normale' Spielfend)
-char Ziel[Spieler];            //Enthält den Index für PlayPos (nur das 'normale' Spielfend)
+char Start[Spieler*Steine];           //Enthält den Index für PlayPos (nur das 'normale' Spielfend)
+char Ziel[Spieler*Steine];            //Enthält den Index für PlayPos (nur das 'normale' Spielfend)
 char Drann;                    //Spieler, der drann ist
 char count;                    //Für 6er & mehrfaches Würfeln beim Ansetzen
 char last[Spieler];            //zuletzt benutzte Spielstein, der zuletzt benutzt wurde
@@ -62,12 +65,20 @@
 void MoveDo();
 void ColorPrint(uint32_t color);
 
+char AnimField[Spieler*Feldgrose];
+char AnimStart[Spieler*Steine];           
+char AnimZiel[Spieler*Steine];
+char AnimDo;
+void AnimCal();
+
 void reset()
 {
     MoveAnim.detach();
     DiceAnim.detach();
     for(char i = 0;i<Spieler*Steine;i++)
         PlayPos[i]=i%4;
+    for (char i = 0; i < Spieler; i++)
+        last[i]=0; 
     Drann=0;
     diceEn=0; 
     myled = myled&0xF0F;
@@ -80,6 +91,22 @@
 
 void btn2()
 {
+    reset();
+    for(char i = 0;i<Spieler;i++)
+    PlayPos[i*Spieler]=Steine+Spieler*Feldgrose;
+    FieldGenerate();
+    FieldPrint();
+    FeldPrint();
+    /*
+    for(char i = 0; i<Spieler;i++)
+        for(char j = 0; j<Steine;j++)
+            Start[(i<<2)|j] = ((i<<2)|j)+1;
+    for(char i = 0; i<Spieler;i++)
+        for(char j = 0; j<Steine;j++)
+            Ziel[(i<<2)|j] = ((i<<2)|j)+1;
+    FeldPrint();
+    */
+    /*
     Drann = 0;
     PlayPos[1]=Steine+Feldgrose*Spieler;
     //PlayPos[2]=Steine+Feldgrose*Spieler+1;
@@ -87,9 +114,10 @@
     PlayPos[0]=Steine+Feldgrose*Spieler-1;
     FieldGenerate();
     FieldPrint();
-    FeldPrint();   
-    
+    FeldPrint();
+    */ 
 }
+
 void btn3()
 {
     /*
@@ -114,6 +142,7 @@
         wait(1);
     }
 }
+
 void btn4()
 {
     /*
@@ -192,6 +221,7 @@
     //.attach(&main,[sek]);
     //.attach_us(&main,[micro-sec]);
     //.detach();
+    wait(0.01);
     
     Button0.rise(&reset);
     Button1.rise(&DiceStart);
@@ -216,17 +246,18 @@
     Farben[1]=0xFF0000;//Rot
     Farben[2]=0x0000FF;//Blau
     Farben[3]=0x00FFFF;//Gelb
-    
     __disable_irq();
     for(char i = 0;i<Spieler;i++)
     {
         Feld.WriteLed(Farben[i]);
         for(char j = 0;j<Feldgrose-1;j++)
-            Feld.WriteLed(0);
+            if((j==(Feldgrose-2))&(i==(Spieler-1)))
+                Feld.WriteLed(0xFFFFFF);
+            else
+                Feld.WriteLed(0);
     }
     __enable_irq();
-    
-    
+    //reset();
     while(1) ;        
 }
 
@@ -234,26 +265,27 @@
 {
     if(diceEn==0)
     {
-    Dice.start();
+    RandomDice.start();
     DiceAnim.attach(&DiceRun,0.1);
     diceEn = 1;
     diceTick = 1;
     DicePrint();
     }
 }
+
 void DiceStop()
 {
     if(diceEn==1)
     {
-        if(Dice.read_us()> 200)
+        if(RandomDice.read_us()> 200)
         {
             DiceAnim.detach();
             diceEn = 2;
             diceTick = 0;
             diceNum = Random.read_us()%7;
-            diceNum = (Dice.read_us()+diceNum)%7+1;
-            Dice.stop();
-            Dice.reset();
+            diceNum = (RandomDice.read_us()+diceNum)%7+1;
+            RandomDice.stop();
+            RandomDice.reset();
             if(diceNum==7)
             {
                 diceEn=3;
@@ -281,14 +313,15 @@
         }
     }
 }
+
 void setDice(char number)
 {
     if(diceEn==1)
     {
         DiceAnim.detach();
         diceTick = 0;
-        Dice.stop();
-        Dice.reset();
+        RandomDice.stop();
+        RandomDice.reset();
     }
     diceEn = 2;
     diceNum = number;
@@ -319,6 +352,7 @@
     DicePrint();
     GameCal();
 }
+
 void DiceRun()
 {
     if(diceTick)
@@ -368,16 +402,21 @@
 {
     for(char i = 0; i<Spieler*Feldgrose;i++)
         Field[i]=0; //Feld zurücksetzen
+    for (char i = 0; i < Spieler*Steine; i++)
+    {
+        Ziel[i]=0;
+        Start[i]=0;
+    }
         
     for(char i = 0; i<Spieler;i++)
         for(char j = 0; j<Steine;j++)
         {
             if (PlayPos[(i<<2)|j] >= Steine)
             {
-                if (PlayPos[(i<<2)|j] > Steine * Feldgrose+Steine-1)
+                if (PlayPos[(i<<2)|j] >= (Spieler * Feldgrose + Steine))
                 {
-                    if (PlayPos[(i<<2)|j] < Steine * Feldgrose+Steine*2)
-                        Ziel[PlayPos[(i<<2)|j] - Steine * Feldgrose+Steine] = ((i<<2)|j) + 1;
+                    //if (PlayPos[(i<<2)|j] < Steine * Feldgrose+Steine*2)
+                        Ziel[(PlayPos[(i<<2)|j] - (Spieler * Feldgrose + Steine))|(i<<2)] = ((i<<2)|j) + 1;
                         //Ziel PlayPos[(i<<2)|j] - 44
                 }
                 else
@@ -385,7 +424,7 @@
                     //Feld (PlayPos[(i<<2)|j]- 4 + 10 * i) % 40
             }
             else
-                Start[PlayPos[(i<<2)|j]] = ((i<<2)|j)+1;
+                Start[PlayPos[(i<<2)|j]|(i<<2)] = ((i<<2)|j)+1;
                 //start PlayPos[(i<<2)|j]
         }
 }
@@ -408,38 +447,36 @@
             Feld.WriteLed(Farben[((Field[i]- 1)&0x0C)>>2]);
         else
             Feld.WriteLed(0);
+    //char Start[Spieler];
+    //char Ziel[Spieler];
+    char i = 0;
+    char j = 0;
+    while(i < Steine*Spieler)
+    {
+        if(Start[i]>0)
+            Home.WriteLed(Farben[((Start[i]- 1)&0x0C)>>2]);
+        else
+            Home.WriteLed(0);
+        i++;
+    }
+    do
+    {
+        if(Ziel[j]>0)
+            Home.WriteLed(Farben[((Ziel[j]- 1)&0x0C)>>2]);
+        else
+            Home.WriteLed(0);
+        j++;
+    }while(j < Steine*Spieler);
     __enable_irq();
 }
 
-/*
-char PlayPos[Spieler*Steine];  //Zahl zwischen 0 & 47 ((0xC0 -> Spieler)>>2 / 0x03 -> Stein)
-char PlayPosOld[Spieler*Steine];
-char Start[Spieler];           //Enthält den Index für PlayPos (nur das 'normale' Spielfend)
-char Ziel[Spieler];            //Enthält den Index für PlayPos (nur das 'normale' Spielfend)
-char Drann;                    //Spieler, der drann ist
-char count;                    //Für 6er & mehrfaches Würfeln beim Ansetzen
-char last[Spieler];            //zuletzt benutzte Spielstein, der zuletzt benutzt wurde
-char moglich[Steine];
-char selected;                 //der aktuell ausgewählte Zug
-char Field[Spieler*Feldgrose]; //Enthält den Index für PlayPos (nur das 'normale' Spielfend)
-uint32_t Farben[Spieler];      //Berechnete Hellichkeiten der Speiler fertig zur Ausgabe...
-void FieldPrint();             //Ausgabe auf Com-Port
-void FieldGenerate();          //Berechnung von PlayPos auf Start, Ziel, Field
-void FeldPrint();              //Ausgabe von Field auf den Led-Streifen (Feld) der Farben
-void GameCal();
-void moveNext();
-void moveLast();
-Ticker MoveAnim;
-void MoveRun();
-char MoveShow;
-void MovePrint();                */
-
-void MoveRun()
+void MoveRun() //Animation (zyklisch)
 {
     if(MoveShow)
         MoveShow=0;
     else
         MoveShow = 1;
+
     if(MoveShow>0)
     {
         __disable_irq();
@@ -460,7 +497,10 @@
         __enable_irq();
     }
     else
+    {
         FieldPrint();
+        FeldPrint();
+    }
 }
 
 void moveNext()
@@ -590,7 +630,7 @@
         diceEn = 1;
         else 
         {
-            if(count<3)
+            if(count<2)
             {
                 diceEn=0;
                 count++;
@@ -604,25 +644,12 @@
 {
     if(diceEn>1)
     {
-        if(PlayPos[(Drann<<2)|selected]<Steine)
+        if(moglich[selected]==1)
         {
-            PlayPos[(Drann<<2)|selected] = Steine;
-            char temp = Field[Drann*Feldgrose];
-            if(temp>0)
+            if(PlayPos[(Drann<<2)|selected]<Steine)
             {
-                //myled = myled|temp<<8;
-                temp--; //(Spieler<<2)|Stein
-                PlayPos[temp] = (temp & 0x03); //rücksetzung des Feldes...
-            }
-        }
-        else
-        {
-            PlayPos[(Drann<<2)|selected] += diceNum;
-            //PlayPos[(Drann<<2)|selected]
-            if((PlayPos[(Drann<<2)|selected]>=Steine)&&(PlayPos[(Drann<<2)|selected]<Steine+Spieler*Feldgrose))
-            {
-                //Field>0
-                char temp = Field[ ( PlayPos[(Drann<<2)|selected] - Steine + (Feldgrose * Drann) ) % (Feldgrose*Steine) ];
+                PlayPos[(Drann<<2)|selected] = Steine;
+                char temp = Field[Drann*Feldgrose];
                 if(temp>0)
                 {
                     //myled = myled|temp<<8;
@@ -630,6 +657,24 @@
                     PlayPos[temp] = (temp & 0x03); //rücksetzung des Feldes...
                 }
             }
+            else
+            {
+                PlayPos[(Drann<<2)|selected] += diceNum;
+                //PlayPos[(Drann<<2)|selected]
+                if((PlayPos[(Drann<<2)|selected]>=Steine)&&(PlayPos[(Drann<<2)|selected]<Steine+Spieler*Feldgrose))
+                {
+                    //Field>0
+                    char temp = Field[ ( PlayPos[(Drann<<2)|selected] - Steine + (Feldgrose * Drann) ) % (Feldgrose*Steine) ];
+                    if(temp>0)
+                    {
+                        //myled = myled|temp<<8;
+                        temp--; //(Spieler<<2)|Stein
+                        PlayPos[temp] = (temp & 0x03); //rücksetzung des Feldes...
+                    }
+                }
+            }
+            //else //nicht möglich
+            
         }
         MoveAnim.detach();
         last[Drann]=selected;
@@ -646,7 +691,8 @@
         FeldPrint();
     }
 }
+
 void ColorPrint(uint32_t color)
 {
     port.printf("%c%c%c%c\n",27+((color&0xFC0000)>>18),27+((color&0x03f000)>>12),27+((color&0x000FC0)>>6),27+(color&0x00003F));
-}
\ No newline at end of file
+}