Dependencies:   TextLCD mbed

Fork of Mbed-Mensch-1 by Projekte_werkstatt

Committer:
ladner
Date:
Thu Feb 04 15:51:34 2016 +0000
Revision:
1:0eaa7682f7e1
Parent:
0:e97a6a69fe4b
Child:
2:3a90b20958ff

        

Who changed what in which revision?

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