Rapport Digitala Projekt EITF Grupp 12 Elin Blomstergren, Victor Sundgren Handledare: Bertil Lindvall. Fyra i rad

Relevanta dokument
EITF11 Digitala Projekt TIC TAC TOE. Lukas Ljungblom & Johan Lyckenvik I-13 Handledare: Bertil Lindvall

Rapport. Fyra i rad-spel. Rapport Digitala Projekt EITF11 Grupp 9 Emma Rasmusson & Louise Ragnarsson Handledare: Bertil Lindvall

Snake. Digitala Projekt (EITF11) Fredrik Jansson, I-12 Lunds Tekniska Högskola,

Rapport Digitala Projekt EITF11 Grupp 4 Axel Sundberg, Jakob Wennerström Gille Handledare: Bertil Lindvall

Växtviskaren EITF11 Digitala projekt VT15, I12

Feeding Daisy. EITF11 Lunds Tekniska Högskola. Grupp 12: Pontus Akervall Louise Landare Anton Schölin. En automatisk blomvattnare

TEMPERATURMÄTARE MED GRAFRITARE

Digitala Projekt(EITF40) - Larm

EITF11. WormFight. Axel Eriksson, Felix Geuken Handledare: Bertil Lindvall EITF11

Bilen som inte kan krocka

Larmcentral. Digitala Projekt. Cecilia Olsson & Erika Björck Handledare: Bertil Lindvall LUNDS TEKNISKA HÖGSKOLA

Lunds Tekniska Högskola EITF11 Digitala projekt. Bandspelaren

Rapportsammanfattning. Optima Sous Vide

LARMANLÄGGNING. Digitala Projekt, EITF11. Oskar von Knorring Emin Karimov Henrik Akej Handledare: Bertil Lindvall

Gustaf Backman, Anton Nystedt, Nicholas Peebo Battleships. Lunds tekniska högskola. EITF11 Digitala projekt

TETRIS. LTH, Campus Helsingborg EITA15 Digitala System

Lunds Tekniska Högskola Elektro- och informationsteknik Digitala projekt (EITF11)

Effektpedal för elgitarr

PlantPuppy Räddaren för den som inte kan hålla växterna vid liv

Rafiki Wa Kupanda. EITF11, Digitala projekt VT18. Linnea Håkansson, Anton Gunneberg, Ruben Schultz

EITF11 - Digitala projekt. Hastighetsmätare. Hugo Backmyr Mattias Karlsson

Digitala Projekt (EITF11) Hemlarm

Pulsmätare med varningsindikatorer

Pulsmätare Digitala Projekt EITF11

Projektrapport Målgång

Temperaturmätare med lagringsfunktion DIGITALA PROJEKT EITF11 GRUPP 14, ERIK ENFORS, LUDWIG ROSENDAL, CARL MIKAEL WIDMAN

Projektrapport - Roterande digital LED-klocka

Väderstation. Digitala Projekt EITF11 Institutionen för Elektro- och Informationsteknik Lunds Tekniska Högskola

The Intelligent Timer

Projektrapport - Feststation

Digitala System Projekt - EITA15 VT *SUPER DUPER KLOCKAN*

Innehållsförteckning. Figur- och tabellförteckning. Figure 1 Blockschema över hårdvaran...4 Figure 2 Blockschema över programet...

The Phenomenal Doorbell Bilaga 2. Källkod

#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> unsigned char num;

Pulsmätare. EITF11 Digitala Projekt VT15. Grupp 9: Emma Albertz, Mathilde Hagander & Alexandra Mansner Handledare: Andreas Johansson & Bertil Lindvall

Helena Harrysson och Linnéa Wickberg

Projekt EITA15. Väckarklocka. LTH Ingenjörshögskolan vid Campus Helsingborg Datateknik

Digitala Projekt: Digitala Projekt, EITF11 - VT17 Oscar Ahlgren, Patrik Lorentsson och Sten Hellberg Handledare: Bertil Lindvall

DIGITALA PROJEKT (EITF40) Fartmätare

Digitala Projekt EITF11 Grupp 9 Projektarbete Hanna Bondesson Marcus Skog. Reaktionsspel EITF11

The Secure Light. Digitala Projekt EITF11. Hanna Tinglöf, I-12 Anna Horvath, I-12 Filippa Österlin, I-12. Handledare: Bertil Lindvall

Thunder s Truck projektrapport

Digitala Projekt(EITF40) - Larm

Digitala projekt Linjeföljande bil

Digitala Projekt (EITF11) Larmanläggning

EITF40 - RFID-terminal. Joakim Marculescu (dt08jm6), Eric Johansson (dt08ej6)

LARMANLÄGGNING. Digitala Projekt, EITF11. Oskar von Knorring Emin Karimov Henrik Akej Handledare: Bertil Lindvall

Digitala projekt VT Myran

Digitala Projekt (EITF11)

LTH Ingenjörhögskolan vid Campus Helsingborg. Mastermindspel

Digitala projekt rapport

/* * dancing3.c * * Created: :53:20 * Author: digpi10 */ #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.

Källkod. #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #define green_diode PD5. #define RS PD4

ETSA01 Digitala Projekt (I) VT- 13. Projektarbete AC Handledare Bertil Lindvall

Projekt Digitala system. Rörelsekänsligt Larmsystem

Projektrapport i Digitala System

WALL E. WALL EVADER EDI021 DIGITALA PROJEKT

Digitala Projekt VT13. PING-Pong

1 Bakgrund 4. 2 Kravspecifikation Definitioner Grundläggande krav Användarfall 5

PROJEKTTYP: Rapportsammanfattning STUDENTER: Larsson, J. ( ) och Oredsson, J. ( ) DATUM: 26 april, 2015

TEMPERATUR OCH VINDMÄTARE MED HÖGTALARFUNKTION

Kla ggvisarskylt. -med en underton av rassel. av Jonathan So nnerup & Gabriel Jo nsson

Department of Information Technology Digitala projekt. SuperKull. Daniel Öhman Alexander Persson

Liftmaestro. Lunds Tekniska Högskola Elektro- och informationsteknik. Olle Gemfors, I13 Dayanand Sagar, I13 Mattias Wendler, I13

JOFEN-Prototypes. Målsökande pansarvagn. Projektarbete i Kursen EITA15. Jonatan Claesson, Olle Jonasson, Felix Rödén, Edvin Rossi & Nils Olén

DIGITALA PROJEKT Väderstation

DANCING ROBOT. EITF11, Grupp 10. Kajsa Salomonsson, Hugo Hedin och Petter Mårtensson

SIMON SAYS Projekt i EITF11 Digitala Projekt

Lunds Tekniska Högskola. I-10 Grupp 11: David Sundström Max Schulz Albert Lundberg Handledare: Bertil Lindvall

Datorteknik 1 (AVR 1)

Vi har i kursen Digitala Projekt EITF11 byggt en spelkonsol på vilken man kan spela Snake. Mjukvaran programmerades i C på en AVR Mega32 processor.

Musen. Författare: Joel Guedj e02jg Erik Dahlbäck e02ed. Handledare: Bertil Lindvall. Digitala Projekt SK 2005

Pong Mayhem. Innehållsförteckning Inledning Kravspecifikation Komponenter/Hårdvara Arbetsprocess Reflektion...

Projektrapport - RoboWalter

Voltmeter EITF11 LUNDS TEKNISKA HÖGSKOLA Grupp 3 Timmy Andersson Jesper Tempel Christoffer Lundgren

LOOKY LUKE. Caroline Hellström och Ville Orlander Arvola Industriell ekonomi I10. - Att välja en lyckosam väg EITF11 Digitala projekt

THE VISUAL EGGTIMER. Skola: Lunds Tekniska Högskola Institution: Elektro- och informationsteknik Kurs: Digitala projekt (EITF11)

Whac A mole. Ett rektionstest i kursen Digitala Projekt EITF11 utfört av: Axel Spångberg I10 Marcus Witting I10. Handlett av: Bertil Lindvall

EITF11 - Digitala Projekt

RAPPORT: DIGITALA PROJEKT

LTH. EITF11- Digitalaprojekt. Projektrapport WEB

DIGITALA PROJEKT - EITF11

Väderstation. EITF11, Digitala projekt RAPPORT. Isabella Bergvik, Emma Sandén & Hanna Åberg

Rörelse- och temperaturkänsligt larmsystem

Digitala projekt, EDI021 Rapport Handledare: Bertil Lindvall

Digitala projekt - Radiostyrd bil

EITF11: Bandkanon Grp 05

Rapport i Digitala Projekt (EDI021)

Från idé till skapelse av en äkta RoomBot

Projektrapport Digitala System

Innehåll. 1 Inledning 3

Väderstation. Datum: Projektarbete vid elektro och informationstekniks institution

Digitala Projekt Konstruktion av Tamagocchi. Av: Oskar Andersson D05 & Danial Rehman D05

Snake! !!!!!!!!!!!!!!!!!!!!

Goda råd till de som ska utföra ett liknande projekt (från KMM 2016)

Robotfotboll med Arduino

Laboration 4: Knappstuds Drivrutiner för att eliminera störningar.

LUNDS TEKNISKA HÖGSKOLA. Väderstation. Digitala Projekt, EITF11. Martin Olofsson, I08 & Fredrik Oher, I08 Vt 2012

Aml Abbas, Ali Darwish, Ehsanolah Hafezi, Fatima Zahra Doussi Grupp 15

EIT. Digitala projekt EITF11. Larmanläggning. Handledare Bertil Lindvall Anna Lindberg I-11 Caroline Vitasp I-11 Eric Eliason I-10

Transkript:

Fyra i rad Sammanfattning Detta dokument behandlar ett projekt genomfört i kursen Digitala Projekt vid Lunds Tekniska högskola. Syftet med det projekt som avhandlas i denna rapport var att sammanställa en grundläggande digital prototyp och göra denna funktionsduglig genom att programmera tillhörande processor. Målet med detta projekt var att skapa ett fyra i rad spel. I nedanstående rapport återfinns beskrivning av arbetsprocessen samt en diskussion av tillämpad metodik och erhållna resultat.

Innehåll Inledning... 3 Problemformulering... 3 Kravspecifikation... 3 Hårdvara... 4 Mjukvara... 4 Utförande... 5 Planering... 5 Konstruktion... 5 Programmering... 6 Resultat och diskussion... 6 Appendix 1: Kopplingsschema... 7 Appendix 2: Källkod... 8

Det projekt som behandlas i denna rapport utgjorde huvudsaklig arbetsuppgift i kursen Digitala projekt EITF11. Kursen i fråga är uppdelad i två separata verksamhetsperioder fördelat på två läsperioder. Kursen inleddes med teoretisk undervisning representerad av laborationer och föreläsningar under läsperiod ett, varpå studenterna delades in projektgrupper med uppgiften att på egen hand, understödda av handledare, tillämpa förvärvade kunskaper på ett praktiskt problem i form av en digital prototyp av godtycklig art. Den primära intention grupp 12 hade under utvecklingen av projektets grundläggande koncept var att skapa ett interaktivt spel vilket innefattade programmering av en LCD skärm. Flertalet potentiellt gångbara koncept övervägdes innan beslutet om att programmera ett fyra i rad spel togs. I syfte att göra spelet interaktivt togs beslutet att spelarna skulle styra respektive markör med en joystick istället för med ett flertal enklare knappar. Därutöver var prototypen i behov av en resetknapp för att uppnå önskad funktionalitet. För att kunna genomföra projektet enligt det koncept som utarbetats initialt behövdes därtill ett antal komponenter fundamentala för konstruktion av en fungerande prototyp. En processor och en LCD-skärm var nödvändiga för att hantera hårdvaran samt för att kunna visualisera spelplanen. AD-omvandlare vilken möjliggör hantering av analog information från spelets joysticks via processorn En röd LED-lampa för visa när en spelar vunnit Kod för att skapa spelet De krav som ställts på konstruktionen, utifrån den initiala projektidén, är följande: Funktionella krav Systemet ska ha en display Displayen ska visa en spelplan och en poängräknare för var spelare o Spelplanen ska vara ett 4x4 rutnät o På displayen ska varje spelare styra en unik symbol Systemet ska ha två uppsättningar knappar, en vid var kortsida på displayen o Var spelare ska kunna flytta markören upp, ner, höger och vänster samt kunna fästa markören på önskad ruta Systemet ska ha en resetknapp o Vid knapptryck så ska spelet starta om från spelomgång ett Spelet ska köras tre omgångar innan det avslutas

Kvalitetskrav Fördröjningen mellan knapptryck och händelse på display ska vara så liten som möjligt Spelet ska lyda följande regler: o En spelomgång avbryts då en spelare har fyra symboler i rad horisontellt, vertikalt eller diagonalt. Poäng registreras och ny spelomgång startas o Spelet bryts efter tre spelomgångar o Ena lysdiod lyser när spelomgång tre avslutas o En redan ifylld ruta får inte skrivas över med en ny symbol o Markören får förflyttas över en ifylld ruta o Om hela brickan fylls utan att en spelare vunnit så bryts spelomgången och ingen får poäng För att konstruera prototypen användes fölande hårdvarukomponenter: En AVR AT mega32 microprocessor användes för att lagra information och styra övriga komponenter LCD-skärmen GDM12864HLCM 128x64 pixlar, användes för att visualisera spelplanen och spelets övriga delkomponenter; markören, symboler, poängställning. En variabel varistor användes för att kontrollera den riktning i vilken LCD-skärmen uppvisar bäst ljusstyrka Resistorer kopplade till bland annat knapparna Ett mönsterkort på vilket alla hårdvarukomponenter monterades En strömkälla på 5 V och 5 A Vid programmeringen av spelet användes programspråket C. Den kod som skrevs hanterades i programvaran Atmel studio 6.1. Felsökning av såväl hårdvara som mjukvara samt exekvering av koden via processorn genomfördes med hjälp av JTAG. Programmets basala struktur utgörs av en mainmetod vilken innefattar de metoder och den övriga kod som behövs för att köra en spelomgång. Därutöver innefattar källkoden specifika metoder för bland annat; rita ut symboler, spelplan och poängställning, undersöka om någon av spelarna vunnit innevarande omgång och eller hela spelet. Därtill innehåller koden attribut vilka utgörs av exempelvis vektorer och matriser som används för att lagra information under spelets gång.

Arbetsprocessen kan delas in i ett antal olika delmoment vilka presenteras och beskrivs nedan. Planering I projektets första skede övervägdes flertalet idéer avseende det koncept enligt vilket spelet skulle utformas. Efter närmare diskussion föll dock valet på att utveckla ett fyra i rad spel. Då projektets typ och primära syfte fastslagits fortskred arbetet med utformning av en kravspecifikation utformad utifrån gruppens initiala idé. I samband med kravspecifikationen utformades en problemformulering i syfte att skapa ytterligare perspektiv på arbetets omfattning samt för att kartlägga den hårdvara som behövdes samt de funktioner som var nödvändiga för att spelet skulle fungera som önskat. I planeringens slutskede utformades ett kopplingsschema vilket kom att utgöra referensmall för de kopplingar av hårdvaran som utfördes senare i projektet. Kopplingsschema och kravspecifikation presenterades för och godkändes efter några mindre ändringar av handledare varpå det handfasta arbetet inleddes. Konstruktion Med färdigställt kopplingsschema som referens påbörjades konstruktionen av spelet. Den hårdvara som prototypen skulle komma att bestå av fästes vid mönsterkortet. Komponenter som processor, LED-skärm och joysticks löddes fast vid mönsterplattan med hjälp av lödpenna och lödtenn. Övriga komponenter behövde ingen annan fästanordning än de sladdar via vilka de kopplades till kretsens övriga komponenter. Alla i prototypen ingående komponenter kopplades därefter samman enligt det kopplingsschema som utformats under planeringsfasen. Hårdvaran och komponenternas förbindelser med processorn testades sedan med JTAG. JTAG möjliggör manuell inställning av processorns olika pins och portar vilket underlättar felsökning av genomförda kopplingar. Vid felsökningen upptäcktes ett begränsat antal fel vilka åtgärdades genom att lödningar gjordes om för att förbättra förbindelser mellan några av kretsens komponenter samt genom att ett fåtal sladdar virades om.

Programmering Programmeringsarbetet inleddes med att testkod skrevs för varje hårdvarukomponent för att verifiera att dessa fungerade som de skulle. Parallellt med att testmetoder togs fram och användes programmerades övriga nödvändiga metoder som exempelvis metod för att rita ut en individuell pixel på skärmen, metod för att rensa skärmen etcetera. Datablad till LCD-skärm och microprocessor var oumbärliga vid programmering av de metoder som användes för att ge grundläggande instruktioner till skärm och övriga komponenter. Då grundläggande metoder skrivits utökades koden med metoder för att hantera utritning av spelplanen, markören, symboler, poängställning samt med metoder vilka hanterade kommunikationen mellan skärmen och vardera joystick. Under programmeringsarbetets gång infördes begränsningar anpassade efter önskad funktion av prototypen samt regelverket för fyra i rad. Efter en intressant och mycket lärorik arbetsprocess renderade projektet slutligen ett välfungerande, interaktivt och lättanvänt fyra i rad- spel vilket fungerar i enlighet med den kravspecifikation som utformades i planeringsstadiet. Projektet integrerade programmering och elektroteknik och gav därför en för industriella ekonomer en unik inblick i hur utvecklingen av en digital prototyp från hårdvara till mjukvaruprogrammering och ett fungerande program går till. Till följd av relativt noggrann planering av arbetet vid projektets början fortskred arbetet utan större avbräck. Ett antal smärre modifieringar genomfördes efter felsökning. Vid programmering av mjukvaran upptäcktes dessutom ett minnesproblem vilket åtgärdades genom att en AT mega16 microprocessor byttes mot en AT mega32 vilken har något större minnesutrymme. Då fokus låg på att uppnå en välfungerande prototyp lades mindre vikt vid att optimera koden varför några mindre fel kvarstår i mjukvaran. Dessa utgörs av att ena skärmhalvan är förskjuten i förhållande till den andra samt att ett av spelplanens sträck ritas ut två gången. Trots felsökning har anledningen till dessa fel inte kunnat hittas. En optimering av koden skulle innebära att ovan nämnda fel åtgärdas. I det stora hela fungerar dock spelet väl och enligt kravspecifikationen.

/* * spelet.c * * Created: 2016-04-13 14:17:09 * Author: Elin Blomstergren and Victor Sundgren */ #include <avr/io.h> #include <util/delay.h> unsigned char screen[8][128]; int board[4][4]; /* 0 = player 0, 1 = player 1, 2 = empty spot */ int player; /* either player 0 or 1 */ int wins[2]; int markerloc[2]; void setdatadirection(); void ADC_init(); void displayon(); void play(); void clearscreen(); void drawboard(); void redraw(); void ledon(); void ledoff(); void readjoystickone(); void readjoysticktwo(); void readbutton();

int main() setdatadirection(); ADC_init(); displayon(); play(); return 0; void newgame() for(int a = 0; a < 4; a = a + 1) for(int b = 0; b < 4; b = b + 1) board[a][b] = 2; markerloc[0] = 0; markerloc[1] = 0; void play() wins[0] = 0; wins[1] = 0; player =!player; newgame(); clearscreen(); drawboard(); ledon();

while(1) if(player) readjoystickone(); else readjoysticktwo(); readbutton(); void putonboard() int x = markerloc[0]; int y = markerloc[1]; if(board[x][y] == 2) board[x][y] = player; player =!player; markerloc[0] = 0; markerloc[1] = 0; checkwin(); redraw(); void win(void) ledon(); _delay_ms(1000); ledoff(); play();

void checkwin(void) if(board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] == board[3][3] && board[0][0]!= 2) wins[board[0][0]] = wins[board[0][0]] + 1; newgame(); else if(board[0][3] == board[1][2] && board[0][3] == board[2][1] && board[0][3] == board[3][0] && board[0][3]!= 2) wins[board[0][3]] = wins[board[0][3]] + 1; newgame(); else for(int a = 0; a < 4; a = a + 1) if(board[a][0] == board[a][1] && board[a][0] == board[a][2] && board[a][0] == board[a][3] && board[a][0]!= 2) wins[board[a][0]] = wins[board[a][0]] + 1; newgame(); break; else if(board[0][a] == board[1][a] && board[0][a] == board[2][a] && board[0][a] == board[3][a] && board[0][a]!= 2) wins[board[0][a]] = wins[board[0][a]] + 1; newgame(); break; if(wins[0] == 3 wins[1] == 3) win();

void setdatadirection(void) DDRA = 0b00000001; DDRB = 0b11111111; DDRD = 0b11111111; void rwlow(void) PORTD &= ~_BV(PD3); void rwhigh(void) PORTD = _BV(PD3);// sets PD3 to 1 void rslow(void) PORTD &= ~_BV(PD4); void rshigh(void) PORTD = _BV(PD4); void elow(void) PORTD &= ~_BV(PD5);

void ehigh(void) PORTD = _BV(PD5); void selectc1(void) PORTD = _BV(PD0); PORTD &= ~_BV(PD1); void selectc2(void) PORTD = _BV(PD1); PORTD &= ~_BV(PD0); void setxadress(int x) ehigh(); rslow(); rwlow(); PORTB = 0b10111000 (x/8); elow(); ehigh(); void setyadress(int y)

ehigh(); rslow(); rwlow(); PORTB = 0b01000000 y; elow(); ehigh(); void displayon(void) ehigh(); PORTB = 0b00111111; rwlow(); rslow(); PORTD = _BV(PD2); selectc1(); elow(); ehigh(); selectc2(); elow(); ehigh(); void ledon(void) PORTA = _BV(PA0);// Sets PA0 to 1

void ledoff(void) PORTA &= ~_BV(PA0);// Sets PA0 to 0 void ADC_init(void) //Initiera ADC ADMUX = 0b01000000; ADCSRA=(1<<ADEN) (1<<ADPS2) (1<<ADPS1) (1<<ADPS0); int ADC_read(unsigned char channel) ADMUX = channel; ADCSRA =(1<<ADSC); while(!(adcsra & (1<<ADIF))); ADCSRA =(1<<ADIF); return (ADC); void readjoystickone() int x = ADC_read(0b01000101); int y = ADC_read(0b01000110); if(x > 800) if(markerloc[0] < 3) markerloc[0] = markerloc[0] + 1; _delay_ms(500); redraw();

if(x < 200) if(markerloc[0] > 0) markerloc[0] = markerloc[0] - 1; _delay_ms(500); redraw(); if(y > 800) if(markerloc[1] > 0) markerloc[1] = markerloc[1] - 1; _delay_ms(500); redraw(); if(y < 200) if(markerloc[1] < 3) markerloc[1] = markerloc[1] + 1; _delay_ms(500); redraw(); void readjoysticktwo() int x = ADC_read(0b01000010); int y = ADC_read(0b01000011); if(x < 200) if(markerloc[0] < 3) markerloc[0] = markerloc[0] + 1;

_delay_ms(500); redraw(); if(x > 800) if(markerloc[0] > 0) markerloc[0] = markerloc[0] - 1; _delay_ms(500); redraw(); if(y < 200) if(markerloc[1] > 0) markerloc[1] = markerloc[1] - 1; _delay_ms(500); redraw(); if(y > 800) if(markerloc[1] < 3) markerloc[1] = markerloc[1] + 1; _delay_ms(500); redraw(); void readbutton()

int buttonval= PINA & 0b10010010; if(buttonval== 0b00000010) ledon(); _delay_ms(1000); ledoff(); _delay_ms(1000); play(); else if(buttonval == 0b00010000) if(!player) putonboard(); else if(buttonval == 0b10000000) if(player) putonboard(); void redraw() clearscreen(); drawboard(); void draw(int x, int y) ehigh(); int newy; if(y < 63)

selectc1(); newy = y; else selectc2(); newy = y - 64; setxadress(x); setyadress(newy); rwlow(); rshigh(); screen[x/8][y] = screen[x/8][y] (1<<(x%8)); PORTB = screen[x/8][y]; elow(); ehigh(); void clearscreen(void) for(int a = 0; a < 64; a = a + 8) for(int b = 0; b < 64; b = b + 1) selectc1(); setxadress(a); setyadress(b); rwlow(); rshigh(); PORTB = 0b00000000; elow(); ehigh();

selectc2(); setxadress(a); setyadress(b); rwlow(); rshigh(); PORTB = 0b00000000; elow(); ehigh(); void drawscore(void) switch(wins[1]) case 0: for(int a = 12; a < 24; a = a + 1) draw(27, a); draw(28, a); draw(34, a); draw(35, a); for(int a = 28; a < 35; a = a + 1) draw(a, 11); draw(a, 12); draw(a, 23); draw(a, 24); draw(30, 16);

draw(30, 17); draw(31, 17); draw(31, 18); draw(32, 18); draw(32, 19); break; case 1: for(int a = 29; a < 35; a = a + 1) draw(a, 11); draw(a, 12); for(int a = 13; a < 25; a = a + 1) draw(31, a); draw(32, a); draw(29, 23); draw(30, 23); draw(30, 24); break; case 2: for(int a = 27; a < 36; a = a + 1) draw(a, 11); draw(a, 12); int y = 13; int x = 28; while(x < 35 && y < 20) draw(x, y); draw(x+1, y); draw(x+1, y+1);

draw(x, y+1); x = x+1; y = y+1; for(int a = 28; a < 35; a = a + 1) draw(a, 23); draw(a, 24); draw(27, 13); draw(27, 14); draw(34, 21); draw(34, 22); draw(35, 21); draw(35, 22); draw(35, 23); draw(27, 22); draw(27, 23); draw(28, 22); break; case 3: for(int a = 28; a < 35; a = a + 1) draw(a, 11); draw(a, 12); for(int a = 12; a < 18; a = a + 1) draw(34, a); draw(35, a); for(int a = 29; a < 34; a = a + 1) draw(a, 17);

draw(a, 18); int c = 30; int d = 19; while(c < 34 && d < 23) draw(c,d); draw(c+1, d); draw(c+2,d); c = c + 1; d = d + 1; for(int a = 27; a < 36; a = a + 1) draw(a, 23); draw(a, 24); draw(27, 12); draw(27, 13); draw(28, 13); break; switch(wins[0]) case 0: for(int a = 105; a < 117; a = a + 1) draw(28, a); draw(29, a); draw(35, a); draw(36, a); for(int a = 29; a < 36; a = a + 1) draw(a, 116);

draw(a, 117); draw(a, 104); draw(a, 105); draw(33, 111); draw(33, 112); draw(32, 110); draw(32, 111); draw(31, 109); draw(31, 110); break; case 1: for(int a = 29; a < 35 ; a = a + 1) draw(a, 116); draw(a, 117); for(int a = 104; a < 116; a = a + 1) draw(31, a); draw(32, a); draw(34, 105); draw(33, 105); draw(33, 104); break; case 2: for(int a = 28; a < 37; a = a + 1) draw(a, 116); draw(a, 117); int c = 29;

int d = 108; while(c < 36 && d < 116) draw(c, d); draw(c-1, d); draw(c-1, d+1); draw(c, d+1); c = c + 1; d = d + 1; for(int a = 29; a < 36; a = a + 1) draw(a, 104); draw(a, 105); draw(36, 115); draw(36, 114); draw(29, 105); draw(29, 106); draw(29, 107); draw(28, 106); draw(28, 107); draw(36, 105); draw(36, 106); draw(35, 106); break; case 3: for(int a = 28 ; a < 36; a = a + 1) draw(a, 116); draw(a, 117); for(int a = 111; a < 117; a = a + 1)

draw(27, a); draw(28, a); for(int a = 29; a < 34; a = a + 1) draw(a, 110); draw(a, 111); int x = 30; int y = 106; while(x < 34 && y < 110) draw(x, y); draw(x-1, y); draw(x-2, y); x = x + 1; y = y + 1; for(int a = 27; a < 36; a = a + 1) draw(a, 104); draw(a, 105); draw(36, 115); draw(36, 116); draw(35, 115); draw(35, 114); draw(36, 114); break; void drawcircle(int x, int y)

for(int a = x + 3; a < x + 9; a = a + 1) draw(a, y+2); draw(a, y+9); for(int a = y + 3; a < y + 9; a = a + 1) draw(x+2, a); draw(x+9, a); void drawmarker(int x, int y) for(int a = x + 3; a < x + 9; a = a + 1) draw(a, y+4); draw(a, y+5); draw(a, y+6); draw(a, y+7); for(int a = y + 3; a < y + 9; a = a + 1) draw(x+4, a); draw(x+5, a); draw(x+6, a); draw(x+7, a); void drawcross(int x, int y) for(int a = x + 3; a < x + 9; a = a + 1)

draw(a, y+5); draw(a, y+6); for(int a = y + 3; a < y + 9; a = a + 1) draw(x+5, a); draw(x+6, a); /* draws the board according to matrix board */ void drawboard(void) /* draw the lines of the board */ for(int a = 4; a < 57; a = a + 13) for(int b = 36; b < 90; b = b + 1) draw(a, b); for(int a = 4; a < 57; a = a + 1) for(int b = 36; b < 89; b = b + 13) draw(a, b); for(int a = 0; a < 8; a = a + 1) for(int b = 0; b < 128; b = b + 1) screen[a][b] = 0; /* fill the board according to the matrix board */ for(int x = 0; x < 4; x = x + 1)

for(int y = 0; y < 4; y = y + 1) if(board[x][y] == 0) drawcircle(5+13*x, 37+13*y); if(board[x][y] == 1) drawcross(5+13*x, 37+13*y); if(markerloc[0] == x && markerloc[1] == y) drawmarker(5+13*x, 37+13*y); for(int a = 0; a < 8; a = a + 1) for(int b = 0; b < 128; b = b + 1) screen[a][b] = 0; /* draw current score */ drawscore();