/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Hvordan få jeg "hale" på snake???
Fra : Thomas Christensen


Dato : 18-09-02 14:03

Jeg er lige startet med c++(har lidt erfaring med java, men lang tid siden),
og skal lave et ormespil i dos. Problemet er at slangen gerne skulle blive
længere(lad
os sige for hvert 20sec. der går). Har siddet og "leget" med et array, men
kan ikke få d til at virke...
Så jeg søger lidt hjælp med forklaring og gerne noget kode...

Her er hvad jeg har lavet indtil nu:

#include <stdio.h>
#include <conio.h>
#include <dos.h>

char retning ='h';
void ramme(int x, int y, int b, int h,int f);
void moveorm(char x,char y,char gx,char gy);
void overskrift();
void ost();
int xmax,xmin,ymax,ymin;
//char orm[2][200];

void main(void)
{
_setcursortype(_NOCURSOR);
clrscr();
overskrift();
ramme(3,4,75,20,5);
ost();
xmin=3;
xmax=3+75;
ymin=4;
ymax=4+20;
moveorm(40,12,40,12);
getch();
}

void overskrift()
{
gotoxy(30,2);
textcolor(12);
cprintf("Dr. P?l'kkers Ormespil");
gotoxy(30,3);
cprintf("ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ");
}
void ramme(int x, int y, int b, int h,int f)
{
gotoxy(x,y);
textcolor(f);
cprintf("É");
gotoxy(x+b,y);
cprintf("»");
gotoxy(x,y+h);
cprintf("È");
gotoxy(x+b,y+h);
cprintf("¼");

for (int i=x+1;i<=x+b-1;i++)
{
gotoxy(i,y);
cprintf("Í");
}

for (int j=x+1;j<=x+b-1;j++)
{
gotoxy(j,y+h);
cprintf("Í");
}

for (int q=y+1;q<=y+h-1;q++)
{
gotoxy(x,q);
cprintf("º");
}

for (int p=y+1;p<=y+h-1;p++)
{
gotoxy(x+b,p);
cprintf("º");
}
}
void ost()
{
gotoxy(30,12);
cprintf("þ");
}
void moveorm(char x, char y, char gx, char gy)
{
char Ch;
long point=0;
do
{
gotoxy(73,2);
textcolor(11);
cprintf("%ld",point++);
gotoxy(76,2);
cprintf("Point");

if(x == 30&&y == 12)point=point+50;

if(x == xmax||x == xmin||y == ymax||y == ymin)
{
ramme(3,4,75,20,5);
gotoxy(27,10);
textcolor(10);
cprintf("Du er f'rdig som popsanger!!!");
gotoxy(23,14);
delay(800);
cprintf("nsker du at forts'tte Ja(j) / Nej(n)");
Ch = getch();
if(Ch =='n')
{
Ch = 27;
break;
}
if(Ch =='j')
{
clrscr();
ramme(3,4,75,20,5);
overskrift();
ost();
moveorm(40,12,40,12);
}
}
if(kbhit())Ch = getch();
switch(Ch)
{
case 0:
{
if(kbhit())Ch = getch();
switch(Ch)
{
case 77:retning='h';break;
case 75:retning='v';break;
case 80:retning='n';break;
case 72:retning='o';break;
}
}
}

switch(retning)
{
case 'h':x++;break;
case 'v':x--;break;
case 'n':y++;break;
case 'o':y--;break;
}

gotoxy(gx,gy);
textcolor(11);
cprintf(" ");
gotoxy(x,y);
cprintf("Ü");
gx = x;
gy = y;
delay(200);

}
while(Ch != 27);
}






 
 
Thomas Lykkeberg (18-09-2002)
Kommentar
Fra : Thomas Lykkeberg


Dato : 18-09-02 14:57

On Wed, 18 Sep 2002 15:02:40 +0200, "Thomas Christensen"
<tennizz@tdcadsl.dk> wrote:

>Jeg er lige startet med c++(har lidt erfaring med java, men lang tid siden),
>og skal lave et ormespil i dos. Problemet er at slangen gerne skulle blive
>længere(lad
>os sige for hvert 20sec. der går). Har siddet og "leget" med et array, men
>kan ikke få d til at virke...
>Så jeg søger lidt hjælp med forklaring og gerne noget kode...
Du skal vel dybest set bare lave et array af "pixels" som skal
slettes. Det betyder at hver gang du løber igennem din do-while løkke
og hver gang din "orm" skal flyttes, skal du blot slette en given x,y
position som ormen har besat på et tidligere tidspunkt. Det kunne
gøres med en FIFO buffer (First In First Out).

Jeg tænker på noget i stil med:

// der gåes ud fra at din "orm" ikke bliver længere end 50
int xFifo[50];
int yFifo[50];
int newPos = 0;
int oldPos = 0;
// En god start længde på "ormen"
int length = 5;
int currentLength;

hver gang du så flytter din "orm", skal du lægge den nye position ind
i FIFO bufferen.

xFifo[newPos] = x;
yFifo[newPos] = y;
GotoXY(x,y);
//Tegn en "pixel"!!

// Inkrementer newPos og "wrap" rundt således tællereækkefølgen
// bliver: 0,1,.....48,49,0,1.. osv.
newPos = (newPos + 1) % 50;

// Du skal så kontrollerer om "ormens" længde er blevet sådan
// at du skal til at slette dens "bagende"
if(newPos > oldPos)
currentLength = newPos - oldPos;
else
currentLength = (50 - oldPos) + newPos;

if(currentLength == length)
{
GotoXY(xFifo[oldPos],yFifo[oldPos]);
// Slet !!
oldPos = (oldPos + 1) % 50;
}

Det var hvad jeg lige kunne "ryste" ud af ærmet, men ideen kan du vel
se?

/Thomas

Ivan Johansen (19-09-2002)
Kommentar
Fra : Ivan Johansen


Dato : 19-09-02 11:07

"Thomas Lykkeberg" <thomasDOTlykkeberg@privatDOTdk> wrote in message
news:uf0hou4nq3ndful2ifna953ppmgb71qnal@4ax.com...
> Du skal vel dybest set bare lave et array af "pixels" som skal
> slettes. Det betyder at hver gang du løber igennem din do-while løkke
> og hver gang din "orm" skal flyttes, skal du blot slette en given x,y
> position som ormen har besat på et tidligere tidspunkt. Det kunne
> gøres med en FIFO buffer (First In First Out).

Nu bruger man jo ikke et array, hvis man skal have en FIFO. Man bruger
normalt std::queue. Men da det nok bliver nødvendigt at tilgå andet end
første element, er en std::deque nok bedre.

> Jeg tænker på noget i stil med:
Jeg skriver det lige om til C++. Jeg kan simpelt hen ikke lade være.

> // der gåes ud fra at din "orm" ikke bliver længere end 50
Kan man gå ud fra det?

struct TPos
{
int x;
int y;
TPos(int X, int Y) : x(X), y(Y) {}
};

std::deque<TPos> Fifo;

> // En god start længde på "ormen"
int length = 5;

Hvis man vil se om ormen vil ramme sig selv, bruges:
if(std::find(Fifo.begin(), Fifo.end(), TPos(x, y)))
{
//Vi ramte os selv
}

> hver gang du så flytter din "orm", skal du lægge den nye position ind
> i FIFO bufferen.

Fifo.push_back(TPos(x, y));
GotoXY(x,y);
//Tegn en "pixel"!!

> // Du skal så kontrollerer om "ormens" længde er blevet sådan
> // at du skal til at slette dens "bagende"
while(Fifo.size() > length)
{
GotoXY(Fifo.front().x, Fifo.front().y);
// Slet !!
Fifo.pop_front();
}

Ivan Johansen



Ivan Johansen (19-09-2002)
Kommentar
Fra : Ivan Johansen


Dato : 19-09-02 11:25

"Ivan Johansen" <NG@Padowan.dk> wrote in message
news:3d89a1df$0$75696$edfadb0f@dspool01.news.tele.dk...
> Hvis man vil se om ormen vil ramme sig selv, bruges:
> if(std::find(Fifo.begin(), Fifo.end(), TPos(x, y)))
> {
> //Vi ramte os selv
> }

Her skulle selvfølgelig have stået:
if(std::find(Fifo.begin(), Fifo.end(), TPos(x, y)) != Fifo.end())
{
//Vi ramte os selv
}


Ivan Johansen




Thomas Lykkeberg (19-09-2002)
Kommentar
Fra : Thomas Lykkeberg


Dato : 19-09-02 18:39

On Thu, 19 Sep 2002 12:07:20 +0200, "Ivan Johansen" <NG@Padowan.dk>
wrote:

>Nu bruger man jo ikke et array, hvis man skal have en FIFO. Man bruger
>normalt std::queue. Men da det nok bliver nødvendigt at tilgå andet end
>første element, er en std::deque nok bedre.
Hvis man kigger på spørgers eksempel kode, ja så tror jeg ikke lige at
det ligger op til den slags lige nu... Jeg er iøvrigt kun til 100%
C kode.... så, her må du hjælpe ham Princippet FIFO ligger jo
ingen bånd på hvordan den skal implementeres. Hvordan ville du lave en
2 bytes "dyb" FIFO... Med std::queue ?? Overkill.?

>> // der gåes ud fra at din "orm" ikke bliver længere end 50
>Kan man gå ud fra det?
Sagtens.. et sted skal man jo stoppe. Jeg arbejder normalt med
embeddede systemer, hvor man ikke har det store fråds med hukommelsen
som man har på PC platforme.

/Thomas


Ivan Johansen (19-09-2002)
Kommentar
Fra : Ivan Johansen


Dato : 19-09-02 20:42

Thomas Lykkeberg wrote:
> Hvis man kigger på spørgers eksempel kode, ja så tror jeg ikke lige at
> det ligger op til den slags lige nu...

Nej, men han spurte efter C++, så derfor gav jeg et eksempel i "rigtig"
C++. Jeg har set mange der troede de programmerede C++, mens det i
virkeligheden var C.

> Jeg er iøvrigt kun til 100%
> C kode.... så, her må du hjælpe ham Princippet FIFO ligger jo
> ingen bånd på hvordan den skal implementeres.

Ja, princippet i en FIFO er den samme, men jeg synes at det er meget
mere kompliceret at bruge et array.

Hvordan ville du lave en
> 2 bytes "dyb" FIFO... Med std::queue ?? Overkill.?

Det har jeg aldrig haft brug for. Jeg har haft brug for en 3 bytes FIFO,
men der var jeg tvungent til at bruge C, da det var til et embedet system.


> Sagtens.. et sted skal man jo stoppe. Jeg arbejder normalt med
> embeddede systemer, hvor man ikke har det store fråds med hukommelsen
> som man har på PC platforme.

Du allokerer plads til 50 elementer, selv om du ikke ved om der skal
bruges mere eller mindre. Er det ikke spild?


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste