Luffarschack som spel går ut på att få tre i rad av sin färg. En rad kan vara antingen horisontellt, vertikalt, eller längs diagonalerna. Spelare alternerar tur, då den ena använder grön färg och den andra blå färg. Grön börjar alltid först. Knappsatsen är programmerad enligt nedanstående tabell, där alternativ för svårighetsgrad eller återställning av spelplanen finns längs sidorna.
När någon har vunnit blinkar spelplanen i vinnarens färg. Skulle det
inte gå att lägga fler drag kommer spelplanen istället att blinka rött.
För att återställa spelet efter ett parti måste reset tryckas ned.
En spelare kan välja att istället möta datorn. AIn har svårighetsgrader
lätt, mellan och svår att välja mellan. Av dessa ska den lättaste
svårighetsgraden inte kunna lägga ett vinnande drag, medan mellan-graden
lägger ett slumpmässigt drag. Den allra svåraste använder istället
minimax-logik, en beskrivning av detta följer nedan.
Källkoden för minimax finns under "källkod", men kan vara lite svår att
förstå. Principen grundar sig i spelteori, där minimax är en sorts
algoritm för att hitta det allra bästa möjliga draget. Tanken är att man
skapar en metod som går igenom sig själv, där det testas alla möjliga
drag för både sig själv och motståndaren för att sedan komma fram till
det bästa draget. Var gång man kommer in i metoden skapas en ny "nod".
Når man slutnoden, dvs den nod var inga fler drag längre kan placeras,
så returneras det poäng som den slutnoden har. Den slutnod med högst
poäng är den gren av nodträdet som datorn bör välja. I och med att
luffarschack är ett spel som är designat för att den som börjar kommer
vinna om denna spelar optimalt, innebär det att miniMax boten alltid
kommer att vinna.
Algoritmen är implementerad i en annan metod, "hittaTopDrag()", vilken
inte bara kollar varje nod genom miniMax, utan går först igenom lite
annan kod. Denna kod låter boten först göra ett drag i ett slumpmässigt
hörn om ingen har lagt ett drag än. Detta görs för att miniMax-koden
grundar sig i att någon först måste ha gjort ett drag. Hörnplaceringen
måste göras, då detta tillåter den att vinna.
Därefter kollar boten om den har något vinnande drag att göra, för att
sedan kolla om den kan förhindra ett vinnande drag. Först efter dessa
checkar kommer metoden att fortsätta med miniMax algoritmen.
Vi stötte på många problem under projektets gång, och jag tänkte berätta
lite om dem och hur vi i slutändan löste dem.
Buggar:
När vi kom längre in i projektet och hade skrivit en del kod så
upptäckte vi en del buggar i koden. Oavsett om det var buggar som att
knappsatsen gav samma värden på flera ställen, AIn inte fungerade eller
att placeringen blev fel, så gick vi till väga på mer eller mindre samma
sätt. Först och främst använde vi debuggern i Atmel Studio 7.
Det är ett väldigt bra verktyg, och det lönar sig verkligen att lära sig
det. Under debugging kan man även se port- och pinvärden, vilket var
speciellt användbart. Att förklara för någon annan vad man försökt göra,
och hur det borde fungera har ibland varit en bra lösning. Vid vissa
tillfällen när vi suttit i timmar med samma bug utan att göra några
större framsteg, har det varit bättre att glömma det och fokusera på
någon annan del av koden. Sedan dagen efter när man har sovit och kunnat
processera det har man väldigt ofta kunnat göra framsteg igen.
Neopixlar:
Till en början hade vi stora problem att få neopixlarna att fungera. Vår
plan var först att importera AdaFruit-biblioteket, men när vi inte kunde
få rätt på det så beslutade vi oss för att använda assembly istället.
Mycket av assembly-koden hämtades från den kod vi skrivit i laboration
3, dock så behövdes den modifieras i och med att processorn var klockad
i 8MHz, istället för 16MHz, och även för att våra pixlar inte var
riktigt de samma som de i laboration 3. När vi försökte använda asseblyn
så upptäcke vi dock att vi varken kunde få in röd färg eller stänga av
färgen på en pixel. Sättet vi löste detta på var att mäta en av
neopixlarna med ett oscilloskop medan vi skickade pulser och jämföra med
hur flankerna skulle se ut i databladet.
Hemsidan:
Nu är jag ingen mästare på HTML eller css, och detta är då verkligen
inget magnum opus, men jag tycker ändå att jag fått till hemsidan
någorlunda. Jag hade mycket liten erfarenhet av webbprogrammering innan
detta projektet, men det har faktiskt varit väldigt lätt att lära sig
tycker jag. Gentemot C-koden ser man direkt vad ens kod har för
konsekvenser på helheten, så man kan lätt hålla reda på vad man gör. För
att börja med hemsidan kollade jag upp någon Youtube-video på kanske 2
timmar, där de instruerade en att ladda ned Visual Studio Code, och hur
man lägger till extensions som exempelvis Live Server och Prettier.
Efter det så googlade jag efter allt jag ville göra. Många sökresultat
var från W3schools, vilken är en mycket bra resurs. Om man använder
Chrome så är ett tips att högerklicka på ens sida när man har den uppe
och trycka inspect. Där kan man direkt ändra attributer och se hur det
påverkar.
Processor: ATMEGA1284
Knappsats: Grayhill 83BB1-001
Key encoder: MM74C922
J-TAG: ATMEL-ICE
Neopixlar: WS2812B
Kondensatorer: 0,1µF