Dependencies:   Led-libary TextLCD mbed

Committer:
ladner
Date:
Sun Mar 13 20:00:34 2016 +0000
Revision:
12:7b480ec47c4c
Parent:
11:caa67a0ab7bd

        

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