Dependencies:   Led-libary TextLCD mbed

Committer:
ladner
Date:
Sat Mar 12 23:26:51 2016 +0000
Revision:
9:cb931ad9731d
Parent:
8:8feae8c8ec8a
Child:
10:f635972952e0

        

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