a
Dependencies: Led-libary TextLCD mbed
Fork of Mbed-Mensch-8 by
Diff: main.cpp
- 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 +}