Dependencies:   Led-libary TextLCD mbed

Committer:
ladner
Date:
Sat Mar 12 15:08:39 2016 +0000
Revision:
6:ca3d431f2daf
Parent:
5:31d406df862a
Child:
7:6b4048a2b9ff

        

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 5:31d406df862a 3 #include "TextLCD.h"
ladner 0:e97a6a69fe4b 4
ladner 0:e97a6a69fe4b 5 I2C i2c(P0_5,P0_4);
ladner 0:e97a6a69fe4b 6 Serial port(P0_19,P0_18);
ladner 0:e97a6a69fe4b 7 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 8 AnalogIn ldr(P0_12);
ladner 0:e97a6a69fe4b 9 AnalogIn poti(P0_11);
ladner 1:0eaa7682f7e1 10 //BusOut rgb(P0_9,P1_15,P0_21);
ladner 1:0eaa7682f7e1 11 //BusIn btn(P1_16,P0_23,P0_10,P0_15);
ladner 1:0eaa7682f7e1 12
ladner 1:0eaa7682f7e1 13 RGBOut rgb(P0_21,P0_9,P1_15);
ladner 5:31d406df862a 14 //Old: P0_13
ladner 5:31d406df862a 15 LedOut Feld (P1_23);//P1_23 ->14
ladner 5:31d406df862a 16 LedOut Home (P1_20);//P1_20->13
ladner 5:31d406df862a 17 LedOut Dice (P1_21);//P1_21->12
ladner 5:31d406df862a 18 //-> 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 19 // übrige 8 LED für zeit-Anzeige des Zuges einer KI
ladner 1:0eaa7682f7e1 20
ladner 1:0eaa7682f7e1 21 InterruptIn Button0(P0_1);
ladner 0:e97a6a69fe4b 22 InterruptIn Button1(P1_16);
ladner 0:e97a6a69fe4b 23 InterruptIn Button2(P0_23);
ladner 1:0eaa7682f7e1 24 InterruptIn Button3(P0_10);
ladner 1:0eaa7682f7e1 25 InterruptIn Button4(P0_15);
ladner 0:e97a6a69fe4b 26
ladner 1:0eaa7682f7e1 27 Timer Random;
ladner 5:31d406df862a 28 Timer RandomDice;
ladner 1:0eaa7682f7e1 29
ladner 1:0eaa7682f7e1 30 Ticker DiceAnim;
ladner 1:0eaa7682f7e1 31 void DiceStart();
ladner 1:0eaa7682f7e1 32 void DiceStop();
ladner 1:0eaa7682f7e1 33 void DiceRun();
ladner 1:0eaa7682f7e1 34 void setDice(char number);
ladner 1:0eaa7682f7e1 35 void DicePrint();
ladner 1:0eaa7682f7e1 36 char dicePos = 0;
ladner 1:0eaa7682f7e1 37 char diceEn = 0;
ladner 1:0eaa7682f7e1 38 char diceTick = 0;
ladner 1:0eaa7682f7e1 39 char diceNum = 0;
ladner 1:0eaa7682f7e1 40 int16_t diceDecode [7]= {0x1,0x88,0x89,0xAA,0xAB,0x1BA,0x154};
ladner 1:0eaa7682f7e1 41
ladner 1:0eaa7682f7e1 42 #define Feldgrose 10
ladner 1:0eaa7682f7e1 43 #define Spieler 4
ladner 1:0eaa7682f7e1 44 #define Steine 4
ladner 1:0eaa7682f7e1 45
ladner 1:0eaa7682f7e1 46 char PlayPos[Spieler*Steine]; //Zahl zwischen 0 & 47 ((0xC0 -> Spieler)>>2 / 0x03 -> Stein)
ladner 5:31d406df862a 47 char Start[Spieler*Steine]; //Enthält den Index für PlayPos (nur das 'normale' Spielfend)
ladner 5:31d406df862a 48 char Ziel[Spieler*Steine]; //Enthält den Index für PlayPos (nur das 'normale' Spielfend)
ladner 1:0eaa7682f7e1 49 char Drann; //Spieler, der drann ist
ladner 1:0eaa7682f7e1 50 char count; //Für 6er & mehrfaches Würfeln beim Ansetzen
ladner 1:0eaa7682f7e1 51 char last[Spieler]; //zuletzt benutzte Spielstein, der zuletzt benutzt wurde
ladner 1:0eaa7682f7e1 52 char moglich[Steine];
ladner 1:0eaa7682f7e1 53 char selected; //der aktuell ausgewählte Zug
ladner 1:0eaa7682f7e1 54 char Field[Spieler*Feldgrose]; //Enthält den Index für PlayPos (nur das 'normale' Spielfend)
ladner 1:0eaa7682f7e1 55 uint32_t Farben[Spieler]; //Berechnete Hellichkeiten der Speiler fertig zur Ausgabe...
ladner 1:0eaa7682f7e1 56 void FieldPrint(); //Ausgabe auf Com-Port
ladner 1:0eaa7682f7e1 57 void FieldGenerate(); //Berechnung von PlayPos auf Start, Ziel, Field
ladner 1:0eaa7682f7e1 58 void FeldPrint(); //Ausgabe von Field auf den Led-Streifen (Feld) der Farben
ladner 1:0eaa7682f7e1 59 void GameCal();
ladner 1:0eaa7682f7e1 60 void moveNext();
ladner 1:0eaa7682f7e1 61 void moveLast();
ladner 1:0eaa7682f7e1 62 Ticker MoveAnim;
ladner 1:0eaa7682f7e1 63 void MoveRun();
ladner 1:0eaa7682f7e1 64 char MoveShow;
ladner 1:0eaa7682f7e1 65 void MoveDo();
ladner 4:2acb70f9cd22 66 void ColorPrint(uint32_t color);
ladner 1:0eaa7682f7e1 67
ladner 5:31d406df862a 68 char AnimField[Spieler*Feldgrose];
ladner 5:31d406df862a 69 char AnimStart[Spieler*Steine];
ladner 5:31d406df862a 70 char AnimZiel[Spieler*Steine];
ladner 6:ca3d431f2daf 71 char AnimPos[Spieler*Steine];
ladner 6:ca3d431f2daf 72 char AnimDo; //Feld_Animieren,Start Animieren, Ziel Animierenw
ladner 5:31d406df862a 73 void AnimCal();
ladner 5:31d406df862a 74
ladner 1:0eaa7682f7e1 75 void reset()
ladner 1:0eaa7682f7e1 76 {
ladner 1:0eaa7682f7e1 77 MoveAnim.detach();
ladner 1:0eaa7682f7e1 78 DiceAnim.detach();
ladner 1:0eaa7682f7e1 79 for(char i = 0;i<Spieler*Steine;i++)
ladner 1:0eaa7682f7e1 80 PlayPos[i]=i%4;
ladner 5:31d406df862a 81 for (char i = 0; i < Spieler; i++)
ladner 5:31d406df862a 82 last[i]=0;
ladner 1:0eaa7682f7e1 83 Drann=0;
ladner 1:0eaa7682f7e1 84 diceEn=0;
ladner 2:3a90b20958ff 85 myled = myled&0xF0F;
ladner 1:0eaa7682f7e1 86 DicePrint();
ladner 1:0eaa7682f7e1 87 rgb.set_RGB(0);
ladner 1:0eaa7682f7e1 88 FieldGenerate();
ladner 1:0eaa7682f7e1 89 FieldPrint();
ladner 1:0eaa7682f7e1 90 FeldPrint();
ladner 1:0eaa7682f7e1 91 }
ladner 1:0eaa7682f7e1 92
ladner 1:0eaa7682f7e1 93 void btn2()
ladner 1:0eaa7682f7e1 94 {
ladner 5:31d406df862a 95 reset();
ladner 5:31d406df862a 96 for(char i = 0;i<Spieler;i++)
ladner 5:31d406df862a 97 PlayPos[i*Spieler]=Steine+Spieler*Feldgrose;
ladner 5:31d406df862a 98 FieldGenerate();
ladner 5:31d406df862a 99 FieldPrint();
ladner 5:31d406df862a 100 FeldPrint();
ladner 5:31d406df862a 101 /*
ladner 5:31d406df862a 102 for(char i = 0; i<Spieler;i++)
ladner 5:31d406df862a 103 for(char j = 0; j<Steine;j++)
ladner 5:31d406df862a 104 Start[(i<<2)|j] = ((i<<2)|j)+1;
ladner 5:31d406df862a 105 for(char i = 0; i<Spieler;i++)
ladner 5:31d406df862a 106 for(char j = 0; j<Steine;j++)
ladner 5:31d406df862a 107 Ziel[(i<<2)|j] = ((i<<2)|j)+1;
ladner 5:31d406df862a 108 FeldPrint();
ladner 5:31d406df862a 109 */
ladner 5:31d406df862a 110 /*
ladner 2:3a90b20958ff 111 Drann = 0;
ladner 2:3a90b20958ff 112 PlayPos[1]=Steine+Feldgrose*Spieler;
ladner 4:2acb70f9cd22 113 //PlayPos[2]=Steine+Feldgrose*Spieler+1;
ladner 4:2acb70f9cd22 114 PlayPos[3]=Steine+Feldgrose*Spieler+2;
ladner 4:2acb70f9cd22 115 PlayPos[0]=Steine+Feldgrose*Spieler-1;
ladner 1:0eaa7682f7e1 116 FieldGenerate();
ladner 1:0eaa7682f7e1 117 FieldPrint();
ladner 5:31d406df862a 118 FeldPrint();
ladner 5:31d406df862a 119 */
ladner 1:0eaa7682f7e1 120 }
ladner 5:31d406df862a 121
ladner 1:0eaa7682f7e1 122 void btn3()
ladner 0:e97a6a69fe4b 123 {
ladner 4:2acb70f9cd22 124 /*
ladner 1:0eaa7682f7e1 125 diceNum=2;
ladner 1:0eaa7682f7e1 126 diceEn=2;
ladner 1:0eaa7682f7e1 127 Drann = 1;
ladner 1:0eaa7682f7e1 128 PlayPos[(1<<2)+0]=5;
ladner 1:0eaa7682f7e1 129 PlayPos[(1<<2)+1]=7;
ladner 1:0eaa7682f7e1 130 PlayPos[(1<<2)+2]=10;
ladner 1:0eaa7682f7e1 131 PlayPos[(1<<2)+3]=12;
ladner 4:2acb70f9cd22 132 DicePrint();
ladner 1:0eaa7682f7e1 133 FieldGenerate();
ladner 1:0eaa7682f7e1 134 FieldPrint();
ladner 1:0eaa7682f7e1 135 FeldPrint();
ladner 1:0eaa7682f7e1 136 GameCal();
ladner 4:2acb70f9cd22 137 */
ladner 4:2acb70f9cd22 138 port.printf("W%c%c\n",27+0x3E,27+0x7);
ladner 4:2acb70f9cd22 139 for(char i=0;i<Spieler;i++)
ladner 4:2acb70f9cd22 140 {
ladner 4:2acb70f9cd22 141 port.printf("w");
ladner 4:2acb70f9cd22 142 ColorPrint(Farben[i]);
ladner 4:2acb70f9cd22 143 wait(1);
ladner 4:2acb70f9cd22 144 }
ladner 1:0eaa7682f7e1 145 }
ladner 5:31d406df862a 146
ladner 1:0eaa7682f7e1 147 void btn4()
ladner 1:0eaa7682f7e1 148 {
ladner 1:0eaa7682f7e1 149 /*
ladner 1:0eaa7682f7e1 150 for(char i = 0;i<Spieler;i++)
ladner 1:0eaa7682f7e1 151 PlayPos[i<<2]=4;
ladner 1:0eaa7682f7e1 152 FieldGenerate();
ladner 1:0eaa7682f7e1 153 FieldPrint();
ladner 1:0eaa7682f7e1 154 */
ladner 1:0eaa7682f7e1 155 myled = 0;
ladner 1:0eaa7682f7e1 156 rgb.set(0,0,0);
ladner 1:0eaa7682f7e1 157 port.printf("LBtn 4 Pressed\n");
ladner 1:0eaa7682f7e1 158 }
ladner 1:0eaa7682f7e1 159
ladner 1:0eaa7682f7e1 160 void btn4_()
ladner 1:0eaa7682f7e1 161 {
ladner 1:0eaa7682f7e1 162 port.printf("LBtn 4 Released\n");
ladner 1:0eaa7682f7e1 163 }
ladner 1:0eaa7682f7e1 164
ladner 1:0eaa7682f7e1 165 void Control()
ladner 1:0eaa7682f7e1 166 {
ladner 1:0eaa7682f7e1 167 while(port.readable ())
ladner 0:e97a6a69fe4b 168 {
ladner 1:0eaa7682f7e1 169 char message = port.getc();
ladner 1:0eaa7682f7e1 170 switch(message)
ladner 1:0eaa7682f7e1 171 {
ladner 1:0eaa7682f7e1 172 case '1':
ladner 1:0eaa7682f7e1 173 setDice(1);
ladner 1:0eaa7682f7e1 174 break;
ladner 1:0eaa7682f7e1 175 case '2':
ladner 1:0eaa7682f7e1 176 setDice(2);
ladner 1:0eaa7682f7e1 177 break;
ladner 1:0eaa7682f7e1 178 case '3':
ladner 1:0eaa7682f7e1 179 setDice(3);
ladner 1:0eaa7682f7e1 180 break;
ladner 1:0eaa7682f7e1 181 case '4':
ladner 1:0eaa7682f7e1 182 setDice(4);
ladner 1:0eaa7682f7e1 183 break;
ladner 1:0eaa7682f7e1 184 case '5':
ladner 1:0eaa7682f7e1 185 setDice(5);
ladner 1:0eaa7682f7e1 186 break;
ladner 1:0eaa7682f7e1 187 case '6':
ladner 1:0eaa7682f7e1 188 setDice(6);
ladner 1:0eaa7682f7e1 189 break;
ladner 1:0eaa7682f7e1 190 case '7':
ladner 1:0eaa7682f7e1 191 setDice(7);
ladner 1:0eaa7682f7e1 192 break;
ladner 1:0eaa7682f7e1 193 case 'A':
ladner 1:0eaa7682f7e1 194 DiceStart();
ladner 1:0eaa7682f7e1 195 break;
ladner 1:0eaa7682f7e1 196 case 'a':
ladner 1:0eaa7682f7e1 197 DiceStop();
ladner 1:0eaa7682f7e1 198 break;
ladner 1:0eaa7682f7e1 199 case 'B':
ladner 1:0eaa7682f7e1 200 moveNext();
ladner 1:0eaa7682f7e1 201 break;
ladner 1:0eaa7682f7e1 202 case 'C':
ladner 1:0eaa7682f7e1 203 moveLast();
ladner 1:0eaa7682f7e1 204 break;
ladner 1:0eaa7682f7e1 205 case 'D':
ladner 1:0eaa7682f7e1 206 MoveDo();
ladner 1:0eaa7682f7e1 207 break;
ladner 1:0eaa7682f7e1 208 case 'I':
ladner 1:0eaa7682f7e1 209 reset();
ladner 1:0eaa7682f7e1 210 break;
ladner 1:0eaa7682f7e1 211 }
ladner 0:e97a6a69fe4b 212 }
ladner 0:e97a6a69fe4b 213 }
ladner 0:e97a6a69fe4b 214
ladner 1:0eaa7682f7e1 215 int main()
ladner 0:e97a6a69fe4b 216 {
ladner 1:0eaa7682f7e1 217 Random.start();
ladner 1:0eaa7682f7e1 218 //Random.stop();
ladner 1:0eaa7682f7e1 219 //Random.read_us();
ladner 1:0eaa7682f7e1 220
ladner 1:0eaa7682f7e1 221 //Ticker:
ladner 1:0eaa7682f7e1 222 //.attach(&main,[sek]);
ladner 1:0eaa7682f7e1 223 //.attach_us(&main,[micro-sec]);
ladner 1:0eaa7682f7e1 224 //.detach();
ladner 5:31d406df862a 225 wait(0.01);
ladner 1:0eaa7682f7e1 226
ladner 1:0eaa7682f7e1 227 Button0.rise(&reset);
ladner 1:0eaa7682f7e1 228 Button1.rise(&DiceStart);
ladner 1:0eaa7682f7e1 229 Button1.fall(&DiceStop);
ladner 1:0eaa7682f7e1 230 Button2.rise(&btn2);
ladner 1:0eaa7682f7e1 231 Button3.rise(&btn3);
ladner 1:0eaa7682f7e1 232 Button4.rise(&btn4);
ladner 1:0eaa7682f7e1 233 Button4.fall(&btn4_);
ladner 1:0eaa7682f7e1 234
ladner 1:0eaa7682f7e1 235 //myled = 0xFFF;
ladner 1:0eaa7682f7e1 236 port.baud(76800);
ladner 1:0eaa7682f7e1 237 port.format(8,Serial::None, 1);
ladner 1:0eaa7682f7e1 238 port.attach(&Control);
ladner 4:2acb70f9cd22 239 /*
ladner 1:0eaa7682f7e1 240 Farben[0]=0x001000;//Grün
ladner 1:0eaa7682f7e1 241 Farben[1]=0x100000;//Rot
ladner 1:0eaa7682f7e1 242 Farben[2]=0x000010;//Blau
ladner 1:0eaa7682f7e1 243 Farben[3]=0x001010;//Gelb
ladner 1:0eaa7682f7e1 244 //Farben[4]=0xFFFFFF;//Weiß
ladner 4:2acb70f9cd22 245 */
ladner 4:2acb70f9cd22 246 Farben[0]=0x00FF00;//Grün
ladner 4:2acb70f9cd22 247 Farben[1]=0xFF0000;//Rot
ladner 4:2acb70f9cd22 248 Farben[2]=0x0000FF;//Blau
ladner 4:2acb70f9cd22 249 Farben[3]=0x00FFFF;//Gelb
ladner 1:0eaa7682f7e1 250 __disable_irq();
ladner 1:0eaa7682f7e1 251 for(char i = 0;i<Spieler;i++)
ladner 1:0eaa7682f7e1 252 {
ladner 1:0eaa7682f7e1 253 Feld.WriteLed(Farben[i]);
ladner 1:0eaa7682f7e1 254 for(char j = 0;j<Feldgrose-1;j++)
ladner 5:31d406df862a 255 if((j==(Feldgrose-2))&(i==(Spieler-1)))
ladner 5:31d406df862a 256 Feld.WriteLed(0xFFFFFF);
ladner 5:31d406df862a 257 else
ladner 5:31d406df862a 258 Feld.WriteLed(0);
ladner 1:0eaa7682f7e1 259 }
ladner 1:0eaa7682f7e1 260 __enable_irq();
ladner 5:31d406df862a 261 //reset();
ladner 1:0eaa7682f7e1 262 while(1) ;
ladner 0:e97a6a69fe4b 263 }
ladner 0:e97a6a69fe4b 264
ladner 1:0eaa7682f7e1 265 void DiceStart()
ladner 1:0eaa7682f7e1 266 {
ladner 1:0eaa7682f7e1 267 if(diceEn==0)
ladner 1:0eaa7682f7e1 268 {
ladner 5:31d406df862a 269 RandomDice.start();
ladner 1:0eaa7682f7e1 270 DiceAnim.attach(&DiceRun,0.1);
ladner 1:0eaa7682f7e1 271 diceEn = 1;
ladner 1:0eaa7682f7e1 272 diceTick = 1;
ladner 1:0eaa7682f7e1 273 DicePrint();
ladner 1:0eaa7682f7e1 274 }
ladner 1:0eaa7682f7e1 275 }
ladner 5:31d406df862a 276
ladner 1:0eaa7682f7e1 277 void DiceStop()
ladner 0:e97a6a69fe4b 278 {
ladner 1:0eaa7682f7e1 279 if(diceEn==1)
ladner 1:0eaa7682f7e1 280 {
ladner 5:31d406df862a 281 if(RandomDice.read_us()> 200)
ladner 1:0eaa7682f7e1 282 {
ladner 1:0eaa7682f7e1 283 DiceAnim.detach();
ladner 1:0eaa7682f7e1 284 diceEn = 2;
ladner 1:0eaa7682f7e1 285 diceTick = 0;
ladner 1:0eaa7682f7e1 286 diceNum = Random.read_us()%7;
ladner 5:31d406df862a 287 diceNum = (RandomDice.read_us()+diceNum)%7+1;
ladner 5:31d406df862a 288 RandomDice.stop();
ladner 5:31d406df862a 289 RandomDice.reset();
ladner 1:0eaa7682f7e1 290 if(diceNum==7)
ladner 1:0eaa7682f7e1 291 {
ladner 1:0eaa7682f7e1 292 diceEn=3;
ladner 1:0eaa7682f7e1 293 for(char i = 0;i<Steine;i++)
ladner 4:2acb70f9cd22 294 if((PlayPos[(Drann<<2)|i]>Steine -1)&&(PlayPos[(Drann<<2)|i] < Steine + Feldgrose*Spieler))
ladner 1:0eaa7682f7e1 295 for(char j = 1;j<=6;j++)
ladner 1:0eaa7682f7e1 296 {
ladner 1:0eaa7682f7e1 297 char temp = Field[(PlayPos[(Drann<<2)|i]- Steine + Feldgrose * Drann+j) % (Feldgrose*Steine)];
ladner 1:0eaa7682f7e1 298 if(temp>0)
ladner 1:0eaa7682f7e1 299 {
ladner 1:0eaa7682f7e1 300 temp--; //(Spieler<<2)|Stein
ladner 1:0eaa7682f7e1 301 temp = (temp&0xC)>>2;//Spieler
ladner 1:0eaa7682f7e1 302 if(temp!=Drann)
ladner 1:0eaa7682f7e1 303 if(j<diceNum)
ladner 1:0eaa7682f7e1 304 diceNum=j;
ladner 1:0eaa7682f7e1 305 }
ladner 1:0eaa7682f7e1 306 }
ladner 1:0eaa7682f7e1 307 //PlayPos[(Drann<<2)|i] im Feld suchen, weiter setzen, wenn treffer, der kleiner als diceNum ->setzen von diceNum
ladner 1:0eaa7682f7e1 308 }//DiceNum == 7
ladner 1:0eaa7682f7e1 309 if(diceNum==7)
ladner 1:0eaa7682f7e1 310 diceNum=6;
ladner 1:0eaa7682f7e1 311 port.printf("LDiceNum:%d\n",diceNum);
ladner 1:0eaa7682f7e1 312 DicePrint();
ladner 1:0eaa7682f7e1 313 GameCal();
ladner 1:0eaa7682f7e1 314 }
ladner 1:0eaa7682f7e1 315 }
ladner 1:0eaa7682f7e1 316 }
ladner 5:31d406df862a 317
ladner 1:0eaa7682f7e1 318 void setDice(char number)
ladner 1:0eaa7682f7e1 319 {
ladner 1:0eaa7682f7e1 320 if(diceEn==1)
ladner 1:0eaa7682f7e1 321 {
ladner 1:0eaa7682f7e1 322 DiceAnim.detach();
ladner 1:0eaa7682f7e1 323 diceTick = 0;
ladner 5:31d406df862a 324 RandomDice.stop();
ladner 5:31d406df862a 325 RandomDice.reset();
ladner 1:0eaa7682f7e1 326 }
ladner 1:0eaa7682f7e1 327 diceEn = 2;
ladner 1:0eaa7682f7e1 328 diceNum = number;
ladner 1:0eaa7682f7e1 329 if(diceNum>7)
ladner 1:0eaa7682f7e1 330 diceNum=7;
ladner 1:0eaa7682f7e1 331 if(diceNum==7)
ladner 1:0eaa7682f7e1 332 {
ladner 1:0eaa7682f7e1 333 diceEn=3;
ladner 1:0eaa7682f7e1 334 for(char i = 0;i<Steine;i++)
ladner 1:0eaa7682f7e1 335 if((PlayPos[(Drann<<2)|i]>3)&&(PlayPos[(Drann<<2)|i] < 44))
ladner 1:0eaa7682f7e1 336 for(char j = 1;j<=6;j++)
ladner 1:0eaa7682f7e1 337 {
ladner 1:0eaa7682f7e1 338 char temp = Field[(PlayPos[(Drann<<2)|i]- Steine + Feldgrose * Drann+j) % (Feldgrose*Steine)];
ladner 1:0eaa7682f7e1 339 if(temp>0)
ladner 1:0eaa7682f7e1 340 {
ladner 1:0eaa7682f7e1 341 temp--; //(Spieler<<2)|Stein
ladner 1:0eaa7682f7e1 342 temp = (temp&0xC)>>2;//Spieler
ladner 1:0eaa7682f7e1 343 if(temp!=Drann)
ladner 1:0eaa7682f7e1 344 if(j<diceNum)
ladner 1:0eaa7682f7e1 345 diceNum=j;
ladner 1:0eaa7682f7e1 346 }
ladner 1:0eaa7682f7e1 347 }
ladner 1:0eaa7682f7e1 348 //PlayPos[(Drann<<2)|i] im Feld suchen, weiter setzen, wenn treffer, der kleiner als diceNum ->setzen von diceNum
ladner 1:0eaa7682f7e1 349 }//DiceNum == 7
ladner 1:0eaa7682f7e1 350 if(diceNum==7)
ladner 1:0eaa7682f7e1 351 diceNum=6;
ladner 1:0eaa7682f7e1 352 port.printf("LForceDice:%d\n",diceNum);
ladner 1:0eaa7682f7e1 353 DicePrint();
ladner 1:0eaa7682f7e1 354 GameCal();
ladner 1:0eaa7682f7e1 355 }
ladner 5:31d406df862a 356
ladner 1:0eaa7682f7e1 357 void DiceRun()
ladner 1:0eaa7682f7e1 358 {
ladner 1:0eaa7682f7e1 359 if(diceTick)
ladner 1:0eaa7682f7e1 360 {
ladner 1:0eaa7682f7e1 361 diceTick=0;
ladner 1:0eaa7682f7e1 362 if(dicePos<7)
ladner 1:0eaa7682f7e1 363 dicePos++;
ladner 1:0eaa7682f7e1 364 else
ladner 1:0eaa7682f7e1 365 dicePos=0;
ladner 1:0eaa7682f7e1 366 }
ladner 1:0eaa7682f7e1 367 else
ladner 1:0eaa7682f7e1 368 diceTick=1;
ladner 1:0eaa7682f7e1 369 DicePrint();
ladner 0:e97a6a69fe4b 370 }
ladner 0:e97a6a69fe4b 371
ladner 1:0eaa7682f7e1 372 void DicePrint()
ladner 0:e97a6a69fe4b 373 {
ladner 1:0eaa7682f7e1 374 switch(diceEn)
ladner 1:0eaa7682f7e1 375 {
ladner 1:0eaa7682f7e1 376 case 0:
ladner 1:0eaa7682f7e1 377 myled=(myled&0xFF0);
ladner 1:0eaa7682f7e1 378 port.printf("W%c%c\n",27,27);
ladner 1:0eaa7682f7e1 379 break;
ladner 1:0eaa7682f7e1 380 case 1:
ladner 1:0eaa7682f7e1 381 char dice_help = 0xFF-(1<<dicePos);
ladner 1:0eaa7682f7e1 382 myled=(myled&0xFF0)|(5)|(diceTick<<1);
ladner 1:0eaa7682f7e1 383 //myled = (myled&0xF)|(dice_help<<4);
ladner 1:0eaa7682f7e1 384
ladner 1:0eaa7682f7e1 385 port.printf("W%c%c\n" , 27 + diceTick+((dice_help&0x1F)<<1),27 + ((dice_help& 0xE0)>>5));
ladner 1:0eaa7682f7e1 386 break;
ladner 6:ca3d431f2daf 387 case 2://Case 3 = Case 2
ladner 1:0eaa7682f7e1 388 myled=(myled&0xFF0)|(diceNum);
ladner 1:0eaa7682f7e1 389 //myled=myled|0xFF0;
ladner 1:0eaa7682f7e1 390
ladner 1:0eaa7682f7e1 391 port.printf("W%c%c\n" , 27 +(diceDecode[diceNum-1]&0x3F),27 + ((diceDecode[diceNum-1]&0x1C0)>>6));
ladner 1:0eaa7682f7e1 392 break;
ladner 1:0eaa7682f7e1 393 case 3:
ladner 1:0eaa7682f7e1 394 myled=(myled&0xFF0)|(diceNum)|8;
ladner 1:0eaa7682f7e1 395 //myled=myled|0xFF0;
ladner 1:0eaa7682f7e1 396
ladner 1:0eaa7682f7e1 397 port.printf("W%c%c\n" , 27 +(diceDecode[diceNum-1]&0x3F),27 + ((diceDecode[diceNum-1]&0x1C0)>>6));
ladner 1:0eaa7682f7e1 398 break;
ladner 1:0eaa7682f7e1 399 }
ladner 0:e97a6a69fe4b 400 }
ladner 1:0eaa7682f7e1 401
ladner 1:0eaa7682f7e1 402 void FieldGenerate()
ladner 1:0eaa7682f7e1 403 {
ladner 1:0eaa7682f7e1 404 for(char i = 0; i<Spieler*Feldgrose;i++)
ladner 1:0eaa7682f7e1 405 Field[i]=0; //Feld zurücksetzen
ladner 5:31d406df862a 406 for (char i = 0; i < Spieler*Steine; i++)
ladner 5:31d406df862a 407 {
ladner 5:31d406df862a 408 Ziel[i]=0;
ladner 5:31d406df862a 409 Start[i]=0;
ladner 5:31d406df862a 410 }
ladner 1:0eaa7682f7e1 411
ladner 1:0eaa7682f7e1 412 for(char i = 0; i<Spieler;i++)
ladner 1:0eaa7682f7e1 413 for(char j = 0; j<Steine;j++)
ladner 1:0eaa7682f7e1 414 {
ladner 1:0eaa7682f7e1 415 if (PlayPos[(i<<2)|j] >= Steine)
ladner 1:0eaa7682f7e1 416 {
ladner 5:31d406df862a 417 if (PlayPos[(i<<2)|j] >= (Spieler * Feldgrose + Steine))
ladner 1:0eaa7682f7e1 418 {
ladner 5:31d406df862a 419 //if (PlayPos[(i<<2)|j] < Steine * Feldgrose+Steine*2)
ladner 5:31d406df862a 420 Ziel[(PlayPos[(i<<2)|j] - (Spieler * Feldgrose + Steine))|(i<<2)] = ((i<<2)|j) + 1;
ladner 1:0eaa7682f7e1 421 //Ziel PlayPos[(i<<2)|j] - 44
ladner 1:0eaa7682f7e1 422 }
ladner 1:0eaa7682f7e1 423 else
ladner 1:0eaa7682f7e1 424 Field[(PlayPos[(i<<2)|j]- Steine + Feldgrose * i) % (Steine * Feldgrose)] = ((i<<2)|j) + 1;
ladner 1:0eaa7682f7e1 425 //Feld (PlayPos[(i<<2)|j]- 4 + 10 * i) % 40
ladner 1:0eaa7682f7e1 426 }
ladner 1:0eaa7682f7e1 427 else
ladner 5:31d406df862a 428 Start[PlayPos[(i<<2)|j]|(i<<2)] = ((i<<2)|j)+1;
ladner 1:0eaa7682f7e1 429 //start PlayPos[(i<<2)|j]
ladner 1:0eaa7682f7e1 430 }
ladner 1:0eaa7682f7e1 431 }
ladner 1:0eaa7682f7e1 432
ladner 1:0eaa7682f7e1 433 void FieldPrint()
ladner 1:0eaa7682f7e1 434 {
ladner 1:0eaa7682f7e1 435 port.printf("F");
ladner 1:0eaa7682f7e1 436 for(char i = 0;i<Spieler*Steine;i++)
ladner 1:0eaa7682f7e1 437 {
ladner 1:0eaa7682f7e1 438 port.printf("%c",27+PlayPos[i]);
ladner 1:0eaa7682f7e1 439 }
ladner 1:0eaa7682f7e1 440 port.printf("\n");
ladner 1:0eaa7682f7e1 441 }
ladner 1:0eaa7682f7e1 442
ladner 1:0eaa7682f7e1 443 void FeldPrint()
ladner 1:0eaa7682f7e1 444 {
ladner 1:0eaa7682f7e1 445 __disable_irq();
ladner 1:0eaa7682f7e1 446 for(char i = 0;i<Spieler*Feldgrose;i++)
ladner 1:0eaa7682f7e1 447 if(Field[i]>0)
ladner 1:0eaa7682f7e1 448 Feld.WriteLed(Farben[((Field[i]- 1)&0x0C)>>2]);
ladner 1:0eaa7682f7e1 449 else
ladner 1:0eaa7682f7e1 450 Feld.WriteLed(0);
ladner 5:31d406df862a 451 //char Start[Spieler];
ladner 5:31d406df862a 452 //char Ziel[Spieler];
ladner 5:31d406df862a 453 char i = 0;
ladner 5:31d406df862a 454 char j = 0;
ladner 5:31d406df862a 455 while(i < Steine*Spieler)
ladner 5:31d406df862a 456 {
ladner 5:31d406df862a 457 if(Start[i]>0)
ladner 5:31d406df862a 458 Home.WriteLed(Farben[((Start[i]- 1)&0x0C)>>2]);
ladner 5:31d406df862a 459 else
ladner 5:31d406df862a 460 Home.WriteLed(0);
ladner 5:31d406df862a 461 i++;
ladner 5:31d406df862a 462 }
ladner 5:31d406df862a 463 do
ladner 5:31d406df862a 464 {
ladner 5:31d406df862a 465 if(Ziel[j]>0)
ladner 5:31d406df862a 466 Home.WriteLed(Farben[((Ziel[j]- 1)&0x0C)>>2]);
ladner 5:31d406df862a 467 else
ladner 5:31d406df862a 468 Home.WriteLed(0);
ladner 5:31d406df862a 469 j++;
ladner 5:31d406df862a 470 }while(j < Steine*Spieler);
ladner 1:0eaa7682f7e1 471 __enable_irq();
ladner 0:e97a6a69fe4b 472 }
ladner 1:0eaa7682f7e1 473
ladner 6:ca3d431f2daf 474 void AnimCal()
ladner 6:ca3d431f2daf 475 {
ladner 6:ca3d431f2daf 476 for(char i = 0; i<Spieler*Feldgrose;i++)
ladner 6:ca3d431f2daf 477 AnimField[i]=0; //Feld zurücksetzen
ladner 6:ca3d431f2daf 478 for (char i = 0; i < Spieler*Steine; i++)
ladner 6:ca3d431f2daf 479 {
ladner 6:ca3d431f2daf 480 AnimZiel[i]=0;
ladner 6:ca3d431f2daf 481 AnimStart[i]=0;
ladner 6:ca3d431f2daf 482 }
ladner 6:ca3d431f2daf 483 AnimDo=0;//Feld_Animieren,Start Animieren, Ziel Animieren
ladner 6:ca3d431f2daf 484
ladner 6:ca3d431f2daf 485 //char AnimDo; //Feld_Animieren,Start Animieren, Ziel Animierenw
ladner 6:ca3d431f2daf 486
ladner 6:ca3d431f2daf 487 for (char i = 0; i < Spieler*Steine; i++) //Hauptschleife
ladner 6:ca3d431f2daf 488 if(i==((Drann<<2)|selected))
ladner 6:ca3d431f2daf 489 {
ladner 6:ca3d431f2daf 490 if(moglich[selected]==1)
ladner 6:ca3d431f2daf 491 {
ladner 6:ca3d431f2daf 492 if(PlayPos[i]<Steine) //nicht Draußsen
ladner 6:ca3d431f2daf 493 {
ladner 6:ca3d431f2daf 494 AnimDo = AnimDo|3;//Feld&Start
ladner 6:ca3d431f2daf 495 AnimPos[i] = Steine; //Ausfahren
ladner 6:ca3d431f2daf 496 char temp = Field[Drann*Feldgrose]; //Ansetzfeld wird analysiert
ladner 6:ca3d431f2daf 497 if(temp>0)
ladner 6:ca3d431f2daf 498 {
ladner 6:ca3d431f2daf 499 //myled = myled|temp<<8;
ladner 6:ca3d431f2daf 500 temp--; //(Spieler<<2)|Stein
ladner 6:ca3d431f2daf 501 AnimPos[temp] = (temp & 0x03); //rücksetzung des Feldes...
ladner 6:ca3d431f2daf 502 }
ladner 6:ca3d431f2daf 503 }
ladner 6:ca3d431f2daf 504 else //Draußen
ladner 6:ca3d431f2daf 505 {
ladner 6:ca3d431f2daf 506 AnimDo = AnimDo|1; //Feld
ladner 6:ca3d431f2daf 507 AnimPos[i] = PlayPos[i]+diceNum;; //Weitersetzen
ladner 6:ca3d431f2daf 508 //PlayPos[(Drann<<2)|selected]
ladner 6:ca3d431f2daf 509 if(AnimPos[i]<Steine+Spieler*Feldgrose) //noch nicht drinnen
ladner 6:ca3d431f2daf 510 {
ladner 6:ca3d431f2daf 511 //Field>0
ladner 6:ca3d431f2daf 512 char temp = Field[ (AnimPos[i]-Steine+Feldgrose*Drann) % (Feldgrose*Steine) ];
ladner 6:ca3d431f2daf 513 if(temp>0)
ladner 6:ca3d431f2daf 514 {
ladner 6:ca3d431f2daf 515 AnimDo = AnimDo|3;//Feld&Start
ladner 6:ca3d431f2daf 516 //myled = myled|temp<<8;
ladner 6:ca3d431f2daf 517 temp--; //(Spieler<<2)|Stein
ladner 6:ca3d431f2daf 518 AnimPos[temp] = (temp & 0x03); //rücksetzung des Feldes...
ladner 6:ca3d431f2daf 519 }
ladner 6:ca3d431f2daf 520 }
ladner 6:ca3d431f2daf 521 else
ladner 6:ca3d431f2daf 522 AnimDo=AnimDo|7;//Feld&Ziel (Start auch wegen Hardware)
ladner 6:ca3d431f2daf 523 }
ladner 6:ca3d431f2daf 524 }
ladner 6:ca3d431f2daf 525 else
ladner 6:ca3d431f2daf 526 AnimPos[i] = PlayPos[i]; //Spieler-pos Kopieren, weil es nicht möglich ist...
ladner 6:ca3d431f2daf 527 }
ladner 6:ca3d431f2daf 528 else
ladner 6:ca3d431f2daf 529 AnimPos[i] = PlayPos[i]; //Spieler-pos Kopieren
ladner 6:ca3d431f2daf 530 //FieldGenerate -> Anim...
ladner 6:ca3d431f2daf 531 for(char i = 0; i<Spieler;i++)
ladner 6:ca3d431f2daf 532 for(char j = 0; j<Steine;j++)
ladner 6:ca3d431f2daf 533 {
ladner 6:ca3d431f2daf 534 if (AnimPos[(i<<2)|j] >= Steine)
ladner 6:ca3d431f2daf 535 {
ladner 6:ca3d431f2daf 536 if (AnimPos[(i<<2)|j] >= (Spieler * Feldgrose + Steine))
ladner 6:ca3d431f2daf 537 {
ladner 6:ca3d431f2daf 538 //if (AnimPos[(i<<2)|j] < Steine * Feldgrose+Steine*2)
ladner 6:ca3d431f2daf 539 AnimZiel[(AnimPos[(i<<2)|j] - (Spieler * Feldgrose + Steine))|(i<<2)] = ((i<<2)|j) + 1;
ladner 6:ca3d431f2daf 540 //AnimZiel AnimPos[(i<<2)|j] - 44
ladner 6:ca3d431f2daf 541 }
ladner 6:ca3d431f2daf 542 else
ladner 6:ca3d431f2daf 543 AnimField[(AnimPos[(i<<2)|j]- Steine + Feldgrose * i) % (Steine * Feldgrose)] = ((i<<2)|j) + 1;
ladner 6:ca3d431f2daf 544 //Feld (AnimPos[(i<<2)|j]- 4 + 10 * i) % 40
ladner 6:ca3d431f2daf 545 }
ladner 6:ca3d431f2daf 546 else
ladner 6:ca3d431f2daf 547 AnimStart[AnimPos[(i<<2)|j]|(i<<2)] = ((i<<2)|j)+1;
ladner 6:ca3d431f2daf 548 //start AnimPos[(i<<2)|j]
ladner 6:ca3d431f2daf 549 }
ladner 6:ca3d431f2daf 550 }
ladner 6:ca3d431f2daf 551
ladner 5:31d406df862a 552 void MoveRun() //Animation (zyklisch)
ladner 0:e97a6a69fe4b 553 {
ladner 1:0eaa7682f7e1 554 if(MoveShow)
ladner 6:ca3d431f2daf 555 MoveShow = 0;
ladner 1:0eaa7682f7e1 556 else
ladner 1:0eaa7682f7e1 557 MoveShow = 1;
ladner 5:31d406df862a 558
ladner 1:0eaa7682f7e1 559 if(MoveShow>0)
ladner 0:e97a6a69fe4b 560 {
ladner 1:0eaa7682f7e1 561 port.printf("F");
ladner 1:0eaa7682f7e1 562 for(char i = 0;i<Spieler*Steine;i++)
ladner 6:ca3d431f2daf 563 {
ladner 6:ca3d431f2daf 564 port.printf("%c",27+AnimPos[i]);
ladner 6:ca3d431f2daf 565 }
ladner 6:ca3d431f2daf 566 port.printf("\n");
ladner 6:ca3d431f2daf 567
ladner 6:ca3d431f2daf 568 __disable_irq();
ladner 6:ca3d431f2daf 569 if((AnimDo&1)>0)
ladner 6:ca3d431f2daf 570 {
ladner 6:ca3d431f2daf 571 for(char i = 0;i<Spieler*Feldgrose;i++)
ladner 6:ca3d431f2daf 572 if(AnimField[i]>0)
ladner 6:ca3d431f2daf 573 Feld.WriteLed(Farben[((AnimField[i]- 1)&0x0C)>>2]);
ladner 6:ca3d431f2daf 574 else
ladner 6:ca3d431f2daf 575 Feld.WriteLed(0);
ladner 6:ca3d431f2daf 576 }
ladner 6:ca3d431f2daf 577 //char Start[Spieler];
ladner 6:ca3d431f2daf 578 //char Ziel[Spieler];
ladner 6:ca3d431f2daf 579 char i = 0;
ladner 6:ca3d431f2daf 580 char j = 0;
ladner 6:ca3d431f2daf 581 if((AnimDo&2)>0)
ladner 6:ca3d431f2daf 582 {
ladner 6:ca3d431f2daf 583 while(i < Steine*Spieler)
ladner 1:0eaa7682f7e1 584 {
ladner 6:ca3d431f2daf 585 if(AnimStart[i]>0)
ladner 6:ca3d431f2daf 586 Home.WriteLed(Farben[((AnimStart[i]- 1)&0x0C)>>2]);
ladner 1:0eaa7682f7e1 587 else
ladner 6:ca3d431f2daf 588 Home.WriteLed(0);
ladner 6:ca3d431f2daf 589 i++;
ladner 1:0eaa7682f7e1 590 }
ladner 6:ca3d431f2daf 591 }
ladner 6:ca3d431f2daf 592 if((AnimDo&4)>0)
ladner 6:ca3d431f2daf 593 {
ladner 6:ca3d431f2daf 594 do
ladner 6:ca3d431f2daf 595 {
ladner 6:ca3d431f2daf 596 if(AnimZiel[j]>0)
ladner 6:ca3d431f2daf 597 Home.WriteLed(Farben[((AnimZiel[j]- 1)&0x0C)>>2]);
ladner 6:ca3d431f2daf 598 else
ladner 6:ca3d431f2daf 599 Home.WriteLed(0);
ladner 6:ca3d431f2daf 600 j++;
ladner 6:ca3d431f2daf 601 }while(j < Steine*Spieler);
ladner 6:ca3d431f2daf 602 }
ladner 1:0eaa7682f7e1 603 __enable_irq();
ladner 1:0eaa7682f7e1 604 }
ladner 1:0eaa7682f7e1 605 else
ladner 5:31d406df862a 606 {
ladner 1:0eaa7682f7e1 607 FieldPrint();
ladner 6:ca3d431f2daf 608 __disable_irq();
ladner 6:ca3d431f2daf 609 if((AnimDo&1)>0)
ladner 6:ca3d431f2daf 610 {
ladner 6:ca3d431f2daf 611 for(char i = 0;i<Spieler*Feldgrose;i++)
ladner 6:ca3d431f2daf 612 if(Field[i]>0)
ladner 6:ca3d431f2daf 613 Feld.WriteLed(Farben[((Field[i]- 1)&0x0C)>>2]);
ladner 6:ca3d431f2daf 614 else
ladner 6:ca3d431f2daf 615 Feld.WriteLed(0);
ladner 6:ca3d431f2daf 616 }
ladner 6:ca3d431f2daf 617 //char Start[Spieler];
ladner 6:ca3d431f2daf 618 //char Ziel[Spieler];
ladner 6:ca3d431f2daf 619 char i = 0;
ladner 6:ca3d431f2daf 620 char j = 0;
ladner 6:ca3d431f2daf 621 if((AnimDo&2)>0)
ladner 6:ca3d431f2daf 622 {
ladner 6:ca3d431f2daf 623 while(i < Steine*Spieler)
ladner 6:ca3d431f2daf 624 {
ladner 6:ca3d431f2daf 625 if(Start[i]>0)
ladner 6:ca3d431f2daf 626 Home.WriteLed(Farben[((Start[i]- 1)&0x0C)>>2]);
ladner 6:ca3d431f2daf 627 else
ladner 6:ca3d431f2daf 628 Home.WriteLed(0);
ladner 6:ca3d431f2daf 629 i++;
ladner 6:ca3d431f2daf 630 }
ladner 6:ca3d431f2daf 631 }
ladner 6:ca3d431f2daf 632 if((AnimDo&4)>0)
ladner 6:ca3d431f2daf 633 {
ladner 6:ca3d431f2daf 634 do
ladner 6:ca3d431f2daf 635 {
ladner 6:ca3d431f2daf 636 if(Ziel[j]>0)
ladner 6:ca3d431f2daf 637 Home.WriteLed(Farben[((Ziel[j]- 1)&0x0C)>>2]);
ladner 6:ca3d431f2daf 638 else
ladner 6:ca3d431f2daf 639 Home.WriteLed(0);
ladner 6:ca3d431f2daf 640 j++;
ladner 6:ca3d431f2daf 641 }while(j < Steine*Spieler);
ladner 6:ca3d431f2daf 642 }
ladner 6:ca3d431f2daf 643 __enable_irq();
ladner 5:31d406df862a 644 }
ladner 1:0eaa7682f7e1 645 }
ladner 1:0eaa7682f7e1 646
ladner 1:0eaa7682f7e1 647 void moveNext()
ladner 1:0eaa7682f7e1 648 {
ladner 1:0eaa7682f7e1 649 selected = (selected+1)%Steine;
ladner 1:0eaa7682f7e1 650 for(char i = 0;i<Steine;i++)
ladner 1:0eaa7682f7e1 651 if(moglich[selected]>0)
ladner 1:0eaa7682f7e1 652 break;
ladner 1:0eaa7682f7e1 653 else
ladner 1:0eaa7682f7e1 654 selected = (selected+1)%Steine;
ladner 6:ca3d431f2daf 655 AnimCal();
ladner 1:0eaa7682f7e1 656 }
ladner 1:0eaa7682f7e1 657
ladner 1:0eaa7682f7e1 658 void moveLast()
ladner 1:0eaa7682f7e1 659 {
ladner 1:0eaa7682f7e1 660 selected = (selected+3)%Steine;
ladner 1:0eaa7682f7e1 661 for(char i = 0;i<Steine;i++)
ladner 1:0eaa7682f7e1 662 if(moglich[selected]>0)
ladner 1:0eaa7682f7e1 663 break;
ladner 1:0eaa7682f7e1 664 else
ladner 1:0eaa7682f7e1 665 selected = (selected+3)%Steine;
ladner 6:ca3d431f2daf 666 AnimCal();
ladner 1:0eaa7682f7e1 667 }
ladner 1:0eaa7682f7e1 668
ladner 1:0eaa7682f7e1 669 void GameCal()
ladner 1:0eaa7682f7e1 670 {
ladner 1:0eaa7682f7e1 671 char drausen = 0; //Ziel
ladner 1:0eaa7682f7e1 672 char feld = 0;
ladner 1:0eaa7682f7e1 673 char drinnen = 0; //start
ladner 2:3a90b20958ff 674 char moglichAny = 1;
ladner 1:0eaa7682f7e1 675 for(char i = 0;i<Steine;i++)
ladner 1:0eaa7682f7e1 676 {
ladner 1:0eaa7682f7e1 677 if(PlayPos[(Drann<<2)|i]>3)
ladner 0:e97a6a69fe4b 678 {
ladner 1:0eaa7682f7e1 679 if(PlayPos[(Drann<<2)|i] > 43)
ladner 1:0eaa7682f7e1 680 drausen++;
ladner 1:0eaa7682f7e1 681 else
ladner 1:0eaa7682f7e1 682 feld++;
ladner 0:e97a6a69fe4b 683 }
ladner 1:0eaa7682f7e1 684 else
ladner 1:0eaa7682f7e1 685 drinnen++;
ladner 1:0eaa7682f7e1 686 moglich[i]=0;
ladner 1:0eaa7682f7e1 687 }
ladner 1:0eaa7682f7e1 688 //Berechnung
ladner 2:3a90b20958ff 689 //Ausfahren:
ladner 2:3a90b20958ff 690 //drinnen >0 (Noch Spieler drinnen?)
ladner 2:3a90b20958ff 691 //Startfeld ist von Spieler belegt
ladner 2:3a90b20958ff 692 //Ziel ist frei
ladner 2:3a90b20958ff 693 if((drinnen>0)&&(moglichAny))
ladner 2:3a90b20958ff 694 {
ladner 4:2acb70f9cd22 695 //port.printf("LDrinnen\n");
ladner 2:3a90b20958ff 696 if(((((Field[Feldgrose*Drann]-1) &0x0C) >>2)==Drann)&&(Field[Feldgrose*Drann]>0))
ladner 2:3a90b20958ff 697 {
ladner 4:2acb70f9cd22 698 //port.printf("LAusfahrt Belegt\n");
ladner 2:3a90b20958ff 699 if(((((Field[(Feldgrose*Drann+diceNum)%(Feldgrose*Spieler)]-1) &0x0C) >>2)!=Drann)||(Field[(Feldgrose*Drann+diceNum)%(Feldgrose*Spieler)]==0))
ladner 2:3a90b20958ff 700 {
ladner 4:2acb70f9cd22 701 //port.printf("LZiel frei (Done)\n");
ladner 2:3a90b20958ff 702 moglich[(Field[Feldgrose*Drann]-1) &0x03] = 1;
ladner 2:3a90b20958ff 703 moglichAny=0;
ladner 2:3a90b20958ff 704 }
ladner 2:3a90b20958ff 705 }
ladner 0:e97a6a69fe4b 706 }
ladner 2:3a90b20958ff 707
ladner 2:3a90b20958ff 708 //Ansetzen
ladner 2:3a90b20958ff 709 // 6 gewürfelt
ladner 2:3a90b20958ff 710 //drinnen>0
ladner 2:3a90b20958ff 711 //Start-feld ist nicht von Spieler belegt
ladner 2:3a90b20958ff 712 if((drinnen>0)&&(moglichAny)&&(diceNum==6))
ladner 0:e97a6a69fe4b 713 {
ladner 4:2acb70f9cd22 714 //port.printf("LDrinnen & 6 \n");
ladner 2:3a90b20958ff 715 if(((((Field[Feldgrose*Drann]-1) &0x0C) >>2)!=Drann)||(Field[Feldgrose*Drann]==0))
ladner 1:0eaa7682f7e1 716 {
ladner 4:2acb70f9cd22 717 //port.printf("LAusfahrt frei (Done...Schleife)\n");
ladner 2:3a90b20958ff 718 moglichAny=0;
ladner 1:0eaa7682f7e1 719 for(char i = 0;i<Steine;i++)
ladner 1:0eaa7682f7e1 720 if(PlayPos[(Drann<<2)|i]<Steine)
ladner 1:0eaa7682f7e1 721 moglich[i]=1;
ladner 1:0eaa7682f7e1 722 }
ladner 2:3a90b20958ff 723 }
ladner 2:3a90b20958ff 724
ladner 2:3a90b20958ff 725 //Fahren
ladner 2:3a90b20958ff 726 if(moglichAny)
ladner 2:3a90b20958ff 727 {
ladner 4:2acb70f9cd22 728 //port.printf("LNormal...\n");
ladner 2:3a90b20958ff 729 for(char i = 0;i<Steine;i++)
ladner 0:e97a6a69fe4b 730 {
ladner 2:3a90b20958ff 731 if(PlayPos[(Drann<<2)|i]>Spieler-1) //Drausen
ladner 1:0eaa7682f7e1 732 {
ladner 4:2acb70f9cd22 733 if((PlayPos[(Drann<<2)|i]-Steine+diceNum) < Feldgrose*Spieler)//Zeil noch am Feld
ladner 1:0eaa7682f7e1 734 {
ladner 2:3a90b20958ff 735 char temp = Field[(PlayPos[(Drann<<2)|i]- Steine + Feldgrose * Drann+diceNum) % (Feldgrose*Steine)]; //zielfeld
ladner 1:0eaa7682f7e1 736 if(temp>0)
ladner 1:0eaa7682f7e1 737 {
ladner 1:0eaa7682f7e1 738 //myled = myled|temp<<8;
ladner 1:0eaa7682f7e1 739 temp--; //(Spieler<<2)|Stein
ladner 1:0eaa7682f7e1 740 temp = (temp&0xC)>>2;//Spieler
ladner 2:3a90b20958ff 741 if(temp!=Drann) //zielfeld ist nicht ich
ladner 1:0eaa7682f7e1 742 moglich[i]=1;
ladner 1:0eaa7682f7e1 743 }
ladner 2:3a90b20958ff 744 else//Feld ist leer
ladner 1:0eaa7682f7e1 745 moglich[i]=1;
ladner 1:0eaa7682f7e1 746 }
ladner 2:3a90b20958ff 747 else
ladner 2:3a90b20958ff 748 {//Kollisionsberechnung ins Ziel...
ladner 4:2acb70f9cd22 749 if((PlayPos[(Drann<<2)|i]+diceNum)<(Steine*2+ Feldgrose*Spieler))//Schiest nicht über das Ziel hinaus...
ladner 3:814d47b6991c 750 if(Ziel[PlayPos[(Drann<<2)|i]-Steine-Feldgrose*Spieler+diceNum]==0)//Zielfeld ist leer (enthält ja nur mich)
ladner 4:2acb70f9cd22 751 moglich[i]=1;
ladner 2:3a90b20958ff 752 }
ladner 1:0eaa7682f7e1 753 }
ladner 1:0eaa7682f7e1 754 }
ladner 1:0eaa7682f7e1 755 }
ladner 2:3a90b20958ff 756
ladner 2:3a90b20958ff 757 moglichAny=0;
ladner 1:0eaa7682f7e1 758 myled = myled&0xF0F;
ladner 1:0eaa7682f7e1 759 for(char i = 0;i<Steine;i++)
ladner 2:3a90b20958ff 760 {
ladner 1:0eaa7682f7e1 761 myled = myled|(moglich[i]<<i+4);
ladner 1:0eaa7682f7e1 762 moglichAny = moglichAny | moglich[i];
ladner 2:3a90b20958ff 763 }
ladner 1:0eaa7682f7e1 764 if(moglichAny)
ladner 1:0eaa7682f7e1 765 {
ladner 1:0eaa7682f7e1 766 selected = (last[Drann]+Steine-1)%Steine;
ladner 1:0eaa7682f7e1 767 moveNext();
ladner 1:0eaa7682f7e1 768 MoveAnim.attach(&MoveRun,0.3);
ladner 1:0eaa7682f7e1 769 }
ladner 1:0eaa7682f7e1 770 else
ladner 1:0eaa7682f7e1 771 {
ladner 1:0eaa7682f7e1 772 if(feld)
ladner 1:0eaa7682f7e1 773 diceEn = 1;
ladner 4:2acb70f9cd22 774 else
ladner 1:0eaa7682f7e1 775 {
ladner 5:31d406df862a 776 if(count<2)
ladner 4:2acb70f9cd22 777 {
ladner 4:2acb70f9cd22 778 diceEn=0;
ladner 4:2acb70f9cd22 779 count++;
ladner 4:2acb70f9cd22 780 port.printf("LCount: %d\n",count);
ladner 4:2acb70f9cd22 781 }
ladner 0:e97a6a69fe4b 782 }
ladner 1:0eaa7682f7e1 783 }
ladner 1:0eaa7682f7e1 784 }
ladner 1:0eaa7682f7e1 785
ladner 1:0eaa7682f7e1 786 void MoveDo()
ladner 1:0eaa7682f7e1 787 {
ladner 1:0eaa7682f7e1 788 if(diceEn>1)
ladner 1:0eaa7682f7e1 789 {
ladner 5:31d406df862a 790 if(moglich[selected]==1)
ladner 1:0eaa7682f7e1 791 {
ladner 6:ca3d431f2daf 792 if(PlayPos[(Drann<<2)|selected]<Steine) //nicht Draußsen
ladner 1:0eaa7682f7e1 793 {
ladner 6:ca3d431f2daf 794 PlayPos[(Drann<<2)|selected] = Steine; //Ausfahren
ladner 6:ca3d431f2daf 795 char temp = Field[Drann*Feldgrose]; //Ansetzfeld wird analysiert
ladner 1:0eaa7682f7e1 796 if(temp>0)
ladner 1:0eaa7682f7e1 797 {
ladner 1:0eaa7682f7e1 798 //myled = myled|temp<<8;
ladner 1:0eaa7682f7e1 799 temp--; //(Spieler<<2)|Stein
ladner 1:0eaa7682f7e1 800 PlayPos[temp] = (temp & 0x03); //rücksetzung des Feldes...
ladner 1:0eaa7682f7e1 801 }
ladner 1:0eaa7682f7e1 802 }
ladner 6:ca3d431f2daf 803 else //Draußen
ladner 5:31d406df862a 804 {
ladner 6:ca3d431f2daf 805 PlayPos[(Drann<<2)|selected] += diceNum; //Weitersetzen
ladner 5:31d406df862a 806 //PlayPos[(Drann<<2)|selected]
ladner 6:ca3d431f2daf 807 if(PlayPos[(Drann<<2)|selected]<Steine+Spieler*Feldgrose) //noch nicht drinnen
ladner 5:31d406df862a 808 {
ladner 5:31d406df862a 809 //Field>0
ladner 5:31d406df862a 810 char temp = Field[ ( PlayPos[(Drann<<2)|selected] - Steine + (Feldgrose * Drann) ) % (Feldgrose*Steine) ];
ladner 5:31d406df862a 811 if(temp>0)
ladner 5:31d406df862a 812 {
ladner 5:31d406df862a 813 //myled = myled|temp<<8;
ladner 5:31d406df862a 814 temp--; //(Spieler<<2)|Stein
ladner 5:31d406df862a 815 PlayPos[temp] = (temp & 0x03); //rücksetzung des Feldes...
ladner 5:31d406df862a 816 }
ladner 5:31d406df862a 817 }
ladner 5:31d406df862a 818 }
ladner 5:31d406df862a 819 //else //nicht möglich
ladner 5:31d406df862a 820
ladner 0:e97a6a69fe4b 821 }
ladner 1:0eaa7682f7e1 822 MoveAnim.detach();
ladner 1:0eaa7682f7e1 823 last[Drann]=selected;
ladner 1:0eaa7682f7e1 824 if(diceNum<6)
ladner 1:0eaa7682f7e1 825 {
ladner 1:0eaa7682f7e1 826 Drann = (Drann+1)%Spieler;
ladner 1:0eaa7682f7e1 827 }
ladner 1:0eaa7682f7e1 828 diceEn = 0;
ladner 1:0eaa7682f7e1 829 count = 0;
ladner 1:0eaa7682f7e1 830 DicePrint();
ladner 1:0eaa7682f7e1 831 myled = myled&0xF0F;
ladner 1:0eaa7682f7e1 832 FieldGenerate();
ladner 1:0eaa7682f7e1 833 FieldPrint();
ladner 1:0eaa7682f7e1 834 FeldPrint();
ladner 1:0eaa7682f7e1 835 }
ladner 4:2acb70f9cd22 836 }
ladner 5:31d406df862a 837
ladner 4:2acb70f9cd22 838 void ColorPrint(uint32_t color)
ladner 4:2acb70f9cd22 839 {
ladner 4:2acb70f9cd22 840 port.printf("%c%c%c%c\n",27+((color&0xFC0000)>>18),27+((color&0x03f000)>>12),27+((color&0x000FC0)>>6),27+(color&0x00003F));
ladner 5:31d406df862a 841 }