Spelregler

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.

MiniMax

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.

Svårigheter och problem under projekarbetet, och tips och tricks

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.

Komponenter

Processor: ATMEGA1284
Knappsats: Grayhill 83BB1-001
Key encoder: MM74C922
J-TAG: ATMEL-ICE
Neopixlar: WS2812B
Kondensatorer: 0,1µF