Dependencies:   TextLCD mbed

Fork of Mbed-Mensch-1 by Projekte_werkstatt

Committer:
ladner
Date:
Mon Feb 08 18:59:08 2016 +0000
Revision:
4:2acb70f9cd22
Parent:
3:814d47b6991c
Child:
5:f4db4cd245e3

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ladner 0:e97a6a69fe4b 1 #include "mbed.h"
ladner 1:0eaa7682f7e1 2 #include "WS2812B.h"
ladner 0:e97a6a69fe4b 3
ladner 0:e97a6a69fe4b 4 I2C i2c(P0_5,P0_4);
ladner 0:e97a6a69fe4b 5 Serial port(P0_19,P0_18);
ladner 0:e97a6a69fe4b 6 BusOut myled(P1_8,P1_9,P1_10,P1_11,P1_0,P1_1,P1_3,P1_4,P1_6,P1_7,P1_12,P1_13);
ladner 0:e97a6a69fe4b 7 AnalogIn ldr(P0_12);
ladner 0:e97a6a69fe4b 8 AnalogIn poti(P0_11);
ladner 1:0eaa7682f7e1 9 //BusOut rgb(P0_9,P1_15,P0_21);
ladner 1:0eaa7682f7e1 10 //BusIn btn(P1_16,P0_23,P0_10,P0_15);
ladner 1:0eaa7682f7e1 11
ladner 1:0eaa7682f7e1 12 RGBOut rgb(P0_21,P0_9,P1_15);
ladner 1:0eaa7682f7e1 13
ladner 1:0eaa7682f7e1 14 LedOut Feld (P0_13);
ladner 1:0eaa7682f7e1 15 //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)
ladner 1:0eaa7682f7e1 16 // übrige 8 LED für zeit-Anzeige des Zuges einer KI
ladner 1:0eaa7682f7e1 17
ladner 1:0eaa7682f7e1 18 InterruptIn Button0(P0_1);
ladner 0:e97a6a69fe4b 19 InterruptIn Button1(P1_16);
ladner 0:e97a6a69fe4b 20 InterruptIn Button2(P0_23);
ladner 1:0eaa7682f7e1 21 InterruptIn Button3(P0_10);
ladner 1:0eaa7682f7e1 22 InterruptIn Button4(P0_15);
ladner 0:e97a6a69fe4b 23
ladner 1:0eaa7682f7e1 24 Timer Random;
ladner 1:0eaa7682f7e1 25 Timer Dice;
ladner 1:0eaa7682f7e1 26
ladner 1:0eaa7682f7e1 27 Ticker DiceAnim;
ladner 1:0eaa7682f7e1 28 void DiceStart();
ladner 1:0eaa7682f7e1 29 void DiceStop();
ladner 1:0eaa7682f7e1 30 void DiceRun();
ladner 1:0eaa7682f7e1 31 void setDice(char number);
ladner 1:0eaa7682f7e1 32 void DicePrint();
ladner 1:0eaa7682f7e1 33 char dicePos = 0;
ladner 1:0eaa7682f7e1 34 char diceEn = 0;
ladner 1:0eaa7682f7e1 35 char diceTick = 0;
ladner 1:0eaa7682f7e1 36 char diceNum = 0;
ladner 1:0eaa7682f7e1 37 int16_t diceDecode [7]= {0x1,0x88,0x89,0xAA,0xAB,0x1BA,0x154};
ladner 1:0eaa7682f7e1 38
ladner 1:0eaa7682f7e1 39 #define Feldgrose 10
ladner 1:0eaa7682f7e1 40 #define Spieler 4
ladner 1:0eaa7682f7e1 41 #define Steine 4
ladner 1:0eaa7682f7e1 42
ladner 1:0eaa7682f7e1 43 char PlayPos[Spieler*Steine]; //Zahl zwischen 0 & 47 ((0xC0 -> Spieler)>>2 / 0x03 -> Stein)
ladner 1:0eaa7682f7e1 44 char Start[Spieler]; //Enthält den Index für PlayPos (nur das 'normale' Spielfend)
ladner 1:0eaa7682f7e1 45 char Ziel[Spieler]; //Enthält den Index für PlayPos (nur das 'normale' Spielfend)
ladner 1:0eaa7682f7e1 46 char Drann; //Spieler, der drann ist
ladner 1:0eaa7682f7e1 47 char count; //Für 6er & mehrfaches Würfeln beim Ansetzen
ladner 1:0eaa7682f7e1 48 char last[Spieler]; //zuletzt benutzte Spielstein, der zuletzt benutzt wurde
ladner 1:0eaa7682f7e1 49 char moglich[Steine];
ladner 1:0eaa7682f7e1 50 char selected; //der aktuell ausgewählte Zug
ladner 1:0eaa7682f7e1 51 char Field[Spieler*Feldgrose]; //Enthält den Index für PlayPos (nur das 'normale' Spielfend)
ladner 1:0eaa7682f7e1 52 uint32_t Farben[Spieler]; //Berechnete Hellichkeiten der Speiler fertig zur Ausgabe...
ladner 1:0eaa7682f7e1 53 void FieldPrint(); //Ausgabe auf Com-Port
ladner 1:0eaa7682f7e1 54 void FieldGenerate(); //Berechnung von PlayPos auf Start, Ziel, Field
ladner 1:0eaa7682f7e1 55 void FeldPrint(); //Ausgabe von Field auf den Led-Streifen (Feld) der Farben
ladner 1:0eaa7682f7e1 56 void GameCal();
ladner 1:0eaa7682f7e1 57 void moveNext();
ladner 1:0eaa7682f7e1 58 void moveLast();
ladner 1:0eaa7682f7e1 59 Ticker MoveAnim;
ladner 1:0eaa7682f7e1 60 void MoveRun();
ladner 1:0eaa7682f7e1 61 char MoveShow;
ladner 1:0eaa7682f7e1 62 void MoveDo();
ladner 4:2acb70f9cd22 63 void ColorPrint(uint32_t color);
ladner 1:0eaa7682f7e1 64
ladner 1:0eaa7682f7e1 65 void reset()
ladner 1:0eaa7682f7e1 66 {
ladner 1:0eaa7682f7e1 67 MoveAnim.detach();
ladner 1:0eaa7682f7e1 68 DiceAnim.detach();
ladner 1:0eaa7682f7e1 69 for(char i = 0;i<Spieler*Steine;i++)
ladner 1:0eaa7682f7e1 70 PlayPos[i]=i%4;
ladner 1:0eaa7682f7e1 71 Drann=0;
ladner 1:0eaa7682f7e1 72 diceEn=0;
ladner 2:3a90b20958ff 73 myled = myled&0xF0F;
ladner 1:0eaa7682f7e1 74 DicePrint();
ladner 1:0eaa7682f7e1 75 rgb.set_RGB(0);
ladner 1:0eaa7682f7e1 76 FieldGenerate();
ladner 1:0eaa7682f7e1 77 FieldPrint();
ladner 1:0eaa7682f7e1 78 FeldPrint();
ladner 1:0eaa7682f7e1 79 }
ladner 1:0eaa7682f7e1 80
ladner 1:0eaa7682f7e1 81 void btn2()
ladner 1:0eaa7682f7e1 82 {
ladner 2:3a90b20958ff 83 Drann = 0;
ladner 2:3a90b20958ff 84 PlayPos[1]=Steine+Feldgrose*Spieler;
ladner 4:2acb70f9cd22 85 //PlayPos[2]=Steine+Feldgrose*Spieler+1;
ladner 4:2acb70f9cd22 86 PlayPos[3]=Steine+Feldgrose*Spieler+2;
ladner 4:2acb70f9cd22 87 PlayPos[0]=Steine+Feldgrose*Spieler-1;
ladner 1:0eaa7682f7e1 88 FieldGenerate();
ladner 1:0eaa7682f7e1 89 FieldPrint();
ladner 2:3a90b20958ff 90 FeldPrint();
ladner 2:3a90b20958ff 91
ladner 1:0eaa7682f7e1 92 }
ladner 1:0eaa7682f7e1 93 void btn3()
ladner 0:e97a6a69fe4b 94 {
ladner 4:2acb70f9cd22 95 /*
ladner 1:0eaa7682f7e1 96 diceNum=2;
ladner 1:0eaa7682f7e1 97 diceEn=2;
ladner 1:0eaa7682f7e1 98 Drann = 1;
ladner 1:0eaa7682f7e1 99 PlayPos[(1<<2)+0]=5;
ladner 1:0eaa7682f7e1 100 PlayPos[(1<<2)+1]=7;
ladner 1:0eaa7682f7e1 101 PlayPos[(1<<2)+2]=10;
ladner 1:0eaa7682f7e1 102 PlayPos[(1<<2)+3]=12;
ladner 4:2acb70f9cd22 103 DicePrint();
ladner 1:0eaa7682f7e1 104 FieldGenerate();
ladner 1:0eaa7682f7e1 105 FieldPrint();
ladner 1:0eaa7682f7e1 106 FeldPrint();
ladner 1:0eaa7682f7e1 107 GameCal();
ladner 4:2acb70f9cd22 108 */
ladner 4:2acb70f9cd22 109 port.printf("W%c%c\n",27+0x3E,27+0x7);
ladner 4:2acb70f9cd22 110 for(char i=0;i<Spieler;i++)
ladner 4:2acb70f9cd22 111 {
ladner 4:2acb70f9cd22 112 port.printf("w");
ladner 4:2acb70f9cd22 113 ColorPrint(Farben[i]);
ladner 4:2acb70f9cd22 114 wait(1);
ladner 4:2acb70f9cd22 115 }
ladner 1:0eaa7682f7e1 116 }
ladner 1:0eaa7682f7e1 117 void btn4()
ladner 1:0eaa7682f7e1 118 {
ladner 1:0eaa7682f7e1 119 /*
ladner 1:0eaa7682f7e1 120 for(char i = 0;i<Spieler;i++)
ladner 1:0eaa7682f7e1 121 PlayPos[i<<2]=4;
ladner 1:0eaa7682f7e1 122 FieldGenerate();
ladner 1:0eaa7682f7e1 123 FieldPrint();
ladner 1:0eaa7682f7e1 124 */
ladner 1:0eaa7682f7e1 125 myled = 0;
ladner 1:0eaa7682f7e1 126 rgb.set(0,0,0);
ladner 1:0eaa7682f7e1 127 port.printf("LBtn 4 Pressed\n");
ladner 1:0eaa7682f7e1 128 }
ladner 1:0eaa7682f7e1 129
ladner 1:0eaa7682f7e1 130 void btn4_()
ladner 1:0eaa7682f7e1 131 {
ladner 1:0eaa7682f7e1 132 port.printf("LBtn 4 Released\n");
ladner 1:0eaa7682f7e1 133 }
ladner 1:0eaa7682f7e1 134
ladner 1:0eaa7682f7e1 135 void Control()
ladner 1:0eaa7682f7e1 136 {
ladner 1:0eaa7682f7e1 137 while(port.readable ())
ladner 0:e97a6a69fe4b 138 {
ladner 1:0eaa7682f7e1 139 char message = port.getc();
ladner 1:0eaa7682f7e1 140 switch(message)
ladner 1:0eaa7682f7e1 141 {
ladner 1:0eaa7682f7e1 142 case '1':
ladner 1:0eaa7682f7e1 143 setDice(1);
ladner 1:0eaa7682f7e1 144 break;
ladner 1:0eaa7682f7e1 145 case '2':
ladner 1:0eaa7682f7e1 146 setDice(2);
ladner 1:0eaa7682f7e1 147 break;
ladner 1:0eaa7682f7e1 148 case '3':
ladner 1:0eaa7682f7e1 149 setDice(3);
ladner 1:0eaa7682f7e1 150 break;
ladner 1:0eaa7682f7e1 151 case '4':
ladner 1:0eaa7682f7e1 152 setDice(4);
ladner 1:0eaa7682f7e1 153 break;
ladner 1:0eaa7682f7e1 154 case '5':
ladner 1:0eaa7682f7e1 155 setDice(5);
ladner 1:0eaa7682f7e1 156 break;
ladner 1:0eaa7682f7e1 157 case '6':
ladner 1:0eaa7682f7e1 158 setDice(6);
ladner 1:0eaa7682f7e1 159 break;
ladner 1:0eaa7682f7e1 160 case '7':
ladner 1:0eaa7682f7e1 161 setDice(7);
ladner 1:0eaa7682f7e1 162 break;
ladner 1:0eaa7682f7e1 163 case 'A':
ladner 1:0eaa7682f7e1 164 DiceStart();
ladner 1:0eaa7682f7e1 165 break;
ladner 1:0eaa7682f7e1 166 case 'a':
ladner 1:0eaa7682f7e1 167 DiceStop();
ladner 1:0eaa7682f7e1 168 break;
ladner 1:0eaa7682f7e1 169 case 'B':
ladner 1:0eaa7682f7e1 170 moveNext();
ladner 1:0eaa7682f7e1 171 break;
ladner 1:0eaa7682f7e1 172 case 'C':
ladner 1:0eaa7682f7e1 173 moveLast();
ladner 1:0eaa7682f7e1 174 break;
ladner 1:0eaa7682f7e1 175 case 'D':
ladner 1:0eaa7682f7e1 176 MoveDo();
ladner 1:0eaa7682f7e1 177 break;
ladner 1:0eaa7682f7e1 178 case 'I':
ladner 1:0eaa7682f7e1 179 reset();
ladner 1:0eaa7682f7e1 180 break;
ladner 1:0eaa7682f7e1 181 }
ladner 0:e97a6a69fe4b 182 }
ladner 0:e97a6a69fe4b 183 }
ladner 0:e97a6a69fe4b 184
ladner 1:0eaa7682f7e1 185 int main()
ladner 0:e97a6a69fe4b 186 {
ladner 1:0eaa7682f7e1 187 Random.start();
ladner 1:0eaa7682f7e1 188 //Random.stop();
ladner 1:0eaa7682f7e1 189 //Random.read_us();
ladner 1:0eaa7682f7e1 190
ladner 1:0eaa7682f7e1 191 //Ticker:
ladner 1:0eaa7682f7e1 192 //.attach(&main,[sek]);
ladner 1:0eaa7682f7e1 193 //.attach_us(&main,[micro-sec]);
ladner 1:0eaa7682f7e1 194 //.detach();
ladner 1:0eaa7682f7e1 195
ladner 1:0eaa7682f7e1 196 Button0.rise(&reset);
ladner 1:0eaa7682f7e1 197 Button1.rise(&DiceStart);
ladner 1:0eaa7682f7e1 198 Button1.fall(&DiceStop);
ladner 1:0eaa7682f7e1 199 Button2.rise(&btn2);
ladner 1:0eaa7682f7e1 200 Button3.rise(&btn3);
ladner 1:0eaa7682f7e1 201 Button4.rise(&btn4);
ladner 1:0eaa7682f7e1 202 Button4.fall(&btn4_);
ladner 1:0eaa7682f7e1 203
ladner 1:0eaa7682f7e1 204 //myled = 0xFFF;
ladner 1:0eaa7682f7e1 205 port.baud(76800);
ladner 1:0eaa7682f7e1 206 port.format(8,Serial::None, 1);
ladner 1:0eaa7682f7e1 207 port.attach(&Control);
ladner 4:2acb70f9cd22 208 /*
ladner 1:0eaa7682f7e1 209 Farben[0]=0x001000;//Grün
ladner 1:0eaa7682f7e1 210 Farben[1]=0x100000;//Rot
ladner 1:0eaa7682f7e1 211 Farben[2]=0x000010;//Blau
ladner 1:0eaa7682f7e1 212 Farben[3]=0x001010;//Gelb
ladner 1:0eaa7682f7e1 213 //Farben[4]=0xFFFFFF;//Weiß
ladner 4:2acb70f9cd22 214 */
ladner 4:2acb70f9cd22 215 Farben[0]=0x00FF00;//Grün
ladner 4:2acb70f9cd22 216 Farben[1]=0xFF0000;//Rot
ladner 4:2acb70f9cd22 217 Farben[2]=0x0000FF;//Blau
ladner 4:2acb70f9cd22 218 Farben[3]=0x00FFFF;//Gelb
ladner 1:0eaa7682f7e1 219
ladner 1:0eaa7682f7e1 220 __disable_irq();
ladner 1:0eaa7682f7e1 221 for(char i = 0;i<Spieler;i++)
ladner 1:0eaa7682f7e1 222 {
ladner 1:0eaa7682f7e1 223 Feld.WriteLed(Farben[i]);
ladner 1:0eaa7682f7e1 224 for(char j = 0;j<Feldgrose-1;j++)
ladner 1:0eaa7682f7e1 225 Feld.WriteLed(0);
ladner 1:0eaa7682f7e1 226 }
ladner 1:0eaa7682f7e1 227 __enable_irq();
ladner 1:0eaa7682f7e1 228
ladner 1:0eaa7682f7e1 229
ladner 1:0eaa7682f7e1 230 while(1) ;
ladner 0:e97a6a69fe4b 231 }
ladner 0:e97a6a69fe4b 232
ladner 1:0eaa7682f7e1 233 void DiceStart()
ladner 1:0eaa7682f7e1 234 {
ladner 1:0eaa7682f7e1 235 if(diceEn==0)
ladner 1:0eaa7682f7e1 236 {
ladner 1:0eaa7682f7e1 237 Dice.start();
ladner 1:0eaa7682f7e1 238 DiceAnim.attach(&DiceRun,0.1);
ladner 1:0eaa7682f7e1 239 diceEn = 1;
ladner 1:0eaa7682f7e1 240 diceTick = 1;
ladner 1:0eaa7682f7e1 241 DicePrint();
ladner 1:0eaa7682f7e1 242 }
ladner 1:0eaa7682f7e1 243 }
ladner 1:0eaa7682f7e1 244 void DiceStop()
ladner 0:e97a6a69fe4b 245 {
ladner 1:0eaa7682f7e1 246 if(diceEn==1)
ladner 1:0eaa7682f7e1 247 {
ladner 1:0eaa7682f7e1 248 if(Dice.read_us()> 200)
ladner 1:0eaa7682f7e1 249 {
ladner 1:0eaa7682f7e1 250 DiceAnim.detach();
ladner 1:0eaa7682f7e1 251 diceEn = 2;
ladner 1:0eaa7682f7e1 252 diceTick = 0;
ladner 1:0eaa7682f7e1 253 diceNum = Random.read_us()%7;
ladner 1:0eaa7682f7e1 254 diceNum = (Dice.read_us()+diceNum)%7+1;
ladner 1:0eaa7682f7e1 255 Dice.stop();
ladner 1:0eaa7682f7e1 256 Dice.reset();
ladner 1:0eaa7682f7e1 257 if(diceNum==7)
ladner 1:0eaa7682f7e1 258 {
ladner 1:0eaa7682f7e1 259 diceEn=3;
ladner 1:0eaa7682f7e1 260 for(char i = 0;i<Steine;i++)
ladner 4:2acb70f9cd22 261 if((PlayPos[(Drann<<2)|i]>Steine -1)&&(PlayPos[(Drann<<2)|i] < Steine + Feldgrose*Spieler))
ladner 1:0eaa7682f7e1 262 for(char j = 1;j<=6;j++)
ladner 1:0eaa7682f7e1 263 {
ladner 1:0eaa7682f7e1 264 char temp = Field[(PlayPos[(Drann<<2)|i]- Steine + Feldgrose * Drann+j) % (Feldgrose*Steine)];
ladner 1:0eaa7682f7e1 265 if(temp>0)
ladner 1:0eaa7682f7e1 266 {
ladner 1:0eaa7682f7e1 267 temp--; //(Spieler<<2)|Stein
ladner 1:0eaa7682f7e1 268 temp = (temp&0xC)>>2;//Spieler
ladner 1:0eaa7682f7e1 269 if(temp!=Drann)
ladner 1:0eaa7682f7e1 270 if(j<diceNum)
ladner 1:0eaa7682f7e1 271 diceNum=j;
ladner 1:0eaa7682f7e1 272 }
ladner 1:0eaa7682f7e1 273 }
ladner 1:0eaa7682f7e1 274 //PlayPos[(Drann<<2)|i] im Feld suchen, weiter setzen, wenn treffer, der kleiner als diceNum ->setzen von diceNum
ladner 1:0eaa7682f7e1 275 }//DiceNum == 7
ladner 1:0eaa7682f7e1 276 if(diceNum==7)
ladner 1:0eaa7682f7e1 277 diceNum=6;
ladner 1:0eaa7682f7e1 278 port.printf("LDiceNum:%d\n",diceNum);
ladner 1:0eaa7682f7e1 279 DicePrint();
ladner 1:0eaa7682f7e1 280 GameCal();
ladner 1:0eaa7682f7e1 281 }
ladner 1:0eaa7682f7e1 282 }
ladner 1:0eaa7682f7e1 283 }
ladner 1:0eaa7682f7e1 284 void setDice(char number)
ladner 1:0eaa7682f7e1 285 {
ladner 1:0eaa7682f7e1 286 if(diceEn==1)
ladner 1:0eaa7682f7e1 287 {
ladner 1:0eaa7682f7e1 288 DiceAnim.detach();
ladner 1:0eaa7682f7e1 289 diceTick = 0;
ladner 1:0eaa7682f7e1 290 Dice.stop();
ladner 1:0eaa7682f7e1 291 Dice.reset();
ladner 1:0eaa7682f7e1 292 }
ladner 1:0eaa7682f7e1 293 diceEn = 2;
ladner 1:0eaa7682f7e1 294 diceNum = number;
ladner 1:0eaa7682f7e1 295 if(diceNum>7)
ladner 1:0eaa7682f7e1 296 diceNum=7;
ladner 1:0eaa7682f7e1 297 if(diceNum==7)
ladner 1:0eaa7682f7e1 298 {
ladner 1:0eaa7682f7e1 299 diceEn=3;
ladner 1:0eaa7682f7e1 300 for(char i = 0;i<Steine;i++)
ladner 1:0eaa7682f7e1 301 if((PlayPos[(Drann<<2)|i]>3)&&(PlayPos[(Drann<<2)|i] < 44))
ladner 1:0eaa7682f7e1 302 for(char j = 1;j<=6;j++)
ladner 1:0eaa7682f7e1 303 {
ladner 1:0eaa7682f7e1 304 char temp = Field[(PlayPos[(Drann<<2)|i]- Steine + Feldgrose * Drann+j) % (Feldgrose*Steine)];
ladner 1:0eaa7682f7e1 305 if(temp>0)
ladner 1:0eaa7682f7e1 306 {
ladner 1:0eaa7682f7e1 307 temp--; //(Spieler<<2)|Stein
ladner 1:0eaa7682f7e1 308 temp = (temp&0xC)>>2;//Spieler
ladner 1:0eaa7682f7e1 309 if(temp!=Drann)
ladner 1:0eaa7682f7e1 310 if(j<diceNum)
ladner 1:0eaa7682f7e1 311 diceNum=j;
ladner 1:0eaa7682f7e1 312 }
ladner 1:0eaa7682f7e1 313 }
ladner 1:0eaa7682f7e1 314 //PlayPos[(Drann<<2)|i] im Feld suchen, weiter setzen, wenn treffer, der kleiner als diceNum ->setzen von diceNum
ladner 1:0eaa7682f7e1 315 }//DiceNum == 7
ladner 1:0eaa7682f7e1 316 if(diceNum==7)
ladner 1:0eaa7682f7e1 317 diceNum=6;
ladner 1:0eaa7682f7e1 318 port.printf("LForceDice:%d\n",diceNum);
ladner 1:0eaa7682f7e1 319 DicePrint();
ladner 1:0eaa7682f7e1 320 GameCal();
ladner 1:0eaa7682f7e1 321 }
ladner 1:0eaa7682f7e1 322 void DiceRun()
ladner 1:0eaa7682f7e1 323 {
ladner 1:0eaa7682f7e1 324 if(diceTick)
ladner 1:0eaa7682f7e1 325 {
ladner 1:0eaa7682f7e1 326 diceTick=0;
ladner 1:0eaa7682f7e1 327 if(dicePos<7)
ladner 1:0eaa7682f7e1 328 dicePos++;
ladner 1:0eaa7682f7e1 329 else
ladner 1:0eaa7682f7e1 330 dicePos=0;
ladner 1:0eaa7682f7e1 331 }
ladner 1:0eaa7682f7e1 332 else
ladner 1:0eaa7682f7e1 333 diceTick=1;
ladner 1:0eaa7682f7e1 334 DicePrint();
ladner 0:e97a6a69fe4b 335 }
ladner 0:e97a6a69fe4b 336
ladner 1:0eaa7682f7e1 337 void DicePrint()
ladner 0:e97a6a69fe4b 338 {
ladner 1:0eaa7682f7e1 339 switch(diceEn)
ladner 1:0eaa7682f7e1 340 {
ladner 1:0eaa7682f7e1 341 case 0:
ladner 1:0eaa7682f7e1 342 myled=(myled&0xFF0);
ladner 1:0eaa7682f7e1 343 port.printf("W%c%c\n",27,27);
ladner 1:0eaa7682f7e1 344 break;
ladner 1:0eaa7682f7e1 345 case 1:
ladner 1:0eaa7682f7e1 346 char dice_help = 0xFF-(1<<dicePos);
ladner 1:0eaa7682f7e1 347 myled=(myled&0xFF0)|(5)|(diceTick<<1);
ladner 1:0eaa7682f7e1 348 //myled = (myled&0xF)|(dice_help<<4);
ladner 1:0eaa7682f7e1 349
ladner 1:0eaa7682f7e1 350 port.printf("W%c%c\n" , 27 + diceTick+((dice_help&0x1F)<<1),27 + ((dice_help& 0xE0)>>5));
ladner 1:0eaa7682f7e1 351 break;
ladner 1:0eaa7682f7e1 352 case 2:
ladner 1:0eaa7682f7e1 353 myled=(myled&0xFF0)|(diceNum);
ladner 1:0eaa7682f7e1 354 //myled=myled|0xFF0;
ladner 1:0eaa7682f7e1 355
ladner 1:0eaa7682f7e1 356 port.printf("W%c%c\n" , 27 +(diceDecode[diceNum-1]&0x3F),27 + ((diceDecode[diceNum-1]&0x1C0)>>6));
ladner 1:0eaa7682f7e1 357 break;
ladner 1:0eaa7682f7e1 358 case 3:
ladner 1:0eaa7682f7e1 359 myled=(myled&0xFF0)|(diceNum)|8;
ladner 1:0eaa7682f7e1 360 //myled=myled|0xFF0;
ladner 1:0eaa7682f7e1 361
ladner 1:0eaa7682f7e1 362 port.printf("W%c%c\n" , 27 +(diceDecode[diceNum-1]&0x3F),27 + ((diceDecode[diceNum-1]&0x1C0)>>6));
ladner 1:0eaa7682f7e1 363 break;
ladner 1:0eaa7682f7e1 364 }
ladner 0:e97a6a69fe4b 365 }
ladner 1:0eaa7682f7e1 366
ladner 1:0eaa7682f7e1 367 void FieldGenerate()
ladner 1:0eaa7682f7e1 368 {
ladner 1:0eaa7682f7e1 369 for(char i = 0; i<Spieler*Feldgrose;i++)
ladner 1:0eaa7682f7e1 370 Field[i]=0; //Feld zurücksetzen
ladner 1:0eaa7682f7e1 371
ladner 1:0eaa7682f7e1 372 for(char i = 0; i<Spieler;i++)
ladner 1:0eaa7682f7e1 373 for(char j = 0; j<Steine;j++)
ladner 1:0eaa7682f7e1 374 {
ladner 1:0eaa7682f7e1 375 if (PlayPos[(i<<2)|j] >= Steine)
ladner 1:0eaa7682f7e1 376 {
ladner 1:0eaa7682f7e1 377 if (PlayPos[(i<<2)|j] > Steine * Feldgrose+Steine-1)
ladner 1:0eaa7682f7e1 378 {
ladner 1:0eaa7682f7e1 379 if (PlayPos[(i<<2)|j] < Steine * Feldgrose+Steine*2)
ladner 1:0eaa7682f7e1 380 Ziel[PlayPos[(i<<2)|j] - Steine * Feldgrose+Steine] = ((i<<2)|j) + 1;
ladner 1:0eaa7682f7e1 381 //Ziel PlayPos[(i<<2)|j] - 44
ladner 1:0eaa7682f7e1 382 }
ladner 1:0eaa7682f7e1 383 else
ladner 1:0eaa7682f7e1 384 Field[(PlayPos[(i<<2)|j]- Steine + Feldgrose * i) % (Steine * Feldgrose)] = ((i<<2)|j) + 1;
ladner 1:0eaa7682f7e1 385 //Feld (PlayPos[(i<<2)|j]- 4 + 10 * i) % 40
ladner 1:0eaa7682f7e1 386 }
ladner 1:0eaa7682f7e1 387 else
ladner 1:0eaa7682f7e1 388 Start[PlayPos[(i<<2)|j]] = ((i<<2)|j)+1;
ladner 1:0eaa7682f7e1 389 //start PlayPos[(i<<2)|j]
ladner 1:0eaa7682f7e1 390 }
ladner 1:0eaa7682f7e1 391 }
ladner 1:0eaa7682f7e1 392
ladner 1:0eaa7682f7e1 393 void FieldPrint()
ladner 1:0eaa7682f7e1 394 {
ladner 1:0eaa7682f7e1 395 port.printf("F");
ladner 1:0eaa7682f7e1 396 for(char i = 0;i<Spieler*Steine;i++)
ladner 1:0eaa7682f7e1 397 {
ladner 1:0eaa7682f7e1 398 port.printf("%c",27+PlayPos[i]);
ladner 1:0eaa7682f7e1 399 }
ladner 1:0eaa7682f7e1 400 port.printf("\n");
ladner 1:0eaa7682f7e1 401 }
ladner 1:0eaa7682f7e1 402
ladner 1:0eaa7682f7e1 403 void FeldPrint()
ladner 1:0eaa7682f7e1 404 {
ladner 1:0eaa7682f7e1 405 __disable_irq();
ladner 1:0eaa7682f7e1 406 for(char i = 0;i<Spieler*Feldgrose;i++)
ladner 1:0eaa7682f7e1 407 if(Field[i]>0)
ladner 1:0eaa7682f7e1 408 Feld.WriteLed(Farben[((Field[i]- 1)&0x0C)>>2]);
ladner 1:0eaa7682f7e1 409 else
ladner 1:0eaa7682f7e1 410 Feld.WriteLed(0);
ladner 1:0eaa7682f7e1 411 __enable_irq();
ladner 0:e97a6a69fe4b 412 }
ladner 1:0eaa7682f7e1 413
ladner 1:0eaa7682f7e1 414 /*
ladner 1:0eaa7682f7e1 415 char PlayPos[Spieler*Steine]; //Zahl zwischen 0 & 47 ((0xC0 -> Spieler)>>2 / 0x03 -> Stein)
ladner 1:0eaa7682f7e1 416 char PlayPosOld[Spieler*Steine];
ladner 1:0eaa7682f7e1 417 char Start[Spieler]; //Enthält den Index für PlayPos (nur das 'normale' Spielfend)
ladner 1:0eaa7682f7e1 418 char Ziel[Spieler]; //Enthält den Index für PlayPos (nur das 'normale' Spielfend)
ladner 1:0eaa7682f7e1 419 char Drann; //Spieler, der drann ist
ladner 1:0eaa7682f7e1 420 char count; //Für 6er & mehrfaches Würfeln beim Ansetzen
ladner 1:0eaa7682f7e1 421 char last[Spieler]; //zuletzt benutzte Spielstein, der zuletzt benutzt wurde
ladner 1:0eaa7682f7e1 422 char moglich[Steine];
ladner 1:0eaa7682f7e1 423 char selected; //der aktuell ausgewählte Zug
ladner 1:0eaa7682f7e1 424 char Field[Spieler*Feldgrose]; //Enthält den Index für PlayPos (nur das 'normale' Spielfend)
ladner 1:0eaa7682f7e1 425 uint32_t Farben[Spieler]; //Berechnete Hellichkeiten der Speiler fertig zur Ausgabe...
ladner 1:0eaa7682f7e1 426 void FieldPrint(); //Ausgabe auf Com-Port
ladner 1:0eaa7682f7e1 427 void FieldGenerate(); //Berechnung von PlayPos auf Start, Ziel, Field
ladner 1:0eaa7682f7e1 428 void FeldPrint(); //Ausgabe von Field auf den Led-Streifen (Feld) der Farben
ladner 1:0eaa7682f7e1 429 void GameCal();
ladner 1:0eaa7682f7e1 430 void moveNext();
ladner 1:0eaa7682f7e1 431 void moveLast();
ladner 1:0eaa7682f7e1 432 Ticker MoveAnim;
ladner 1:0eaa7682f7e1 433 void MoveRun();
ladner 1:0eaa7682f7e1 434 char MoveShow;
ladner 1:0eaa7682f7e1 435 void MovePrint(); */
ladner 1:0eaa7682f7e1 436
ladner 1:0eaa7682f7e1 437 void MoveRun()
ladner 0:e97a6a69fe4b 438 {
ladner 1:0eaa7682f7e1 439 if(MoveShow)
ladner 1:0eaa7682f7e1 440 MoveShow=0;
ladner 1:0eaa7682f7e1 441 else
ladner 1:0eaa7682f7e1 442 MoveShow = 1;
ladner 1:0eaa7682f7e1 443 if(MoveShow>0)
ladner 0:e97a6a69fe4b 444 {
ladner 1:0eaa7682f7e1 445 __disable_irq();
ladner 1:0eaa7682f7e1 446 port.printf("F");
ladner 1:0eaa7682f7e1 447 for(char i = 0;i<Spieler*Steine;i++)
ladner 1:0eaa7682f7e1 448 {
ladner 1:0eaa7682f7e1 449 if(i==((Drann<<2)|selected))
ladner 1:0eaa7682f7e1 450 {
ladner 1:0eaa7682f7e1 451 if(PlayPos[i]<Steine)
ladner 1:0eaa7682f7e1 452 port.printf("%c",27+Steine);
ladner 1:0eaa7682f7e1 453 else
ladner 1:0eaa7682f7e1 454 port.printf("%c",27+PlayPos[i]+diceNum);
ladner 1:0eaa7682f7e1 455 }
ladner 1:0eaa7682f7e1 456 else
ladner 1:0eaa7682f7e1 457 port.printf("%c",27+PlayPos[i]);
ladner 1:0eaa7682f7e1 458 }
ladner 1:0eaa7682f7e1 459 port.printf("\n");
ladner 1:0eaa7682f7e1 460 __enable_irq();
ladner 1:0eaa7682f7e1 461 }
ladner 1:0eaa7682f7e1 462 else
ladner 1:0eaa7682f7e1 463 FieldPrint();
ladner 1:0eaa7682f7e1 464 }
ladner 1:0eaa7682f7e1 465
ladner 1:0eaa7682f7e1 466 void moveNext()
ladner 1:0eaa7682f7e1 467 {
ladner 1:0eaa7682f7e1 468 selected = (selected+1)%Steine;
ladner 1:0eaa7682f7e1 469 for(char i = 0;i<Steine;i++)
ladner 1:0eaa7682f7e1 470 if(moglich[selected]>0)
ladner 1:0eaa7682f7e1 471 break;
ladner 1:0eaa7682f7e1 472 else
ladner 1:0eaa7682f7e1 473 selected = (selected+1)%Steine;
ladner 1:0eaa7682f7e1 474 }
ladner 1:0eaa7682f7e1 475
ladner 1:0eaa7682f7e1 476 void moveLast()
ladner 1:0eaa7682f7e1 477 {
ladner 1:0eaa7682f7e1 478 selected = (selected+3)%Steine;
ladner 1:0eaa7682f7e1 479 for(char i = 0;i<Steine;i++)
ladner 1:0eaa7682f7e1 480 if(moglich[selected]>0)
ladner 1:0eaa7682f7e1 481 break;
ladner 1:0eaa7682f7e1 482 else
ladner 1:0eaa7682f7e1 483 selected = (selected+3)%Steine;
ladner 1:0eaa7682f7e1 484 }
ladner 1:0eaa7682f7e1 485
ladner 1:0eaa7682f7e1 486 void GameCal()
ladner 1:0eaa7682f7e1 487 {
ladner 1:0eaa7682f7e1 488 char drausen = 0; //Ziel
ladner 1:0eaa7682f7e1 489 char feld = 0;
ladner 1:0eaa7682f7e1 490 char drinnen = 0; //start
ladner 2:3a90b20958ff 491 char moglichAny = 1;
ladner 1:0eaa7682f7e1 492 for(char i = 0;i<Steine;i++)
ladner 1:0eaa7682f7e1 493 {
ladner 1:0eaa7682f7e1 494 if(PlayPos[(Drann<<2)|i]>3)
ladner 0:e97a6a69fe4b 495 {
ladner 1:0eaa7682f7e1 496 if(PlayPos[(Drann<<2)|i] > 43)
ladner 1:0eaa7682f7e1 497 drausen++;
ladner 1:0eaa7682f7e1 498 else
ladner 1:0eaa7682f7e1 499 feld++;
ladner 0:e97a6a69fe4b 500 }
ladner 1:0eaa7682f7e1 501 else
ladner 1:0eaa7682f7e1 502 drinnen++;
ladner 1:0eaa7682f7e1 503 moglich[i]=0;
ladner 1:0eaa7682f7e1 504 }
ladner 1:0eaa7682f7e1 505 //Berechnung
ladner 2:3a90b20958ff 506 //Ausfahren:
ladner 2:3a90b20958ff 507 //drinnen >0 (Noch Spieler drinnen?)
ladner 2:3a90b20958ff 508 //Startfeld ist von Spieler belegt
ladner 2:3a90b20958ff 509 //Ziel ist frei
ladner 2:3a90b20958ff 510 if((drinnen>0)&&(moglichAny))
ladner 2:3a90b20958ff 511 {
ladner 4:2acb70f9cd22 512 //port.printf("LDrinnen\n");
ladner 2:3a90b20958ff 513 if(((((Field[Feldgrose*Drann]-1) &0x0C) >>2)==Drann)&&(Field[Feldgrose*Drann]>0))
ladner 2:3a90b20958ff 514 {
ladner 4:2acb70f9cd22 515 //port.printf("LAusfahrt Belegt\n");
ladner 2:3a90b20958ff 516 if(((((Field[(Feldgrose*Drann+diceNum)%(Feldgrose*Spieler)]-1) &0x0C) >>2)!=Drann)||(Field[(Feldgrose*Drann+diceNum)%(Feldgrose*Spieler)]==0))
ladner 2:3a90b20958ff 517 {
ladner 4:2acb70f9cd22 518 //port.printf("LZiel frei (Done)\n");
ladner 2:3a90b20958ff 519 moglich[(Field[Feldgrose*Drann]-1) &0x03] = 1;
ladner 2:3a90b20958ff 520 moglichAny=0;
ladner 2:3a90b20958ff 521 }
ladner 2:3a90b20958ff 522 }
ladner 0:e97a6a69fe4b 523 }
ladner 2:3a90b20958ff 524
ladner 2:3a90b20958ff 525 //Ansetzen
ladner 2:3a90b20958ff 526 // 6 gewürfelt
ladner 2:3a90b20958ff 527 //drinnen>0
ladner 2:3a90b20958ff 528 //Start-feld ist nicht von Spieler belegt
ladner 2:3a90b20958ff 529 if((drinnen>0)&&(moglichAny)&&(diceNum==6))
ladner 0:e97a6a69fe4b 530 {
ladner 4:2acb70f9cd22 531 //port.printf("LDrinnen & 6 \n");
ladner 2:3a90b20958ff 532 if(((((Field[Feldgrose*Drann]-1) &0x0C) >>2)!=Drann)||(Field[Feldgrose*Drann]==0))
ladner 1:0eaa7682f7e1 533 {
ladner 4:2acb70f9cd22 534 //port.printf("LAusfahrt frei (Done...Schleife)\n");
ladner 2:3a90b20958ff 535 moglichAny=0;
ladner 1:0eaa7682f7e1 536 for(char i = 0;i<Steine;i++)
ladner 1:0eaa7682f7e1 537 if(PlayPos[(Drann<<2)|i]<Steine)
ladner 1:0eaa7682f7e1 538 moglich[i]=1;
ladner 1:0eaa7682f7e1 539 }
ladner 2:3a90b20958ff 540 }
ladner 2:3a90b20958ff 541
ladner 2:3a90b20958ff 542 //Fahren
ladner 2:3a90b20958ff 543 if(moglichAny)
ladner 2:3a90b20958ff 544 {
ladner 4:2acb70f9cd22 545 //port.printf("LNormal...\n");
ladner 2:3a90b20958ff 546 for(char i = 0;i<Steine;i++)
ladner 0:e97a6a69fe4b 547 {
ladner 2:3a90b20958ff 548 if(PlayPos[(Drann<<2)|i]>Spieler-1) //Drausen
ladner 1:0eaa7682f7e1 549 {
ladner 4:2acb70f9cd22 550 if((PlayPos[(Drann<<2)|i]-Steine+diceNum) < Feldgrose*Spieler)//Zeil noch am Feld
ladner 1:0eaa7682f7e1 551 {
ladner 2:3a90b20958ff 552 char temp = Field[(PlayPos[(Drann<<2)|i]- Steine + Feldgrose * Drann+diceNum) % (Feldgrose*Steine)]; //zielfeld
ladner 1:0eaa7682f7e1 553 if(temp>0)
ladner 1:0eaa7682f7e1 554 {
ladner 1:0eaa7682f7e1 555 //myled = myled|temp<<8;
ladner 1:0eaa7682f7e1 556 temp--; //(Spieler<<2)|Stein
ladner 1:0eaa7682f7e1 557 temp = (temp&0xC)>>2;//Spieler
ladner 2:3a90b20958ff 558 if(temp!=Drann) //zielfeld ist nicht ich
ladner 1:0eaa7682f7e1 559 moglich[i]=1;
ladner 1:0eaa7682f7e1 560 }
ladner 2:3a90b20958ff 561 else//Feld ist leer
ladner 1:0eaa7682f7e1 562 moglich[i]=1;
ladner 1:0eaa7682f7e1 563 }
ladner 2:3a90b20958ff 564 else
ladner 2:3a90b20958ff 565 {//Kollisionsberechnung ins Ziel...
ladner 4:2acb70f9cd22 566 if((PlayPos[(Drann<<2)|i]+diceNum)<(Steine*2+ Feldgrose*Spieler))//Schiest nicht über das Ziel hinaus...
ladner 3:814d47b6991c 567 if(Ziel[PlayPos[(Drann<<2)|i]-Steine-Feldgrose*Spieler+diceNum]==0)//Zielfeld ist leer (enthält ja nur mich)
ladner 4:2acb70f9cd22 568 moglich[i]=1;
ladner 2:3a90b20958ff 569 }
ladner 1:0eaa7682f7e1 570 }
ladner 1:0eaa7682f7e1 571 }
ladner 1:0eaa7682f7e1 572 }
ladner 2:3a90b20958ff 573
ladner 2:3a90b20958ff 574 moglichAny=0;
ladner 1:0eaa7682f7e1 575 myled = myled&0xF0F;
ladner 1:0eaa7682f7e1 576 for(char i = 0;i<Steine;i++)
ladner 2:3a90b20958ff 577 {
ladner 1:0eaa7682f7e1 578 myled = myled|(moglich[i]<<i+4);
ladner 1:0eaa7682f7e1 579 moglichAny = moglichAny | moglich[i];
ladner 2:3a90b20958ff 580 }
ladner 1:0eaa7682f7e1 581 if(moglichAny)
ladner 1:0eaa7682f7e1 582 {
ladner 1:0eaa7682f7e1 583 selected = (last[Drann]+Steine-1)%Steine;
ladner 1:0eaa7682f7e1 584 moveNext();
ladner 1:0eaa7682f7e1 585 MoveAnim.attach(&MoveRun,0.3);
ladner 1:0eaa7682f7e1 586 }
ladner 1:0eaa7682f7e1 587 else
ladner 1:0eaa7682f7e1 588 {
ladner 1:0eaa7682f7e1 589 if(feld)
ladner 1:0eaa7682f7e1 590 diceEn = 1;
ladner 4:2acb70f9cd22 591 else
ladner 1:0eaa7682f7e1 592 {
ladner 4:2acb70f9cd22 593 if(count<3)
ladner 4:2acb70f9cd22 594 {
ladner 4:2acb70f9cd22 595 diceEn=0;
ladner 4:2acb70f9cd22 596 count++;
ladner 4:2acb70f9cd22 597 port.printf("LCount: %d\n",count);
ladner 4:2acb70f9cd22 598 }
ladner 0:e97a6a69fe4b 599 }
ladner 1:0eaa7682f7e1 600 }
ladner 1:0eaa7682f7e1 601 }
ladner 1:0eaa7682f7e1 602
ladner 1:0eaa7682f7e1 603 void MoveDo()
ladner 1:0eaa7682f7e1 604 {
ladner 1:0eaa7682f7e1 605 if(diceEn>1)
ladner 1:0eaa7682f7e1 606 {
ladner 1:0eaa7682f7e1 607 if(PlayPos[(Drann<<2)|selected]<Steine)
ladner 1:0eaa7682f7e1 608 {
ladner 1:0eaa7682f7e1 609 PlayPos[(Drann<<2)|selected] = Steine;
ladner 1:0eaa7682f7e1 610 char temp = Field[Drann*Feldgrose];
ladner 1:0eaa7682f7e1 611 if(temp>0)
ladner 1:0eaa7682f7e1 612 {
ladner 1:0eaa7682f7e1 613 //myled = myled|temp<<8;
ladner 1:0eaa7682f7e1 614 temp--; //(Spieler<<2)|Stein
ladner 1:0eaa7682f7e1 615 PlayPos[temp] = (temp & 0x03); //rücksetzung des Feldes...
ladner 1:0eaa7682f7e1 616 }
ladner 1:0eaa7682f7e1 617 }
ladner 1:0eaa7682f7e1 618 else
ladner 0:e97a6a69fe4b 619 {
ladner 1:0eaa7682f7e1 620 PlayPos[(Drann<<2)|selected] += diceNum;
ladner 1:0eaa7682f7e1 621 //PlayPos[(Drann<<2)|selected]
ladner 1:0eaa7682f7e1 622 if((PlayPos[(Drann<<2)|selected]>=Steine)&&(PlayPos[(Drann<<2)|selected]<Steine+Spieler*Feldgrose))
ladner 1:0eaa7682f7e1 623 {
ladner 1:0eaa7682f7e1 624 //Field>0
ladner 1:0eaa7682f7e1 625 char temp = Field[ ( PlayPos[(Drann<<2)|selected] - Steine + (Feldgrose * Drann) ) % (Feldgrose*Steine) ];
ladner 1:0eaa7682f7e1 626 if(temp>0)
ladner 1:0eaa7682f7e1 627 {
ladner 1:0eaa7682f7e1 628 //myled = myled|temp<<8;
ladner 1:0eaa7682f7e1 629 temp--; //(Spieler<<2)|Stein
ladner 1:0eaa7682f7e1 630 PlayPos[temp] = (temp & 0x03); //rücksetzung des Feldes...
ladner 1:0eaa7682f7e1 631 }
ladner 1:0eaa7682f7e1 632 }
ladner 0:e97a6a69fe4b 633 }
ladner 1:0eaa7682f7e1 634 MoveAnim.detach();
ladner 1:0eaa7682f7e1 635 last[Drann]=selected;
ladner 1:0eaa7682f7e1 636 if(diceNum<6)
ladner 1:0eaa7682f7e1 637 {
ladner 1:0eaa7682f7e1 638 Drann = (Drann+1)%Spieler;
ladner 1:0eaa7682f7e1 639 }
ladner 1:0eaa7682f7e1 640 diceEn = 0;
ladner 1:0eaa7682f7e1 641 count = 0;
ladner 1:0eaa7682f7e1 642 DicePrint();
ladner 1:0eaa7682f7e1 643 myled = myled&0xF0F;
ladner 1:0eaa7682f7e1 644 FieldGenerate();
ladner 1:0eaa7682f7e1 645 FieldPrint();
ladner 1:0eaa7682f7e1 646 FeldPrint();
ladner 1:0eaa7682f7e1 647 }
ladner 4:2acb70f9cd22 648 }
ladner 4:2acb70f9cd22 649 void ColorPrint(uint32_t color)
ladner 4:2acb70f9cd22 650 {
ladner 4:2acb70f9cd22 651 port.printf("%c%c%c%c\n",27+((color&0xFC0000)>>18),27+((color&0x03f000)>>12),27+((color&0x000FC0)>>6),27+(color&0x00003F));
ladner 0:e97a6a69fe4b 652 }