|
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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
| |
![](/images/tree/0.gif) Ivan Johansen (19-09-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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
| |
![](/images/tree/0.gif) Thomas Lykkeberg (19-09-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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... ![Glad](images/smileys/nglad.gif) Jeg er iøvrigt kun til 100%
C kode.... så, her må du hjælpe ham ![Glad](images/smileys/nglad.gif) 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
| |
![](/images/tree/0.gif) ![](/images/tree/0.gif) Ivan Johansen (19-09-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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 ![Glad](images/smileys/nglad.gif) 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?
| |
|
|