a

Dependencies:   Led-libary TextLCD mbed

Fork of Mbed-Mensch-8 by Projekte_werkstatt

Revision:
6:ca3d431f2daf
Parent:
5:31d406df862a
Child:
7:6b4048a2b9ff
--- a/main.cpp	Fri Mar 11 19:07:06 2016 +0000
+++ b/main.cpp	Sat Mar 12 15:08:39 2016 +0000
@@ -68,7 +68,8 @@
 char AnimField[Spieler*Feldgrose];
 char AnimStart[Spieler*Steine];           
 char AnimZiel[Spieler*Steine];
-char AnimDo;
+char AnimPos[Spieler*Steine];
+char AnimDo; //Feld_Animieren,Start Animieren, Ziel Animierenw
 void AnimCal();
 
 void reset()
@@ -383,7 +384,7 @@
         
         port.printf("W%c%c\n" , 27 + diceTick+((dice_help&0x1F)<<1),27 + ((dice_help& 0xE0)>>5));
         break;
-        case 2:
+        case 2://Case 3 = Case 2 
         myled=(myled&0xFF0)|(diceNum);
         //myled=myled|0xFF0;
         
@@ -470,36 +471,176 @@
     __enable_irq();
 }
 
+void AnimCal()
+{
+    for(char i = 0; i<Spieler*Feldgrose;i++)
+        AnimField[i]=0; //Feld zurücksetzen
+    for (char i = 0; i < Spieler*Steine; i++)
+    {
+        AnimZiel[i]=0;
+        AnimStart[i]=0;
+    }
+    AnimDo=0;//Feld_Animieren,Start Animieren, Ziel Animieren
+
+    //char AnimDo; //Feld_Animieren,Start Animieren, Ziel Animierenw
+
+    for (char i = 0; i < Spieler*Steine; i++) //Hauptschleife
+        if(i==((Drann<<2)|selected))
+        {
+            if(moglich[selected]==1)
+            {
+                if(PlayPos[i]<Steine) //nicht Draußsen
+                {
+                    AnimDo = AnimDo|3;//Feld&Start
+                    AnimPos[i] = Steine; //Ausfahren
+                    char temp = Field[Drann*Feldgrose]; //Ansetzfeld wird analysiert
+                    if(temp>0)
+                    {
+                        //myled = myled|temp<<8;
+                        temp--; //(Spieler<<2)|Stein
+                        AnimPos[temp] = (temp & 0x03); //rücksetzung des Feldes...
+                    }
+                }
+                else //Draußen
+                {
+                    AnimDo = AnimDo|1; //Feld
+                    AnimPos[i] = PlayPos[i]+diceNum;; //Weitersetzen
+                    //PlayPos[(Drann<<2)|selected]
+                    if(AnimPos[i]<Steine+Spieler*Feldgrose) //noch nicht drinnen
+                    {
+                        //Field>0
+                        char temp = Field[ (AnimPos[i]-Steine+Feldgrose*Drann) % (Feldgrose*Steine) ];
+                        if(temp>0)
+                        {
+                            AnimDo = AnimDo|3;//Feld&Start
+                            //myled = myled|temp<<8;
+                            temp--; //(Spieler<<2)|Stein
+                            AnimPos[temp] = (temp & 0x03); //rücksetzung des Feldes...
+                        }
+                    }
+                    else
+                        AnimDo=AnimDo|7;//Feld&Ziel (Start auch wegen Hardware)
+                }
+            }
+            else
+                AnimPos[i] = PlayPos[i]; //Spieler-pos Kopieren, weil es nicht möglich ist...
+        }
+        else
+            AnimPos[i] = PlayPos[i]; //Spieler-pos Kopieren
+    //FieldGenerate -> Anim...
+    for(char i = 0; i<Spieler;i++)
+        for(char j = 0; j<Steine;j++)
+        {
+            if (AnimPos[(i<<2)|j] >= Steine)
+            {
+                if (AnimPos[(i<<2)|j] >= (Spieler * Feldgrose + Steine))
+                {
+                    //if (AnimPos[(i<<2)|j] < Steine * Feldgrose+Steine*2)
+                        AnimZiel[(AnimPos[(i<<2)|j] - (Spieler * Feldgrose + Steine))|(i<<2)] = ((i<<2)|j) + 1;
+                        //AnimZiel AnimPos[(i<<2)|j] - 44
+                }
+                else
+                    AnimField[(AnimPos[(i<<2)|j]- Steine + Feldgrose * i) % (Steine * Feldgrose)] = ((i<<2)|j) + 1;
+                    //Feld (AnimPos[(i<<2)|j]- 4 + 10 * i) % 40
+            }
+            else
+                AnimStart[AnimPos[(i<<2)|j]|(i<<2)] = ((i<<2)|j)+1;
+                //start AnimPos[(i<<2)|j]
+        }
+}
+
 void MoveRun() //Animation (zyklisch)
 {
     if(MoveShow)
-        MoveShow=0;
+        MoveShow = 0;
     else
         MoveShow = 1;
 
     if(MoveShow>0)
     {
-        __disable_irq();
         port.printf("F");
         for(char i = 0;i<Spieler*Steine;i++)
+        {
+            port.printf("%c",27+AnimPos[i]);
+        }
+        port.printf("\n");
+        
+        __disable_irq();
+        if((AnimDo&1)>0)
+        {
+            for(char i = 0;i<Spieler*Feldgrose;i++)
+                if(AnimField[i]>0)
+                    Feld.WriteLed(Farben[((AnimField[i]- 1)&0x0C)>>2]);
+                else
+                    Feld.WriteLed(0);
+        }
+        //char Start[Spieler];
+        //char Ziel[Spieler];
+        char i = 0;
+        char j = 0;
+        if((AnimDo&2)>0)
+        {
+            while(i < Steine*Spieler)
             {
-                if(i==((Drann<<2)|selected))
-                {
-                    if(PlayPos[i]<Steine)
-                        port.printf("%c",27+Steine);
-                        else
-                            port.printf("%c",27+PlayPos[i]+diceNum);
-                }
+                if(AnimStart[i]>0)
+                    Home.WriteLed(Farben[((AnimStart[i]- 1)&0x0C)>>2]);
                 else
-                    port.printf("%c",27+PlayPos[i]);
+                    Home.WriteLed(0);
+                i++;
             }
-        port.printf("\n");
+        }
+        if((AnimDo&4)>0)
+        {
+            do
+            {
+                if(AnimZiel[j]>0)
+                    Home.WriteLed(Farben[((AnimZiel[j]- 1)&0x0C)>>2]);
+                else
+                    Home.WriteLed(0);
+                j++;
+            }while(j < Steine*Spieler);
+        }
         __enable_irq();
     }
     else
     {
         FieldPrint();
-        FeldPrint();
+        __disable_irq();
+        if((AnimDo&1)>0)
+        {
+            for(char i = 0;i<Spieler*Feldgrose;i++)
+                if(Field[i]>0)
+                    Feld.WriteLed(Farben[((Field[i]- 1)&0x0C)>>2]);
+                else
+                    Feld.WriteLed(0);
+        }
+        //char Start[Spieler];
+        //char Ziel[Spieler];
+        char i = 0;
+        char j = 0;
+        if((AnimDo&2)>0)
+        {
+            while(i < Steine*Spieler)
+            {
+                if(Start[i]>0)
+                    Home.WriteLed(Farben[((Start[i]- 1)&0x0C)>>2]);
+                else
+                    Home.WriteLed(0);
+                i++;
+            }
+        }
+        if((AnimDo&4)>0)
+        {
+            do
+            {
+                if(Ziel[j]>0)
+                    Home.WriteLed(Farben[((Ziel[j]- 1)&0x0C)>>2]);
+                else
+                    Home.WriteLed(0);
+                j++;
+            }while(j < Steine*Spieler);
+        }
+        __enable_irq();
     }
 }
 
@@ -511,6 +652,7 @@
             break;
         else
             selected = (selected+1)%Steine;
+    AnimCal();
 }
 
 void moveLast()
@@ -521,6 +663,7 @@
             break;
         else
             selected = (selected+3)%Steine;
+    AnimCal();
 }
 
 void GameCal()
@@ -646,10 +789,10 @@
     {
         if(moglich[selected]==1)
         {
-            if(PlayPos[(Drann<<2)|selected]<Steine)
+            if(PlayPos[(Drann<<2)|selected]<Steine) //nicht Draußsen
             {
-                PlayPos[(Drann<<2)|selected] = Steine;
-                char temp = Field[Drann*Feldgrose];
+                PlayPos[(Drann<<2)|selected] = Steine; //Ausfahren
+                char temp = Field[Drann*Feldgrose]; //Ansetzfeld wird analysiert
                 if(temp>0)
                 {
                     //myled = myled|temp<<8;
@@ -657,11 +800,11 @@
                     PlayPos[temp] = (temp & 0x03); //rücksetzung des Feldes...
                 }
             }
-            else
+            else //Draußen
             {
-                PlayPos[(Drann<<2)|selected] += diceNum;
+                PlayPos[(Drann<<2)|selected] += diceNum; //Weitersetzen
                 //PlayPos[(Drann<<2)|selected]
-                if((PlayPos[(Drann<<2)|selected]>=Steine)&&(PlayPos[(Drann<<2)|selected]<Steine+Spieler*Feldgrose))
+                if(PlayPos[(Drann<<2)|selected]<Steine+Spieler*Feldgrose) //noch nicht drinnen
                 {
                     //Field>0
                     char temp = Field[ ( PlayPos[(Drann<<2)|selected] - Steine + (Feldgrose * Drann) ) % (Feldgrose*Steine) ];