Permalänk
Medlem

failboy no color miniprojekt lcd spel!

här är ett miniprojekt som jag har gjort, men även fått lite hjälp med programmeringen från en mkt mer erfaren programmerar i klassen efter som jag hade mkt problem när jag försökte få en bana som scrollar mot en över skärmen få kollisioner att fungera.
koden är skriven i c++/c arduino platform.

http://XbpTIcCvJrY&

koden!
/*
The circuit:
* LCD RS pin to digital pin 2
* LCD Enable pin to digital pin 3
* LCD D4 pin to digital pin 4
* LCD D5 pin to digital pin 5
* LCD D6 pin to digital pin 6
* LCD D7 pin to digital pin 7
* LCD R/W pin to ground
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
*/

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
//int potpin = 0;
int button = 8;

byte p100[8] = {
B01110,
B01110,
B00100,
B11111,
B00100,
B01010,
B11011,
};
byte p120[8] = {
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
};
byte block[8] = {
B11111,
B10001,
B10001,
B10001,
B10001,
B10001,
B11111,
};

#define BOARD_HEIGHT 2
byte board[][BOARD_HEIGHT] =
{ {5, 5},
{5, 5},
{5, 5},
{6, 5},
{5, 5},
{5, 6},
{5, 5},
{5, 5},
{5, 6},
{5, 5},
{5, 5},
{6, 5},
{5, 5},
{6, 5},
{5, 5},
{5, 6},
{5, 6},
{5, 5},
{5, 5},
{6, 5},
{5, 5},
{6, 5},
{5, 5},
{5, 5},
{5, 6},
{5, 5},
{6, 5},
{5, 5},
{5, 6},
{5, 5},
{6, 5},
{6, 5},
{5, 5},
{5, 5},
{5, 6},
{5, 5},
{5, 6},
{5, 5},
{6, 5},
{5, 5},
{6, 5},
{5, 5},
{5, 6},
{5, 5},
{6, 5},
{5, 5},
{5, 6},
{5, 5},
{6, 5},
{6, 5},
{6, 5},
{5, 5},
{5, 6},
{5, 6},
{5, 6},
{5, 5},
{5, 5},
{6, 5} };
#define BOARD_WIDTH (sizeof(board) / (sizeof(byte) * 2))

#define SCREEN_WIDTH 16
#define SCREEN_HEIGHT 2

byte getFromBoard(int xPos, int yPos)
{
if (xPos < BOARD_WIDTH && yPos < BOARD_HEIGHT)
{
return board[xPos][!yPos];
}
else
{
return 5;
}
}

void draw(int xPos, int yPos)
{
for (int x = 0; x < SCREEN_WIDTH; ++x)
{
for (int y = 0; y < SCREEN_HEIGHT; ++y)
{
lcd.setCursor(x, y);

byte obj = getFromBoard(x + xPos, y + yPos);

lcd.write(obj);
}
}
}

void drawGubben(int yPos)
{
lcd.setCursor(0, yPos);
lcd.write(4);
}

void clearScreen()
{
for (int x = 0; x < SCREEN_WIDTH; ++x)
{
for (int y = 0; y < SCREEN_HEIGHT; ++y)
{
lcd.setCursor(x, y);
lcd.write(5);
}
}
}

void printMessage(char* top, char* bottom)
{
lcd.setCursor(0, 0);
lcd.print(top);

lcd.setCursor(0, 1);
lcd.print(bottom);
}

void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
pinMode(button, INPUT);
Serial.begin(9600);
//Make progress characters

lcd.createChar(4, p100);
lcd.createChar(5, p120);
lcd.createChar(6, block);

printMessage("FAILBOY NO COLOR", "PRESS B TO MOVE");
delay(5000);
}

int gubbensXPos = 0;
void loop()
{
// int gubbensYPos = map(analogRead(potpin), 0, 1023, 0, 1);
int gubbensYPos = digitalRead(button);
delay(5);
Serial.println(gubbensYPos);
if (getFromBoard(gubbensXPos, gubbensYPos) != 5)
{
clearScreen();

printMessage("GAME OVER!", "YOU NOOB!");

delay(5000);
gubbensXPos = 0;
}
else if (gubbensXPos == BOARD_WIDTH)
{
clearScreen();

printMessage("YOU WIN!!!", "YOU R BEST!");

delay(5000);
gubbensXPos = 0;
}
else
{
draw(gubbensXPos++, 0);
drawGubben(gubbensYPos);
delay(500);
}
}

failboy no color miniprojekt lcd spel!

Permalänk
Medlem

Cool! gjord hemma eller i skolan typ?

Visa signatur

Citera för svar :)

Intel 3770k / Msi Mpower / 980 TI / 16gb 1600mhz Corsair Vengeance / H100i / Silverstone Strider 1000w Gold / Samsung 830 128gb / Fractal Design Arc

Permalänk
Medlem

Häftigt! Två frågor: är det svårt att programmera Arduino, och kan man programmera med c# (läser det i skolan). Var på vippen att köpa en själv så sent som idag, men det verkade på säljaren som att det var väldigt svårt att programmera arduino så jag lät bli...

Visa signatur

Har en förkärlek för alternativa standarder och trä; Trädator, Trätangentbord.

Permalänk
Medlem

tror de e mest noobfriendly som finns att programmera med rekommenderas! enklare att använda c. arduino är skit enkelt att använda och går å göra hur avancerade program som hälst med typ och ja du jkan göra presis samma sak med c! ;P

Permalänk
Medlem
Skrivet av flintec:

tror de e mest noobfriendly som finns att programmera med rekommenderas! enklare att använda c. arduino är skit enkelt att använda och går å göra hur avancerade program som hälst med typ och ja du jkan göra presis samma sak med c! ;P

Hur styr du? Har du ett tangentbort kopplat till den eller ngt? Eller? hmm. På bilderna verkade det mest som ett batteri, arduino, lcd skärm, inget mer. Vore kul att ha det minispelet över datorskärmen, få lite tråkigt, ta fram en liten usb numpad och köra det spelet

Visa signatur

Chassi:BeQuietDarkBase900Pro PSU:BeQuietDarkPowerPro1000w Moderkort:AsusZ170ProGamingAURA
CPU:i7-6700K 4.2Ghz Kylare:BeQuiet!SilentLoop240mm Ram:Corsair 32GB DDR4 3200MHz Vengeance
GPU:AsusRadeonRX5700XT8GBRogStrixGamingOC SSD:Corsair 2x120GB, M.2 1TB HDD:Seagate/WD->30TB Skärmar:3xBenQ 24" LCD G2450HM, LG 65"UHD65UM7100 OS:W10
Tillbehör:LogitechG915,G915TKL,ProX,G502,MxMaster3,G930,Z906,G510,K350,M705,G440,C922Pro,MionixNaos3200,5000,7200,8200,NaosQG
Mobiler:Xperia 1 III,Xperia1,SonyZ5 🎮 🖥️ ⌨️ 🖱️ 🎧

Permalänk

Trevligt projekt, men som perfektionist och programmeringsintresserad kan jag inte undgå att vilja kritisera koden. Till att börja med är den dåligt kommenterad. Visserligen är den relativt självförklarande för det mesta, men det är lika bra att vänja sig vid att kommentera kod, speciellt sådan man har för avsikt att andra ska läsa (vilket du har eftersom du publicerade den här).

"byte board[][BOARD_HEIGHT]"
Räknade jag inte fel har den "yttre" arrayen 58 element, vilket med en inre längd på 2 innebär att arrayen tar upp 106 byte. Vilket i mina öron låter som extremt mycket för det som lagras. Jag kan komma på lösningar där samma bana kan lagras i 14 eller 28 byte. Den sistnämnda lösningen är förmodligen den lättaste att implementera och man slipper alltför mycket lågnivåpill. Jag lämnar lösningarna som en övning dock. Säg till om du vill veta hur jag tänker så kan jag väl avslöja det, men tänk själv först. Och ja, sjävklart är det egentligen skitsamma, eftersom din processor såvitt jag förstår har ett minne på 32+2 kB. Menmen... Bör även påpekas att lösningarna kan komma att kräva någon eller några assembler-instruktioner mer vilket ju i så fall också tar upp lite minne, men förmodligen inte 92 eller 78 byte.

"return board[xPos][!yPos];"
Varför !yPos? Detta ger (förmodligen) bara ytterligare en assembler-instruktion och jag ser ingen anledning att göra så ur abstraktionssynvinkel.

"void drawGubben(int yPos)"
Skriv koden på engelska eller svenska, men bestäm dig för det ena... Gäller såklart även gubbensYPos och gubbensXPos.

"lcd.write(4);", "lcd.write(5);"
Dafaq!? Uppenbarligen vet du hur man använder #define, detta är ett typiskt asbra tillfälle att använda sig av det...

Hade jag gjort det här projektet hade jag dessutom förmodligen försökt hitta något bra sätt att generera en slumpmässig bana/höja hastigheten/oändlig bana/highscore, mest som programmeringsövning.

Skrivet av hag.com:

Häftigt! Två frågor: är det svårt att programmera Arduino, och kan man programmera med c# (läser det i skolan). Var på vippen att köpa en själv så sent som idag, men det verkade på säljaren som att det var väldigt svårt att programmera arduino så jag lät bli...

Nej, man kan inte programmera i C#. Eller ja, jag vet inte. Det kan ju vara någon galen person som kan ha fixat någon form av C#-kompilator för Arduino, men det har jag väldigt svårt att tro med tanke på hur pass mycket jobb som krävs. Även om det går så är det inget som man bör göra. C# är ett applikationsspråk, Arduino är en hårdvaruplattform. För sådana hårdvarunära projekt SKA man skriva i C eller Assembler. C++ kan också eventuellt var okej.

Jag skulle för övrigt vilja hävda att man rent tekniskt kan göra mer i C än i C#, men C är svårare.

Permalänk
Medlem
Skrivet av Extremaz:

Hur styr du? Har du ett tangentbort kopplat till den eller ngt? Eller? hmm. På bilderna verkade det mest som ett batteri, arduino, lcd skärm, inget mer. Vore kul att ha det minispelet över datorskärmen, få lite tråkigt, ta fram en liten usb numpad och köra det spelet

om du kollar på bilderna så finns de en tryck knapp! när jag håller in knappen så flyttar sig gubben ner till undre raden. är knappen oberörd så håller sig gubben på den övre raden altså skitsimpelt! efter som jag inte behövde tänka på knapp studs å sånt när jag bara håller in knappen! man kan ju bara vara på 2 ställen altså 1 lr 0

Permalänk
Medlem
Skrivet av Spetsen_nr11:

Trevligt projekt, men som perfektionist och programmeringsintresserad kan jag inte undgå att vilja kritisera koden. Till att börja med är den dåligt kommenterad. Visserligen är den relativt självförklarande för det mesta, men det är lika bra att vänja sig vid att kommentera kod, speciellt sådan man har för avsikt att andra ska läsa (vilket du har eftersom du publicerade den här).

"byte board[][BOARD_HEIGHT]"
Räknade jag inte fel har den "yttre" arrayen 58 element, vilket med en inre längd på 2 innebär att arrayen tar upp 106 byte. Vilket i mina öron låter som extremt mycket för det som lagras. Jag kan komma på lösningar där samma bana kan lagras i 14 eller 28 byte. Den sistnämnda lösningen är förmodligen den lättaste att implementera och man slipper alltför mycket lågnivåpill. Jag lämnar lösningarna som en övning dock. Säg till om du vill veta hur jag tänker så kan jag väl avslöja det, men tänk själv först. Och ja, sjävklart är det egentligen skitsamma, eftersom din processor såvitt jag förstår har ett minne på 32+2 kB. Menmen... Bör även påpekas att lösningarna kan komma att kräva någon eller några assembler-instruktioner mer vilket ju i så fall också tar upp lite minne, men förmodligen inte 92 eller 78 byte.

"return board[xPos][!yPos];"
Varför !yPos? Detta ger (förmodligen) bara ytterligare en assembler-instruktion och jag ser ingen anledning att göra så ur abstraktionssynvinkel.

"void drawGubben(int yPos)"
Skriv koden på engelska eller svenska, men bestäm dig för det ena... Gäller såklart även gubbensYPos och gubbensXPos.

"lcd.write(4);", "lcd.write(5);"
Dafaq!? Uppenbarligen vet du hur man använder #define, detta är ett typiskt asbra tillfälle att använda sig av det...

Hade jag gjort det här projektet hade jag dessutom förmodligen försökt hitta något bra sätt att generera en slumpmässig bana/höja hastigheten/oändlig bana/highscore, mest som programmeringsövning.

Nej, man kan inte programmera i C#. Eller ja, jag vet inte. Det kan ju vara någon galen person som kan ha fixat någon form av C#-kompilator för Arduino, men det har jag väldigt svårt att tro med tanke på hur pass mycket jobb som krävs. Även om det går så är det inget som man bör göra. C# är ett applikationsspråk, Arduino är en hårdvaruplattform. För sådana hårdvarunära projekt SKA man skriva i C eller Assembler. C++ kan också eventuellt var okej.

Jag skulle för övrigt vilja hävda att man rent tekniskt kan göra mer i C än i C#, men C är svårare.

wowowow! haha jag vet att koden ser slarvig ut hehe har inte ens tabbat in logiken! och nej jag har inte tänkt så mkt på att spara massa plats med define även fasst jag har de på flera ställen! just för de här lilla skitspelet spelar det nog ingen roll behöver nog inte använda mig av define över huve taget på nåt så lite fjant programm. lr de beror ju oxå på vilken micropros man har! men tack för svaret jag är noob som du kanske ser men vill lära mig mkt mer!!

Permalänk
Skrivet av flintec:

wowowow! haha jag vet att koden ser slarvig ut hehe har inte ens tabbat in logiken! och nej jag har inte tänkt så mkt på att spara massa plats med define även fasst jag har de på flera ställen! just för de här lilla skitspelet spelar det nog ingen roll behöver nog inte använda mig av define över huve taget på nåt så lite fjant programm. lr de beror ju oxå på vilken micropros man har! men tack för svaret jag är noob som du kanske ser men vill lära mig mkt mer!!

#define sparar inte plats, det ökar bara läsbarhet.Denna kodsnutt

#define BAR 4 foo(BAR);

Är från datorns synvinkel EXAKT samma kod (ner på maskinkodsnivå) som

foo(4);

Det är endast skillnad för den som läser källkoden (det vill säga andra människor och kompilatorn).

Däremot går det ju som sagt var att spara minne på andra sätt. Och visst, det är ju inte direkt något som behövs eftersom du har alldeles för mycket minne över (antar jag). Men just eftersom det är ett så pass "enkelt" spel kan man ju fundera på andra saker som gör det svårare (optimering till exempel). Skriver man inte bra kod i små program kommer man förmodligen inte göra det i stora program heller. Nu låter det förstås som att din kod är jättedålig, vilket den inte är, finns mycket som äör bra med den. Men det är ju roligare att klaga än att vara positiv.

Även om du inte orkar implementera det skulle jag rekommendera att du funderar på hur du skulle kunna spara banan på ett mer minneseffektivt sätt. Några idéer?

Permalänk
Medlem
Skrivet av Spetsen_nr11:

#define sparar inte plats, det ökar bara läsbarhet.Denna kodsnutt

#define BAR 4 foo(BAR);

Är från datorns synvinkel EXAKT samma kod (ner på maskinkodsnivå) som

foo(4);

Det är endast skillnad för den som läser källkoden (det vill säga andra människor och kompilatorn).

Däremot går det ju som sagt var att spara minne på andra sätt. Och visst, det är ju inte direkt något som behövs eftersom du har alldeles för mycket minne över (antar jag). Men just eftersom det är ett så pass "enkelt" spel kan man ju fundera på andra saker som gör det svårare (optimering till exempel). Skriver man inte bra kod i små program kommer man förmodligen inte göra det i stora program heller. Nu låter det förstås som att din kod är jättedålig, vilket den inte är, finns mycket som äör bra med den. Men det är ju roligare att klaga än att vara positiv.

Även om du inte orkar implementera det skulle jag rekommendera att du funderar på hur du skulle kunna spara banan på ett mer minneseffektivt sätt. Några idéer?

känns som jag är helt ute å cyclar nu men vafan var inte #define för att de inte skulle behöva ta någon plats i minnet?, det är iaf så jag har fått det förklarat för mig:) koden är vel bra om den fungerar:P? lr så var de ju inte om man tänker efter så kan man få saker å ting å gå snabbare å ta mindre plats! (optimering)
men så noobig som jag är så tkr jag de e viktigaste att man får det att fungera jag kommer endå inte hålla på med spelprogrammering i framtiden var bara lite nyfiken på hur man gör ett spel är mer hårdvaru kille! ge mig mer kritik måste lära mig!

Permalänk
Skrivet av flintec:

känns som jag är helt ute å cyclar nu men vafan var inte #define för att de inte skulle behöva ta någon plats i minnet?, det är iaf så jag har fått det förklarat för mig:) koden är vel bra om den fungerar:P? lr så var de ju inte om man tänker efter så kan man få saker å ting å gå snabbare å ta mindre plats! (optimering)
men så noobig som jag är så tkr jag de e viktigaste att man får det att fungera jag kommer endå inte hålla på med spelprogrammering i framtiden var bara lite nyfiken på hur man gör ett spel är mer hårdvaru kille! ge mig mer kritik måste lära mig!

Jag ska kanske inte uttala mig alltför mycket, eftersom jag inte är helt säker på saker och ting, men... Som jag förstått det kommer #define x y göra så att varje gång du skriver x kommer det ersättas med y. Detta innebär att man kan använda #define till bra mycket mer avancerade sakrr än konstantdefinitioner, men det mest användbara är förmodligen konstanter. Utifrån minnets synvinkel bör man titta på den kompilerade koden (som ju är Assemblekod) och det orkar man ofta inte. Men man kan ju gissa att Assemblerkoden använder en konstant istället för en referens till ett värde som är sparat i minnet någonstans. Skriver du en hårdkodad siffra bör samma resultat uppnås, men då blir det ofta mindre läsbart. Använder du en variabel som du aldrig ändrar på som konstant beror det på hur smart kompilatorn är. Kompilatorn skulle kunna märka att variabeln inte ändras och behandla den som konstant, alternativt vara dum nog att spara undan variabeln på.lämpligt ställe i minnet, vilket ger högre minnesanvändning och långsammare program (värdet måste hämtas från minnet, vilket tar tid). Så visst, #define kan spara minne, men jag skulle säga att den största rollen är att öka läsbarhet samt underlätta om man skulle vilja ändra till någon amnan siffta (fu behöver bara ändra på ett ställe).

Angående optimering av minnesanvändning tänker jag så här... Idag lagrar du banan i en (konstant) array med samma storlek som banan (b*h). Varje position på banan motsvaras alltså av ett ställe i minnet. Det är förmodligen det mest självklara sättet att lagra banan och därmed såklart inte heller det bästa (det enklaste är aldrig bäst). En alternativ lösning, som inte heller är särskilt avancerad, är att inse att du bara behöver hålla reda på vilka positioner det finns (alternativt inte finns) hinder på. Det jag menar är alltså en array med en massa positioner. Då dyker det dock upp ett annat problem: hur söker man efter ett specifikt tal i en array på.ett snabbt sätt? Du behöver nämligen kolla för varje position om den finns med i listan (har hinder) eller inte (inget hinder). Eftersom banan är konstant har man den lämpligtvis sorterad och kan därmed använda binärsökning (googla det om du inte vet hur det funkar). Det är dock också onödigt avancerat, eftersom du alltid vill undersöka positioner från låga till höga. Det går att lösa på flera sätt, men ett sätt är att ha en statisk (static) variabel som håller koll på vilken nästa position med hinder är. Storleken som krävs då blir (i princip) proportionell mot antalet hinder, istället för antalet positioner. Säg att banan består till hälften av hinder, det innebär att du halverat minnesanvändningen bara för banan. Här förutsätter jag att en position lagras som en byte, vilket innebär att denna lösning bara fungerar för banor med max 256 positioner (128 i bredd om din display används), vilket dock borde räcka. Det går förstås att lagra positioner som något större, menmen..

En alternativ lösning vore att köra med din lösning, men inse att det ju egentligen bara krävs en bit för att bestämma om det är ett hinder eller inte. Eftersom du idag använder en byte som är 8 bitar skulle en sådan lösning minska minnesanvändningen till en åttondel. Eftersom datorer är uppbyggda som de är (med byte som minsta beståndsdel) skulle dock det här behöva innebära en massa dryg bit masking och en hel del funderande över hur logiken ska fungera. En sådan lösning vore nog mest bara jobbig och är inte att rekommendera för någon om det inte är EXTREMT viktigt med minnesanvändningen. Den typen av lösningar är nämligen helt oläsbara.

Menmen, jag kanske framstår som lite väl hård mot dig. Jag är inget proffs själv, men efter 2,5 år på Civilingenjörsprogrammet i Datateknik (LiTH) kan jag ändå en del. Det där med static som jag tipsade om ovan är något jag lärt mig senaste halvåret, så det är inget jag förväntar mig att någon som kallar sig själv för noob ska kunna. I och för sig är static inte svåranvänt, men man behöver ju veta hur det funkar först liksom...

Jag funderar på att skriva lite kod från ovanstående idéer, bara för att konkretisera lite vad jag menar. Vet inte riktigt varför jag blivit så engagerad i det här projektet, men tyckte det var en kul grej.

Permalänk
Medlem

hehe ::P anledningen till att jag inte har svarat var för det var så mkt text så jag inte riktigt orkade läsa haha xD men jag håller på att programmera ett nytt spel efter som jag har tillräckligt med kunskap nu för att kunna göra det helt på egenhand och kommer lägga upp de på swec sen men ja 2,5 år på civil har du nog hållt på ganska mkt längre en jag

Permalänk
Skrivet av flintec:

hehe ::P anledningen till att jag inte har svarat var för det var så mkt text så jag inte riktigt orkade läsa haha xD men jag håller på att programmera ett nytt spel efter som jag har tillräckligt med kunskap nu för att kunna göra det helt på egenhand och kommer lägga upp de på swec sen men ja 2,5 år på civil har du nog hållt på ganska mkt längre en jag

Mysigt, du kan ju meddela mig när det nya spelet dyker upp på SweC, så kan jag kritisera dig igen.

Permalänk
Medlem
Skrivet av Spetsen_nr11:

Mysigt, du kan ju meddela mig när det nya spelet dyker upp på SweC, så kan jag kritisera dig igen.

det ligger upp nu om du kollar mina album