Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: Led-libary TextLCD mbed
Fork of Laufled by
Diff: main.cpp
- Revision:
- 5:31d406df862a
- Parent:
- 4:2acb70f9cd22
- Child:
- 6:ca3d431f2daf
--- a/main.cpp Mon Feb 08 18:59:08 2016 +0000
+++ b/main.cpp Fri Mar 11 19:07:06 2016 +0000
@@ -1,5 +1,6 @@
#include "mbed.h"
#include "WS2812B.h"
+#include "TextLCD.h"
I2C i2c(P0_5,P0_4);
Serial port(P0_19,P0_18);
@@ -10,9 +11,11 @@
//BusIn btn(P1_16,P0_23,P0_10,P0_15);
RGBOut rgb(P0_21,P0_9,P1_15);
-
-LedOut Feld (P0_13);
-//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)
+ //Old: P0_13
+LedOut Feld (P1_23);//P1_23 ->14
+LedOut Home (P1_20);//P1_20->13
+LedOut Dice (P1_21);//P1_21->12
+//-> Würfel (ersten 3 LED in Binär-4. LED für 7. Zustand), Spieler, Start, Ziel, Referenz(auch RGB am board)
// übrige 8 LED für zeit-Anzeige des Zuges einer KI
InterruptIn Button0(P0_1);
@@ -22,7 +25,7 @@
InterruptIn Button4(P0_15);
Timer Random;
-Timer Dice;
+Timer RandomDice;
Ticker DiceAnim;
void DiceStart();
@@ -41,8 +44,8 @@
#define Steine 4
char PlayPos[Spieler*Steine]; //Zahl zwischen 0 & 47 ((0xC0 -> Spieler)>>2 / 0x03 -> Stein)
-char Start[Spieler]; //Enthält den Index für PlayPos (nur das 'normale' Spielfend)
-char Ziel[Spieler]; //Enthält den Index für PlayPos (nur das 'normale' Spielfend)
+char Start[Spieler*Steine]; //Enthält den Index für PlayPos (nur das 'normale' Spielfend)
+char Ziel[Spieler*Steine]; //Enthält den Index für PlayPos (nur das 'normale' Spielfend)
char Drann; //Spieler, der drann ist
char count; //Für 6er & mehrfaches Würfeln beim Ansetzen
char last[Spieler]; //zuletzt benutzte Spielstein, der zuletzt benutzt wurde
@@ -62,12 +65,20 @@
void MoveDo();
void ColorPrint(uint32_t color);
+char AnimField[Spieler*Feldgrose];
+char AnimStart[Spieler*Steine];
+char AnimZiel[Spieler*Steine];
+char AnimDo;
+void AnimCal();
+
void reset()
{
MoveAnim.detach();
DiceAnim.detach();
for(char i = 0;i<Spieler*Steine;i++)
PlayPos[i]=i%4;
+ for (char i = 0; i < Spieler; i++)
+ last[i]=0;
Drann=0;
diceEn=0;
myled = myled&0xF0F;
@@ -80,6 +91,22 @@
void btn2()
{
+ reset();
+ for(char i = 0;i<Spieler;i++)
+ PlayPos[i*Spieler]=Steine+Spieler*Feldgrose;
+ FieldGenerate();
+ FieldPrint();
+ FeldPrint();
+ /*
+ for(char i = 0; i<Spieler;i++)
+ for(char j = 0; j<Steine;j++)
+ Start[(i<<2)|j] = ((i<<2)|j)+1;
+ for(char i = 0; i<Spieler;i++)
+ for(char j = 0; j<Steine;j++)
+ Ziel[(i<<2)|j] = ((i<<2)|j)+1;
+ FeldPrint();
+ */
+ /*
Drann = 0;
PlayPos[1]=Steine+Feldgrose*Spieler;
//PlayPos[2]=Steine+Feldgrose*Spieler+1;
@@ -87,9 +114,10 @@
PlayPos[0]=Steine+Feldgrose*Spieler-1;
FieldGenerate();
FieldPrint();
- FeldPrint();
-
+ FeldPrint();
+ */
}
+
void btn3()
{
/*
@@ -114,6 +142,7 @@
wait(1);
}
}
+
void btn4()
{
/*
@@ -192,6 +221,7 @@
//.attach(&main,[sek]);
//.attach_us(&main,[micro-sec]);
//.detach();
+ wait(0.01);
Button0.rise(&reset);
Button1.rise(&DiceStart);
@@ -216,17 +246,18 @@
Farben[1]=0xFF0000;//Rot
Farben[2]=0x0000FF;//Blau
Farben[3]=0x00FFFF;//Gelb
-
__disable_irq();
for(char i = 0;i<Spieler;i++)
{
Feld.WriteLed(Farben[i]);
for(char j = 0;j<Feldgrose-1;j++)
- Feld.WriteLed(0);
+ if((j==(Feldgrose-2))&(i==(Spieler-1)))
+ Feld.WriteLed(0xFFFFFF);
+ else
+ Feld.WriteLed(0);
}
__enable_irq();
-
-
+ //reset();
while(1) ;
}
@@ -234,26 +265,27 @@
{
if(diceEn==0)
{
- Dice.start();
+ RandomDice.start();
DiceAnim.attach(&DiceRun,0.1);
diceEn = 1;
diceTick = 1;
DicePrint();
}
}
+
void DiceStop()
{
if(diceEn==1)
{
- if(Dice.read_us()> 200)
+ if(RandomDice.read_us()> 200)
{
DiceAnim.detach();
diceEn = 2;
diceTick = 0;
diceNum = Random.read_us()%7;
- diceNum = (Dice.read_us()+diceNum)%7+1;
- Dice.stop();
- Dice.reset();
+ diceNum = (RandomDice.read_us()+diceNum)%7+1;
+ RandomDice.stop();
+ RandomDice.reset();
if(diceNum==7)
{
diceEn=3;
@@ -281,14 +313,15 @@
}
}
}
+
void setDice(char number)
{
if(diceEn==1)
{
DiceAnim.detach();
diceTick = 0;
- Dice.stop();
- Dice.reset();
+ RandomDice.stop();
+ RandomDice.reset();
}
diceEn = 2;
diceNum = number;
@@ -319,6 +352,7 @@
DicePrint();
GameCal();
}
+
void DiceRun()
{
if(diceTick)
@@ -368,16 +402,21 @@
{
for(char i = 0; i<Spieler*Feldgrose;i++)
Field[i]=0; //Feld zurücksetzen
+ for (char i = 0; i < Spieler*Steine; i++)
+ {
+ Ziel[i]=0;
+ Start[i]=0;
+ }
for(char i = 0; i<Spieler;i++)
for(char j = 0; j<Steine;j++)
{
if (PlayPos[(i<<2)|j] >= Steine)
{
- if (PlayPos[(i<<2)|j] > Steine * Feldgrose+Steine-1)
+ if (PlayPos[(i<<2)|j] >= (Spieler * Feldgrose + Steine))
{
- if (PlayPos[(i<<2)|j] < Steine * Feldgrose+Steine*2)
- Ziel[PlayPos[(i<<2)|j] - Steine * Feldgrose+Steine] = ((i<<2)|j) + 1;
+ //if (PlayPos[(i<<2)|j] < Steine * Feldgrose+Steine*2)
+ Ziel[(PlayPos[(i<<2)|j] - (Spieler * Feldgrose + Steine))|(i<<2)] = ((i<<2)|j) + 1;
//Ziel PlayPos[(i<<2)|j] - 44
}
else
@@ -385,7 +424,7 @@
//Feld (PlayPos[(i<<2)|j]- 4 + 10 * i) % 40
}
else
- Start[PlayPos[(i<<2)|j]] = ((i<<2)|j)+1;
+ Start[PlayPos[(i<<2)|j]|(i<<2)] = ((i<<2)|j)+1;
//start PlayPos[(i<<2)|j]
}
}
@@ -408,38 +447,36 @@
Feld.WriteLed(Farben[((Field[i]- 1)&0x0C)>>2]);
else
Feld.WriteLed(0);
+ //char Start[Spieler];
+ //char Ziel[Spieler];
+ char i = 0;
+ char j = 0;
+ while(i < Steine*Spieler)
+ {
+ if(Start[i]>0)
+ Home.WriteLed(Farben[((Start[i]- 1)&0x0C)>>2]);
+ else
+ Home.WriteLed(0);
+ i++;
+ }
+ do
+ {
+ if(Ziel[j]>0)
+ Home.WriteLed(Farben[((Ziel[j]- 1)&0x0C)>>2]);
+ else
+ Home.WriteLed(0);
+ j++;
+ }while(j < Steine*Spieler);
__enable_irq();
}
-/*
-char PlayPos[Spieler*Steine]; //Zahl zwischen 0 & 47 ((0xC0 -> Spieler)>>2 / 0x03 -> Stein)
-char PlayPosOld[Spieler*Steine];
-char Start[Spieler]; //Enthält den Index für PlayPos (nur das 'normale' Spielfend)
-char Ziel[Spieler]; //Enthält den Index für PlayPos (nur das 'normale' Spielfend)
-char Drann; //Spieler, der drann ist
-char count; //Für 6er & mehrfaches Würfeln beim Ansetzen
-char last[Spieler]; //zuletzt benutzte Spielstein, der zuletzt benutzt wurde
-char moglich[Steine];
-char selected; //der aktuell ausgewählte Zug
-char Field[Spieler*Feldgrose]; //Enthält den Index für PlayPos (nur das 'normale' Spielfend)
-uint32_t Farben[Spieler]; //Berechnete Hellichkeiten der Speiler fertig zur Ausgabe...
-void FieldPrint(); //Ausgabe auf Com-Port
-void FieldGenerate(); //Berechnung von PlayPos auf Start, Ziel, Field
-void FeldPrint(); //Ausgabe von Field auf den Led-Streifen (Feld) der Farben
-void GameCal();
-void moveNext();
-void moveLast();
-Ticker MoveAnim;
-void MoveRun();
-char MoveShow;
-void MovePrint(); */
-
-void MoveRun()
+void MoveRun() //Animation (zyklisch)
{
if(MoveShow)
MoveShow=0;
else
MoveShow = 1;
+
if(MoveShow>0)
{
__disable_irq();
@@ -460,7 +497,10 @@
__enable_irq();
}
else
+ {
FieldPrint();
+ FeldPrint();
+ }
}
void moveNext()
@@ -590,7 +630,7 @@
diceEn = 1;
else
{
- if(count<3)
+ if(count<2)
{
diceEn=0;
count++;
@@ -604,25 +644,12 @@
{
if(diceEn>1)
{
- if(PlayPos[(Drann<<2)|selected]<Steine)
+ if(moglich[selected]==1)
{
- PlayPos[(Drann<<2)|selected] = Steine;
- char temp = Field[Drann*Feldgrose];
- if(temp>0)
+ if(PlayPos[(Drann<<2)|selected]<Steine)
{
- //myled = myled|temp<<8;
- temp--; //(Spieler<<2)|Stein
- PlayPos[temp] = (temp & 0x03); //rücksetzung des Feldes...
- }
- }
- else
- {
- PlayPos[(Drann<<2)|selected] += diceNum;
- //PlayPos[(Drann<<2)|selected]
- if((PlayPos[(Drann<<2)|selected]>=Steine)&&(PlayPos[(Drann<<2)|selected]<Steine+Spieler*Feldgrose))
- {
- //Field>0
- char temp = Field[ ( PlayPos[(Drann<<2)|selected] - Steine + (Feldgrose * Drann) ) % (Feldgrose*Steine) ];
+ PlayPos[(Drann<<2)|selected] = Steine;
+ char temp = Field[Drann*Feldgrose];
if(temp>0)
{
//myled = myled|temp<<8;
@@ -630,6 +657,24 @@
PlayPos[temp] = (temp & 0x03); //rücksetzung des Feldes...
}
}
+ else
+ {
+ PlayPos[(Drann<<2)|selected] += diceNum;
+ //PlayPos[(Drann<<2)|selected]
+ if((PlayPos[(Drann<<2)|selected]>=Steine)&&(PlayPos[(Drann<<2)|selected]<Steine+Spieler*Feldgrose))
+ {
+ //Field>0
+ char temp = Field[ ( PlayPos[(Drann<<2)|selected] - Steine + (Feldgrose * Drann) ) % (Feldgrose*Steine) ];
+ if(temp>0)
+ {
+ //myled = myled|temp<<8;
+ temp--; //(Spieler<<2)|Stein
+ PlayPos[temp] = (temp & 0x03); //rücksetzung des Feldes...
+ }
+ }
+ }
+ //else //nicht möglich
+
}
MoveAnim.detach();
last[Drann]=selected;
@@ -646,7 +691,8 @@
FeldPrint();
}
}
+
void ColorPrint(uint32_t color)
{
port.printf("%c%c%c%c\n",27+((color&0xFC0000)>>18),27+((color&0x03f000)>>12),27+((color&0x000FC0)>>6),27+(color&0x00003F));
-}
\ No newline at end of file
+}
