Dependencies: Led-libary TextLCD mbed
Diff: main.cpp
- Revision:
- 13:cb068deacb6c
- Parent:
- 4:2acb70f9cd22
- Child:
- 14:8f3619df12f1
--- a/main.cpp Mon Feb 08 18:59:08 2016 +0000 +++ b/main.cpp Fri Apr 01 10:16:38 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); @@ -7,60 +8,192 @@ AnalogIn ldr(P0_12); AnalogIn poti(P0_11); //BusOut rgb(P0_9,P1_15,P0_21); -//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) -// übrige 8 LED für zeit-Anzeige des Zuges einer KI - InterruptIn Button0(P0_1); InterruptIn Button1(P1_16); InterruptIn Button2(P0_23); InterruptIn Button3(P0_10); InterruptIn Button4(P0_15); +BusIn btn(P1_16,P0_23,P0_10,P0_15,P0_1); +LedOut Feld (p6);//P6 +LedOut Home (p7);//P7 +LedOut Dice (p8);//P8 +//-> Würfel (ersten 3 LED in Binär-4. LED für 7. Zustand), Spieler, Referenz(auch RGB am board) + +TextLCD lcd(p21, p22, p23, p24, p25, p26,TextLCD::LCD20x4); + +InterruptIn DD_A(p29);//P29 +InterruptIn DD_B(p30);//P30 +InterruptIn DD_C(p35);//P35 +DigitalIn DD_D(p35); +BusIn DD(p29,p30);//P29,P30 + +//Dice Timer Random; -Timer Dice; +Timer RandomDice; Ticker DiceAnim; -void DiceStart(); -void DiceStop(); void DiceRun(); void setDice(char number); void DicePrint(); +void DiceCal(); //umrechning des 7.Zustands in eine Zahl zwischen 1 & 6 char dicePos = 0; char diceEn = 0; char diceTick = 0; char diceNum = 0; int16_t diceDecode [7]= {0x1,0x88,0x89,0xAA,0xAB,0x1BA,0x154}; - +//Game #define Feldgrose 10 #define Spieler 4 #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 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 ColorPrint(uint32_t color); +//Animations +char AnimField[Spieler*Feldgrose]; +char AnimStart[Spieler*Steine]; +char AnimZiel[Spieler*Steine]; +char AnimPos[Spieler*Steine]; +char AnimDo; //Feld_Animieren,Start Animieren, Ziel Animierenw +void AnimCal(); +//Core Interactions +void reset(); void MoveDo(); -void ColorPrint(uint32_t color); +void moveNext(); +void moveLast(); +void DiceStart(); +void DiceStop(); +//Button entprellung (funktioniert nicht...) +void btn0(); +void btn1(); +void btn2(); +void btn3(); +void btn4(); +char btnLast; +//Farben +uint32_t Farben[Spieler]; //Berechnete Hellichkeiten der Speiler fertig zur Ausgabe... +uint32_t Background = 0; //Hintergrund (Leerfeld) +uint32_t DiseC = 0x00FF00; //Würfelfarbe +void ColorPrint(uint32_t color); //vorher den Header senden (manuell...) + +char DD_last; +char DD_d; + +void dreh(); +void druck(); + +void up(); +void down(); +void accept(); +void exit(); +void print_menu(); +void print_pos(); +void print_default(); +void posUpdate(); +char ausfuehren(uint32_t postion); + +//string test (""); +// "1234567890123456789","1234567890123456789","1234567890123456789","1234567890123456789", ,"1234567890123456789","1234567890123456789","1234567890123456789", +const char * const text_ln0[] = {"MENU: ","Spiel-Menu: ","Anzeige-Menu: ","Speicher-Menu: ","","7.Zustand-Menu: ","Farben-Menu: ","Spiel-Menu: ","","Spielregeln-Menu: ","Hell./Sp.Led-Menu: ","Config-Menu: ","","Autplay-Menu: ","Wurfel-Menu: ","Ofline/Com-Menu: "}; +const char * const text_ln1[] = {"Spiel ","7.Zustand ","Farben ","Spiel ","","Disable "," ","Laden ","","Smeiszwang <I/0> ","Wert: <wert> ","Laden ","","Zeit ","Farbverhalten ","New "}; +const char * const text_ln2[] = {"Anzeige ","Spielregeln ","Hellichkeit/Sp.Led ","Config. ","","kleinstmoglich ","SP: 1 2 3 4 ","Speichern ","","Go Home first <I/0>","Sp.Led-Verhalten ","Speichern ","","Agro/Taktik ","Farb def ","Reset "}; +const char * const text_ln3[] = {"Speicher ","Autoplay ","Wurfel ","Ofline/Com ","","grostmoglich "," ","Reset ","","Ausfahrzwang <I/0> ","Andert: <wert> ","Reset ","","Enable/Manuell ","Hellichkeit ","Com "}; +char textPos[] = {0x0 ,0x1 ,0x2 ,0x3 ,0x4,0x5 ,0x6 ,0x7 ,0x8,0x9 ,0xA ,0xB ,0xC,0xD ,0xE ,0xF ,0x10,0x11}; + +char VHS = 0; +char mSelected[256]; +char depth = 0; +uint32_t postion = 0;//Dafür brauche ich die Methode +char mDiceEn = 5; + + +void btn0() +{ + if((btnLast&0x10)==(btn&0x10)) + return; + else + { + if((btn&0x10)>0) + reset(); + else + /*DoNothing*/; + } + btnLast=(btnLast&(0x1F-0x10))|(btn&0x10); +} + +void btn1() +{ + if((btnLast&0x01)==(btn&0x01)) + return; + else + { + if((btn&0x01)>0) + DiceStart(); + else + DiceStop(); + } + btnLast=(btnLast&(0x1F-0x01))|(btn&0x01); +} + +void btn2() +{ + if((btnLast&0x02)==(btn&0x02)) + return; + else + { + if((btn&0x02)>0) + moveNext(); + else + /*DoNothing*/; + } + btnLast=(btnLast&(0x1F-0x02))|(btn&0x02); +} + +void btn3() +{ + if((btnLast&0x04)==(btn&0x04)) + return; + else + { + if((btn&0x04)>0) + moveLast(); + else + /*DoNothing*/; + } + btnLast=(btnLast&(0x1F-0x04))|(btn&0x04); +} + +void btn4() +{ + if((btnLast&0x08)==(btn&0x08)) + return; + else + { + if((btn&0x08)>0) + MoveDo(); + else + /*DoNothing*/; + } + btnLast=(btnLast&(0x1F-0x08))|(btn&0x08); +} void reset() { @@ -68,6 +201,8 @@ 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; @@ -78,60 +213,6 @@ FeldPrint(); } -void btn2() -{ - Drann = 0; - PlayPos[1]=Steine+Feldgrose*Spieler; - //PlayPos[2]=Steine+Feldgrose*Spieler+1; - PlayPos[3]=Steine+Feldgrose*Spieler+2; - PlayPos[0]=Steine+Feldgrose*Spieler-1; - FieldGenerate(); - FieldPrint(); - FeldPrint(); - -} -void btn3() -{ - /* - diceNum=2; - diceEn=2; - Drann = 1; - PlayPos[(1<<2)+0]=5; - PlayPos[(1<<2)+1]=7; - PlayPos[(1<<2)+2]=10; - PlayPos[(1<<2)+3]=12; - DicePrint(); - FieldGenerate(); - FieldPrint(); - FeldPrint(); - GameCal(); - */ - port.printf("W%c%c\n",27+0x3E,27+0x7); - for(char i=0;i<Spieler;i++) - { - port.printf("w"); - ColorPrint(Farben[i]); - wait(1); - } -} -void btn4() -{ - /* - for(char i = 0;i<Spieler;i++) - PlayPos[i<<2]=4; - FieldGenerate(); - FieldPrint(); - */ - myled = 0; - rgb.set(0,0,0); - port.printf("LBtn 4 Pressed\n"); -} - -void btn4_() -{ - port.printf("LBtn 4 Released\n"); -} - void Control() { while(port.readable ()) @@ -175,8 +256,24 @@ case 'D': MoveDo(); break; + case 'E': + exit(); + break; + case 'F': + up(); + break; + case 'G': + down(); + break; + case 'H': + accept(); + break; case 'I': - reset(); + depth=0; + mSelected[0]=0; + print_default(); + mDiceEn=5; + reset(); break; } } @@ -192,41 +289,77 @@ //.attach(&main,[sek]); //.attach_us(&main,[micro-sec]); //.detach(); + Button0.mode(PullDown); + Button1.mode(PullDown); + Button2.mode(PullDown); + Button3.mode(PullDown); + Button4.mode(PullDown); + DD_A.mode(PullDown); + DD_B.mode(PullDown); + DD_C.mode(PullDown); + + wait(0.01); + + DD_A.rise(&dreh); + DD_A.fall(&dreh); + DD_B.rise(&dreh); + DD_B.fall(&dreh); + DD_C.rise(&druck); + DD_C.fall(&druck); + DD_last = DD; + DD_d=DD_D; + Button0.rise(&reset); - Button1.rise(&DiceStart); - Button1.fall(&DiceStop); + Button1.rise(&btn1); + Button1.fall(&btn1); Button2.rise(&btn2); + Button2.fall(&btn2); Button3.rise(&btn3); + Button3.fall(&btn3); Button4.rise(&btn4); - Button4.fall(&btn4_); - + Button4.fall(&btn4); + //myled = 0xFFF; port.baud(76800); port.format(8,Serial::None, 1); port.attach(&Control); /* - Farben[0]=0x001000;//Grün - Farben[1]=0x100000;//Rot - Farben[2]=0x000010;//Blau - Farben[3]=0x001010;//Gelb - //Farben[4]=0xFFFFFF;//Weiß + Farben[0]=0x00FF00;//Rot + Farben[1]=0xFF0000;//Blau + Farben[2]=0x0000FF;//Grun + Farben[3]=0x00FFFF;//Gelb + Background = 0; //Schwarz + DiseC = 0x00FF00; //Rot */ - Farben[0]=0x00FF00;//Grün - Farben[1]=0xFF0000;//Rot - Farben[2]=0x0000FF;//Blau - Farben[3]=0x00FFFF;//Gelb - + Farben[0]=0x000800;//Rot + Farben[1]=0x080000;//Blau + Farben[2]=0x000008;//Grun + Farben[3]=0x000808;//Gelb + Background = 0; //Schwarz + DiseC = 0x000800; //Rot + /* + Farben[0]=0xFFFFFF;//Weiß + Farben[1]=0xFFFFFF;//Weiß + Farben[2]=0xFFFFFF;//Weiß + Farben[3]=0xFFFFFF;//Weiß + Background = 0xFFFFFF;//Weiß + DiseC = 0xFFFFFF; //Weiß + */ + __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(Background); } __enable_irq(); - - + //reset(); + print_default(); while(1) ; } @@ -234,91 +367,93 @@ { 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(); - if(diceNum==7) - { - diceEn=3; - for(char i = 0;i<Steine;i++) - if((PlayPos[(Drann<<2)|i]>Steine -1)&&(PlayPos[(Drann<<2)|i] < Steine + Feldgrose*Spieler)) - for(char j = 1;j<=6;j++) - { - char temp = Field[(PlayPos[(Drann<<2)|i]- Steine + Feldgrose * Drann+j) % (Feldgrose*Steine)]; - if(temp>0) - { - temp--; //(Spieler<<2)|Stein - temp = (temp&0xC)>>2;//Spieler - if(temp!=Drann) - if(j<diceNum) - diceNum=j; - } - } - //PlayPos[(Drann<<2)|i] im Feld suchen, weiter setzen, wenn treffer, der kleiner als diceNum ->setzen von diceNum - }//DiceNum == 7 - if(diceNum==7) - diceNum=6; - port.printf("LDiceNum:%d\n",diceNum); + diceNum = (RandomDice.read_us()+diceNum)%7+1; + RandomDice.stop(); + RandomDice.reset(); + if(diceNum>=7) + DiceCal(); + //port.printf("LDiceNum:%d\n",diceNum); DicePrint(); GameCal(); } } } + +void DiceCal() +{ + if((diceEn==2)||(diceEn==3)) + { + if(diceNum>7) + diceNum=7; + if(diceNum==7) + { + diceEn=3; + for(char i = 0;i<Steine;i++) + if((PlayPos[(Drann<<2)|i]>3)&&(PlayPos[(Drann<<2)|i] < 44)) + for(char j = 1;j<=6;j++) + { + char temp = Field[(PlayPos[(Drann<<2)|i]- Steine + Feldgrose * Drann+j) % (Feldgrose*Steine)]; + if(temp>0) + { + temp--; //(Spieler<<2)|Stein + temp = (temp&0xC)>>2;//Spieler + if(temp!=Drann) + if(j<diceNum) + diceNum=j; + } + } + //PlayPos[(Drann<<2)|i] im Feld suchen, weiter setzen, wenn treffer, der kleiner als diceNum ->setzen von diceNum + }//DiceNum == 7 + if(diceNum==7) + diceNum=6; + //port.printf("LdiceNum:%d\n",diceNum); + } +} + void setDice(char number) { - if(diceEn==1) + if(diceEn==4) { - DiceAnim.detach(); - diceTick = 0; - Dice.stop(); - Dice.reset(); + port.printf("LWarning: diceEn:%d -> Game over\n",diceEn); } - diceEn = 2; - diceNum = number; - if(diceNum>7) - diceNum=7; - if(diceNum==7) + else if(diceEn<4) { - diceEn=3; - for(char i = 0;i<Steine;i++) - if((PlayPos[(Drann<<2)|i]>3)&&(PlayPos[(Drann<<2)|i] < 44)) - for(char j = 1;j<=6;j++) - { - char temp = Field[(PlayPos[(Drann<<2)|i]- Steine + Feldgrose * Drann+j) % (Feldgrose*Steine)]; - if(temp>0) - { - temp--; //(Spieler<<2)|Stein - temp = (temp&0xC)>>2;//Spieler - if(temp!=Drann) - if(j<diceNum) - diceNum=j; - } - } - //PlayPos[(Drann<<2)|i] im Feld suchen, weiter setzen, wenn treffer, der kleiner als diceNum ->setzen von diceNum - }//DiceNum == 7 - if(diceNum==7) - diceNum=6; - port.printf("LForceDice:%d\n",diceNum); - DicePrint(); - GameCal(); + port.printf("LdiceEn:%d\n",diceEn); + if(diceEn==1) + { + DiceAnim.detach(); + diceTick = 0; + RandomDice.stop(); + RandomDice.reset(); + } + diceEn = 2; + diceNum = number; + if(diceNum>=7) + DiceCal(); + //port.printf("LForceDice:%d\n",diceNum); + DicePrint(); + GameCal(); + } } + void DiceRun() { if(diceTick) @@ -338,18 +473,19 @@ { switch(diceEn) { - case 0: + case 0: //Schwarz & Drann überschreiben... myled=(myled&0xFF0); + myled=(myled&0x0FF)|(0x100<<Drann); port.printf("W%c%c\n",27,27); break; - case 1: + case 1: //Animation char dice_help = 0xFF-(1<<dicePos); myled=(myled&0xFF0)|(5)|(diceTick<<1); //myled = (myled&0xF)|(dice_help<<4); 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 ->Anzeigen myled=(myled&0xFF0)|(diceNum); //myled=myled|0xFF0; @@ -361,6 +497,12 @@ port.printf("W%c%c\n" , 27 +(diceDecode[diceNum-1]&0x3F),27 + ((diceDecode[diceNum-1]&0x1C0)>>6)); break; + case 4://Spiel beendet! Animation? + myled=(myled&0xFF0); + port.printf("W%c%c\n",27,27); + break; + case 5://Menu + break; } } @@ -368,16 +510,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 +532,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] } } @@ -407,60 +554,201 @@ if(Field[i]>0) Feld.WriteLed(Farben[((Field[i]- 1)&0x0C)>>2]); else - Feld.WriteLed(0); + Feld.WriteLed(Background); + //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(Background); + i++; + } + do + { + if(Ziel[j]>0) + Home.WriteLed(Farben[((Ziel[j]- 1)&0x0C)>>2]); + else + Home.WriteLed(Background); + 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 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 -void MoveRun() + 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(Background); + } + //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(Background); + i++; } - port.printf("\n"); + } + if((AnimDo&4)>0) + { + do + { + if(AnimZiel[j]>0) + Home.WriteLed(Farben[((AnimZiel[j]- 1)&0x0C)>>2]); + else + Home.WriteLed(Background); + j++; + }while(j < Steine*Spieler); + } __enable_irq(); } else + { FieldPrint(); + __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(Background); + } + //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(Background); + i++; + } + } + if((AnimDo&4)>0) + { + do + { + if(Ziel[j]>0) + Home.WriteLed(Farben[((Ziel[j]- 1)&0x0C)>>2]); + else + Home.WriteLed(Background); + j++; + }while(j < Steine*Spieler); + } + __enable_irq(); + } } void moveNext() @@ -471,6 +759,7 @@ break; else selected = (selected+1)%Steine; + AnimCal(); } void moveLast() @@ -481,6 +770,7 @@ break; else selected = (selected+3)%Steine; + AnimCal(); } void GameCal() @@ -491,9 +781,9 @@ char moglichAny = 1; for(char i = 0;i<Steine;i++) { - if(PlayPos[(Drann<<2)|i]>3) + if(PlayPos[(Drann<<2)|i]>=Steine) { - if(PlayPos[(Drann<<2)|i] > 43) + if(PlayPos[(Drann<<2)|i] >= (Steine+Spieler*Feldgrose)) drausen++; else feld++; @@ -545,9 +835,9 @@ //port.printf("LNormal...\n"); for(char i = 0;i<Steine;i++) { - if(PlayPos[(Drann<<2)|i]>Spieler-1) //Drausen + if(PlayPos[(Drann<<2)|i]>=Spieler) //Drausen { - if((PlayPos[(Drann<<2)|i]-Steine+diceNum) < Feldgrose*Spieler)//Zeil noch am Feld + if((PlayPos[(Drann<<2)|i]+diceNum) < (Steine+Feldgrose*Spieler))//Zeil noch am Feld { char temp = Field[(PlayPos[(Drann<<2)|i]- Steine + Feldgrose * Drann+diceNum) % (Feldgrose*Steine)]; //zielfeld if(temp>0) @@ -564,13 +854,15 @@ else {//Kollisionsberechnung ins Ziel... if((PlayPos[(Drann<<2)|i]+diceNum)<(Steine*2+ Feldgrose*Spieler))//Schiest nicht über das Ziel hinaus... - if(Ziel[PlayPos[(Drann<<2)|i]-Steine-Feldgrose*Spieler+diceNum]==0)//Zielfeld ist leer (enthält ja nur mich) + if(Ziel[(PlayPos[(Drann<<2)|i]-(Steine+Feldgrose*Spieler)+diceNum)|(Drann<<2)]==0)//Zielfeld ist leer (enthält ja nur mich) moglich[i]=1; } } } } + + //Anzeigen der Möglichkeiten & überhaupt möglich? moglichAny=0; myled = myled&0xF0F; for(char i = 0;i<Steine;i++) @@ -578,51 +870,42 @@ myled = myled|(moglich[i]<<i+4); moglichAny = moglichAny | moglich[i]; } - if(moglichAny) + + if(moglichAny) //Fahren möglich { selected = (last[Drann]+Steine-1)%Steine; moveNext(); MoveAnim.attach(&MoveRun,0.3); } - else + else //Fahren nicht möglich { - if(feld) - diceEn = 1; - else + if(feld<=0) //keine am Feld { - if(count<3) + if(count<2) { diceEn=0; count++; port.printf("LCount: %d\n",count); } } + else //Fahren nicht möglich,spieler am Feld & 6 gewürfelt + { + if(diceNum==6) + diceEn=0; + } } } void MoveDo() { - if(diceEn>1) + if((diceEn>1)&&(diceEn<4)) { - 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) //nicht Draußsen { - //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; //Ausfahren + char temp = Field[Drann*Feldgrose]; //Ansetzfeld wird analysiert if(temp>0) { //myled = myled|temp<<8; @@ -630,23 +913,334 @@ PlayPos[temp] = (temp & 0x03); //rücksetzung des Feldes... } } + else //Draußen + { + PlayPos[(Drann<<2)|selected] += diceNum; //Weitersetzen + //PlayPos[(Drann<<2)|selected] + 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) ]; + 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; - if(diceNum<6) + myled = myled&0xF0F; + count = 0; + FieldGenerate(); + //Check for Win! + char temp = 0; + char j = 0; + char running = 1; + do { - Drann = (Drann+1)%Spieler; + temp = 0; + for (char i = 0; i < Steine; i++) + if (Ziel[(Drann<<2)|i]>0) + temp++; + if((temp>=4)&&(diceEn>1)) + port.printf("LSpieler %d hat das Spiel beendet!\n",Drann); + if(temp==4) + Drann = (Drann+1)%Spieler; + else + { + if(j==0) + { + if(diceNum<6) + Drann = (Drann+1)%Spieler; + else + running = 0; + } + else + running = 0; + + } + diceEn = 0; + j++; + }while((j<=Spieler)&(running>0)); + if(running==1) + { + port.printf("LSpiel beendet!\n"); + diceEn = 4; } - diceEn = 0; - count = 0; DicePrint(); - myled = myled&0xF0F; - FieldGenerate(); FieldPrint(); FeldPrint(); + port.printf("LDrann:%d\n",Drann); } } + 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)); +} + +//http://www.repairfaq.org/REPAIR/F_SNES.html + +void dreh() +{ + char temp = DD; + if(DD_last == 3) + { + if(temp == 0) + DD_last = 0; + } + else + { + if(temp == 3) + { + if(DD_last == 1) + up(); + if(DD_last == 2) + down(); + } + DD_last = temp; + } +} + +void druck() +{ + if(DD_D==DD_d) + return; + else if(DD_D) + accept(); + DD_d=DD_D; +} + +char ausfuehren(uint32_t postion) +{ + char out = 1; + switch (postion) + { + case 0x5: + break; + default: + break; + } + return out; +} + +void posUpdate() +{ + postion = 0; + for(char i = 0;i<depth-1;i++) + postion = postion|(mSelected[i]<<(i*2)); +} + +void up() +{ + if(depth>0) + { + if(mSelected[depth-1]<1) + { + if(VHS==0) + mSelected[depth-1]=3; + else if(VHS==1) + mSelected[depth-1]=4; + else + mSelected[depth-1]=VHS; + } + else + mSelected[depth-1]--; + print_pos(); + } +} + +void down() +{ + if(depth>0) + { + char temp=3; + if(VHS==0) + temp=3; + else if(VHS==1) + temp=4; + else + temp=VHS; + if(mSelected[depth-1]>(temp-1)) + mSelected[depth-1]=0; + else + mSelected[depth-1]++; + print_pos(); + } +} + +void accept() +{ + if(depth>0) + { + postion = 0; + for(char i = 0;i<depth;i++) + postion = postion|(mSelected[i]<<(i*2)); + char temp = ausfuehren(postion); + if(temp>0) + { + if(mSelected[depth-1]==0) + { + exit(); + return; + } + else + { + mSelected[depth]=1; + depth++; + } + } + } + else + { + depth=1; + mDiceEn = diceEn; + if(mDiceEn==1) + { + DiceAnim.detach(); + diceTick = 0; + RandomDice.stop(); + mDiceEn=0; + } + if((mDiceEn==2)||(mDiceEn==3)) + { + MoveAnim.detach(); + MoveShow = 1; + MoveRun(); + } + diceEn=5; + DicePrint(); + //StartMenu-Anim + } + posUpdate(); + port.printf("Lpostion:%d\n",postion); + if(postion==0x6) + VHS=1; + else + VHS=0; + if(depth>0) + { + print_menu(); + print_pos(); + } + else + print_default(); +} + +void exit() +{ + if(depth>0) + { + depth--; + mSelected[depth]=0; + } + if(depth==0) + { + if(mDiceEn<5) + { + diceEn=mDiceEn; + if((mDiceEn==2)||(mDiceEn==3)) + MoveAnim.attach(&MoveRun,0.3); + mDiceEn=5; + } + } + posUpdate(); + if(postion==0x6) + VHS=1; + else + VHS=0; + if(depth>0) + { + print_menu(); + print_pos(); + } + else + print_default(); +} + +void print_menu() +{ + port.printf("DR\n"); + lcd.cls(); + lcd.locate(1,0); + lcd.printf(text_ln0[textPos[postion]]); + port.printf("D%c%c%s\n",28,27,text_ln0[textPos[postion]]); + lcd.locate(1,1); + lcd.printf(text_ln1[textPos[postion]]); + port.printf("D%c%c%s\n",28,28,text_ln1[textPos[postion]]); + lcd.locate(1,2); + lcd.printf(text_ln2[textPos[postion]]); + port.printf("D%c%c%s\n",28,29,text_ln2[textPos[postion]]); + lcd.locate(1,3); + lcd.printf(text_ln3[textPos[postion]]); + port.printf("D%c%c%s\n",28,30,text_ln3[textPos[postion]]); +} + +void print_pos() +{ + if (VHS==1) + { + lcd.locate(0,3); + // "--------------------" + lcd.printf(" "); + port.printf("D%c%c \n",27,27+3); + + lcd.locate(0,0); + if(mSelected[depth-1]==0) + { + port.printf("D%c%c<\n",27,27); + lcd.putc('<'); + } + else + { + port.printf("D%c%c \n",27,27); + lcd.putc(' '); + + lcd.locate(4*mSelected[depth-1],3); + lcd.putc('^'); + port.printf("D%c%c^\n",27+4*mSelected[depth-1],27+3); + } + } + else + { + for(char i=0;i<4;i++) + { + lcd.locate(0,i); + if((mSelected[depth-1]+0)==i) + { + if(i==0) + { + port.printf("D%c%c<\n",27,i+27); + lcd.putc('<'); + } + else + { + port.printf("D%c%c>\n",27,i+27); + lcd.putc('>'); + } + } + else + { + port.printf("D%c%c \n",27,i+27); + lcd.putc(' '); + } + } + } +} + +void print_default() +{ + lcd.cls(); + lcd.printf(" Spiel lauft..."); + lcd.locate(0,3); + lcd.printf("12345678901234567890"); + port.printf("D%c%c Spiel lauft... \n",27,27); + port.printf("D%c%c \n",27,28); + port.printf("D%c%c \n",27,29); + port.printf("D%c%c12345678901234567890\n",27,30); } \ No newline at end of file