Untitled

 avatar
unknown
plain_text
9 months ago
9.5 kB
9
Indexable
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
#define STARTX 14 /* X koordinata gornjeg levog ugla table igrice. */
#define STARTY 4 /* Y koordinata gornjeg levog ugla table igrice. */
#define ENDX 66 /* X koordinata donjeg desnog ugla table igrice. */
#define ENDY 23 /* Y koordinata donjeg desnog ugla table igrice. */
#define BOJA_POZADINE 15 /* Boja pozadine oko table igrice. */
#define BOJA_TABLE 3 /* Boja table igrice. */
#define BOJA_TEKSTA 15 /* Boja teksta koja se ispisuje u zaglavlju tableigrice. */
#define BOJA_OPCIJE 4 /* Boja pozadine zaglavlja table igrice. */
#define BOJA_ZMIJICE 15 /* Boja zmijice u toku igre. */
#define BOJA_HRANE 0 /* Boja hrane zmijice. */
#define MAX_DUZINA (ENDX-STARTX+1)*(ENDY-STARTY+1)
#define MAX_OBLIKA 6 /* Maksimalni broj oblika od kojih se zmijica sastoji. */
#define POC_DUZINA 4 /* Pocetna duzina zmijice. */
#define BOJA_ZA_KRAJ 4 /* Boja zmijice kada je zaginula. */
#define KOCKICA 4 /* ASCII broj karaktera kockica. */
#define SRCE 3 /* ASCII broj karaktera srce. */
#define DETELINA 5 /* ASCII broj karaktera detelina. */
#define BRZINA 75 /* Brzina kretanja zvezdice. */
#define ESC 27
#define STREL_LEVO 75
#define STREL_DESNO 77
#define STREL_DOLE 80
#define STREL_GORE 72
int main()
{
unsigned x , y, poena=0, duzina=0, i, xp, yp, xd, yd, pom, xh, yh, hoblik;
unsigned pomx, pomy, pomo;
int pp, pot, prepot=STREL_GORE,raz=0;

/* Zmijica je opisana sa tri niza. Nizovi xpoz i ypoz odreduju pozicije clanova zmijice na tabli igrice, pri
cemu se glava zmijice opisuje sa prvim clanovima nizova (indeks je 0). Niz aktoblik opisuje sa
rednim brojevima iz ASCII tabele koji oblici cine zmijicu. Glava zmijice je opisana oblikom smail i drugi
delovi zmijice ne mogu posedovati oblik glave. */
unsigned xpoz[MAX_DUZINA], ypoz[MAX_DUZINA], aktoblik[MAX_DUZINA];
/* Inicijalizacija nizova. */
for (i=0; i<MAX_DUZINA; i++) xpoz[i] = ypoz[i] = 0;
/* Pozicija glave mora po x koordinati biti na sredini ekrana na parnoj poziciji. Zmijica se po x koordinati
prilikom kretanja pomera za dva polja. Ako bi se u startu glava zmijice nasla na parnoj poziciji, a
hrana na neparnoj, zmijica nikada ne bi mogla pojesti hranu. */
if ((ENDX + STARTX) / 2 % 2 == 0) xpoz[0] = (ENDX+STARTX) / 2;
else xpoz[0] = (STARTX+ENDX) / 2 + 1;
if ((ENDY + STARTY) / 2 % 2 == 0) ypoz[0] = (ENDY+STARTY) / 2;
else ypoz[0] = (STARTY+ENDY)/ 2 + 1;
aktoblik[0] = 2; /* Aktivni oblik glave zmijice je karakter smail. */
randomize ();
/* Formiramo zmijicu od POC_DUZINA clanova u vertikalnom polozaju, pri cemu nijedan drugi clan ne moze
posedovati oblik glave. */
for (i=1; i<POC_DUZINA; i++) {
xpoz[i] = xpoz[0];
ypoz[i] = ypoz[0] + i;
do {
pom = random (MAX_OBLIKA);
} while (pom<3);
aktoblik[i] = pom;
}
duzina = POC_DUZINA;
/*************************IZGLED IGRICE *******************************/
textmode (3);
_setcursortype (_NOCURSOR); /* Isljucujemo kursor jer se tokom trajanja igrice sve sto se bude
unosilo nece prikazivati na ekranu, te nam polozaj kursora
nije potreban. */
textcolor (BOJA_TEKSTA);
textbackground (BOJA_POZADINE);
clrscr ();
/* Isrtavamo tablu igrice. */
textbackground (BOJA_TABLE);
for (y=STARTY ;y<ENDY; y++)
for(x=STARTX; x<ENDX; x++) {
gotoxy (x, y);
cprintf (" ");
}

/* Formiramo zaglavlje igrice i u promenljivama xp,yp mamtimo poziciju gde se se prikazivati broj osvojenih
poena, a na pozicijama xd i yd trenutnu duzinu igrice. */
textbackground (BOJA_OPCIJE);
gotoxy (STARTX, STARTY);
for (i=0; i<ENDX-STARTX; i++) cprintf (" ");
gotoxy (STARTX+2, STARTY);
cprintf ("POENA: 0");
xp = wherex () - 1, yp = STARTY;
gotoxy (ENDX-14, STARTY);
cprintf ("DUZINA: %d", POC_DUZINA);
xd = wherex () - 1;
yd = STARTY;
for (i=0; i<ENDY-STARTY; i++) {
gotoxy (STARTX, i+STARTY);
cputs (" ");
gotoxy (ENDX-1, i+STARTY);
cputs (" ");
}
gotoxy (STARTX, ENDY-1);
for(i=0; i<ENDX-STARTX; i++) cputs (" ");
/*************************** KRAJ ***************************************/
/* Unosi se hrana na proizvoljnu poziciju i moze biti ispod zmijice.
Bitno je obezbediti da se hrana nalazi na parnoj poziciji x koordinate kao i glava zmijice. */
do {
xh = random (ENDX);
yh = random (ENDY);
hoblik = random (5);
} while(hoblik<3 || hoblik>5 || xh>ENDX-2 || yh>ENDY-2 ||
xh<STARTX+1 || yh<STARTY+1 || xh%2!=0 || yh%2!=0);
/* Prikazuje se hrana na ekranu. */
gotoxy (xh, yh);;
textbackground (BOJA_TABLE);
textcolor (BOJA_HRANE);
cprintf ("%c", hoblik);
/* Prikazuje se zmijica na ekranu, te ako je polozaj hrane na mestu gde je i zmijica hrana se nece videti, jer se nalazi
ispod zmijice, a na ekranu se ne vidi jer se zmijica prikazuje posle prikaza hrane. */
textcolor (BOJA_ZMIJICE);
for (i=0; i<duzina; i++) {
gotoxy (xpoz[i], ypoz[i]);
cprintf ("%c", aktoblik[i]);
}

/* Glavni ciklus gde se igrica izvrsava. */
do {
do {
/* Unosi se potez. */
raz = 0;
do {
pp = getch ();
}while(pp == 0);
pot = pp; /* Pamti se odigrani potez u promenljivu pot. */
/* Potez je ispravan ako se pritisne neka od strelica ili taster ESC. Zmijica ne moze da se krece unatrag, te
ako se pokusa uneti takav potez raz ostaje 0 i mora se ponoviti potez. */
if ((prepot == STREL_LEVO && pot == STREL_DESNO) ||
(prepot == STREL_DESNO && pot == STREL_LEVO) ||
(prepot == STREL_GORE && pot == STREL_DOLE) ||
(prepot == STREL_DOLE && pot == STREL_GORE)) raz=1;
} while ((pot != STREL_LEVO && pot != STREL_DESNO && pot !=STREL_DOLE &&
pot != STREL_GORE && pot !=ESC) || (raz == 1));
prepot = pot; /* Promenljiva prepot pamti prethodno uneseni potez radi kontrole
ispravnosti unosa. */
if (pot == ESC) return 0; /* Ako je potez ESC igrica se zavrsava. */
do {
pomx = xpoz[0]; /* Promenljiva pomx pamti x polozaj koordinate glave. */
pomy = ypoz[0]; /* Promenljiva pomy pamti y polozaj koordinate glave. */
pomo = aktoblik[0]; /* Promenljiva pomo pamti obilk glave. */
/* Pozicioniramo se na rep zmijice (njen poslednji oblik) i utvrdjujemo da li se tamo
slucajno nalazi hrana, te ako se nalazi, hrana se prikazuje, a u suprotnom brise se
polozaj poslednjeg clana zmijice sa ekrana. */
gotoxy (xpoz[duzina-1], ypoz[duzina-1]);
if (xpoz[duzina-1] == xh && ypoz[duzina-1] == yh) {
textcolor (BOJA_HRANE);
cprintf ("%c", hoblik);
textcolor (BOJA_ZMIJICE);
}else cprintf (" ");
/* Transformise se niz jer ce se zmijica pomeriti. Kako god da se pomera, drugi clan
zmijice dolazi gde je bila glava, treci clan gde je bio drugi clan, itd. Potrebno je izvrsiti
pomeranje niza za jedno mesto udesno. */

for (i=0; i<duzina-1; i++) {
xpoz[duzina - i - 1] = xpoz[duzina - i - 2];
ypoz[duzina - i - 1] = ypoz[duzina - i - 2];
}

/* Kako se zmijica moze kretati kroz zidove utvrdjuje se novi polozaj glave. */
switch (pot) {
case STREL_LEVO: if (pomx - 2 < STARTX + 1) xpoz[0] = ENDX - 2;
else xpoz[0] = pomx - 2;

break;

case STREL_DESNO: if (pomx + 2 > ENDX - 1) xpoz[0] = STARTX + 2;
else xpoz[0] = pomx + 2;

break;

case STREL_DOLE: if (pomy + 1 > ENDY - 2) ypoz[0] = STARTY + 1;
else ypoz[0] = pomy + 1;

break;

case STREL_GORE: if (pomy - 1 < STARTY + 1) ypoz[0] = ENDY - 2;
else ypoz[0] = pomy - 1;

}
/* Sada se novonastala zmijica prikazuje na ekrnu. */
aktoblik[0] = pomo;
for (i=0; i<duzina; i++) {
gotoxy (xpoz[i], ypoz[i]);
cprintf ("%c", aktoblik[i]);
}
/* Sada se utvrdjuje da li je zmijica zaginula, a to je u slucaju kada glava zmijice naidje na neki od
clanova zmijice. */
pomo = 1;
for (i=1; i<duzina; i++) {
if (xpoz[i] == xpoz[0] && ypoz[i] == ypoz[0]) pomo = 0;
}
/* Ako promenljiva pomo ima vrednost 0 zmijica je zaginula. */
if (pomo == 0) {
textcolor (BOJA_ZA_KRAJ);
for (i=0; i<duzina; i++) {
gotoxy (xpoz[i], ypoz[i]);
cprintf ("%c", aktoblik[i]);
}
return 0; /* Kraj igrice. */
}
/* Sada se proverava da li je zmijica pojela hranu.
Pojela je hranu ako je glava zmijice naisla na hranu. */

if (xpoz[0] == xh && ypoz[0] == yh) {
/* Zmijica se uvecava za jedan dodavanjem novog oblika,
a da nije glava, na poziciju gde se hrana nalazila. */

xpoz[duzina]=xh, ypoz[duzina]=yh;
do {
pom = random (MAX_OBLIKA);

} while (pom < 3);
aktoblik[duzina] = pom;
duzina++;
/* Utvrdjuje se od oblika hrane koliko je poena osvojeno. */
switch (hoblik) {
case KOCKICA: poena += 30;
break;
case SRCE: poena += 50;
break;
case DETELINA: poena += 10;
}
/* Sada se u zaglavlju upisuju novi podaci o zmijici (novi broj poena

i nova duzina zmijice). */
textbackground (BOJA_OPCIJE);
textcolor (BOJA_TEKSTA);
gotoxy (xp, yp);
cprintf ("%-4d", poena);
gotoxy (xd, yd);
cprintf ("%-2d", duzina);
textbackground (BOJA_TABLE);
textcolor (BOJA_ZMIJICE);
/* Prikazuje se na slucajni nacin izabrani novi oblik hrane. */
do {
xh = random (ENDX) + 1;
yh = random (ENDY) + 1;
hoblik = random (5);
} while (hoblik<3 || hoblik>5 || xh<STARTX+1 || yh<STARTY+1 ||

xh>ENDX-2 || yh>ENDY-2 || xh%2!=0 || yh%2!=0);

/* Utvrdjuje se da li je polozaj hrane ispod zmijice, te ako jeste nece se

prikazivati na ekranu, a u suprotnom hoce. */

pom = 0;
for (i=0; i<duzina; i++)
if (xpoz[i] == xh && ypoz[i] == yh) pom = 1;
if (pom == 0) {
gotoxy (xh, yh);
textbackground (BOJA_TABLE);
textcolor (BOJA_HRANE);
cprintf ("%c", hoblik);
textcolor (BOJA_ZMIJICE);
}

}
Sleep (BRZINA);
} while (!kbhit ());
} while (pot != ESC);

return 0;
}
Editor is loading...
Leave a Comment