Poslao: 06 Feb 2016 18:00
|
offline
- Pridružio: 15 Maj 2009
- Poruke: 963
|
Napisano: 06 Feb 2016 2:15
Od skora sam počeo da učim C i pošto sam imao višak slobodnog vremena uradio sam jednu glupu-ne-bog-zna-šta igricu po uzoru na FarmVille i slične koja će mi poslužiti kao osnova ukoliko se budem odlučio da učim grafiku. Pošto je projekat došao do te tačke kada se ništa novo ne može dodati već se samo stare stvari mogu reciklirati odlučio sam da je završen.
Kod ima 600 - 700 linija ali velika većina je otišla na glupu implementaciju nekih stvari (prevoda) i recikliranje već postojećih stvari. Ako su se neke stvari mogle uraditi na bolji način (verovatno jesu, i to dosta njih) i ako postoje bagovi voleo bih da mi neko ukaže na to. Zato u stvari i otvaram temu. Od značaja je i činjenica da li se uopšte kompajlira ovo.
Znači, rađena je u CodeBlocks-u u jeziku C uglavnom, ali zbog toga što sam koristio neke funkcionalnosti jezika C++ mora se kompajlirati kao cpp. Ako neko ko koristi Visual Studio poželi da kompajlira ovaj kod neka zameni prvi u kodu sa #define _CRT_SECURE_NO_WARNINGS.
Ako nekom nije jasno šta sam tačno i kako radio neka pita pa ću mu objasniti pošto nema puno komentara u kodu.
U arhivi se nalaze fajlovi main.cpp, srpski i test. Kada budete kompajlovali kod, srpski se mora nalaziti nalazi u istom folderu kao i exe fajl da bi igra funkcionisala. Možete taj fajl otvoriti u Notepadu i naćićete i upustvo za prevođenje (koje sam napisao bezveze).
[Link mogu videti samo ulogovani korisnici]
Dopuna: 06 Feb 2016 18:00
Jel probao neko da kompajlira ono čudo?
Za stostruko kraće vreme napravih stostruko zanimljivije zmijice
Nego, ako zna neko da implementira rep ne bi bilo loše da pripomogne, ne mogu nešto da se snađem.
Igra se na strelice.
+ Kod#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define MAXR 10
#define MAXA 22
#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
struct Igrac {
int x, y, horiz, vert, repX[MAXR], repY[MAXR];
};
struct Zalogaj {
int x, y;
};
void promeniSmer(Igrac&, int);
void generisiZalogaj(Zalogaj&);
int main() {
const int BONUS = 50;
srand((int)time(NULL));
do {
int brzina = 1, poeni = 0, rep = 0, tajmer = time(NULL);
Igrac igrac;
// pocetna pozicija
igrac.x = 10;
igrac.y = 10;
// pocetno ubrzanje
igrac.horiz = 0;
igrac.vert = 1;
Zalogaj jabuka, bonus;
// neka ga van mape
bonus.x = -1;
bonus.y = -1;
generisiZalogaj(jabuka);
while (true) {
promeniSmer(igrac, brzina);
igrac.x += igrac.horiz;
igrac.y += igrac.vert;
// ako je udario u zid
if (igrac.x >= (MAXA - 1) || igrac.x <= 0 || igrac.y >= (MAXA - 1) || igrac.y <= 0) {
char q;
printf("Izgubili ste. (q za izlaz) ");
if ((q = getchar()) == 'q' || q == 'Q') return 0;
while ((q = getchar()) != '\n' && q != EOF);
break;
}
// ako je skupio jabuku
if (igrac.x == jabuka.x && igrac.y == jabuka.y) {
poeni += 10;
++rep;
generisiZalogaj(jabuka);
}
// ako je skupio bonus
if (igrac.x == bonus.x && igrac.y == bonus.y) {
poeni += 50;
rep += 2;
bonus.x = -1;
bonus.y = -1;
}
if (poeni > 999) poeni = 999;
if (brzina < 2 && poeni >= 200) brzina = 2;
if (rep > MAXR) rep = MAXR;
// ako je doslo vreme za bonus
if ((int)time(NULL) - BONUS >= tajmer) {
tajmer = time(NULL);
generisiZalogaj(bonus);
}
system("@cls||clear");
printf("Poeni: %03d\nDo bonusa: %03d\n", poeni, (tajmer + BONUS) - (int)time(NULL));
for (int r = 0; r < MAXA; ++r) {
for (int c = 0; c < MAXA; ++c) {
bool space = true;
if (r == 0 || r == (MAXA - 1) || c == 0 || c == (MAXA - 1)) {
putchar('#');
space = false;
}
if (c == igrac.x && r == igrac.y) {
putchar('O');
space = false;
}
if (c == jabuka.x && r == jabuka.y) {
putchar('x');
space = false;
}
if (c == bonus.x && r == bonus.y) {
putchar('$');
space = false;
}
if (space) putchar(' ');
}
putchar('\n');
}
}
} while(true);
return 0;
}
void generisiZalogaj(Zalogaj& generisi) {
generisi.x = rand() % (MAXA - 2) + 1;
generisi.y = rand() % (MAXA - 2) + 1;
}
void promeniSmer(Igrac& igrac, int brzina) {
if (kbhit()) {
switch (getch()) {
case UP:
igrac.horiz = 0;
igrac.vert = -brzina;
break;
case DOWN:
igrac.horiz = 0;
igrac.vert = brzina;
break;
case LEFT:
igrac.horiz = -brzina;
igrac.vert = 0;
break;
case RIGHT:
igrac.horiz = brzina;
igrac.vert = 0;
break;
}
}
}
|
|
|
Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
|
|
Poslao: 06 Feb 2016 18:36
|
offline
- vasa.93

- Moderator foruma
- Pridružio: 17 Dec 2007
- Poruke: 14825
- Gde živiš: Niš
|
Pod repom podrazumevaš - šta? Telo zmijice? Elem, zmijica se najlakše implementira preko lančane liste. Kada zmijica pojede hranu, samo dodaš još jedan element na "glavu" lančane liste i to je to. Pomeranje zmijice je takođe jednostavno - skidaš element sa kraja (repa) lančane liste i dodaješ opet jedan na glavu na odgovarajuću poziciju (u zavisnosti od smera kretanja).
|
|
|
|
Poslao: 06 Feb 2016 18:43
|
offline
- Pridružio: 15 Maj 2009
- Poruke: 963
|
Ok na to sam mislio.
Ništa, probaću to da sredim ali izgleda ne u takoj skorijoj budućnosti.
U međuvremenu može i ovako da se igra, zamislimo da je gušter kome je otpao rep i nije mu se regenerisao
|
|
|
|
Poslao: 06 Feb 2016 18:49
|
offline
- vasa.93

- Moderator foruma
- Pridružio: 17 Dec 2007
- Poruke: 14825
- Gde živiš: Niš
|
Može, ali je to onda više Pacman nego zmijica.
Inače, mislim da ne treba tu još mnogo posla. Samo treba sadašnju reprezentaciju "zmijice" da spakuješ u listu, prilagodiš štampanje reprezentaciji u vidu lančane liste i prilagodiš funkcije za kretanje i povećavanje zmijice na način koji sam ti pomenuo.
|
|
|
|
Poslao: 06 Feb 2016 22:06
|
offline
- Pridružio: 15 Maj 2009
- Poruke: 963
|
E pa nije više Pacman
Uspeo sam da isimuliram nešto slično lancu, ne baš kako si rekao ali u tom fazonu.
Glava vuče prvi deo repa, on vuče drugi, drugi vuče treći i tako do poslednjeg.
To je definisano u funkciji promeniSmer().
Sad, možda se na trenutak istrokira stampa ili se istrokira igra na neki drugi način, ali šta drugo očekivati od igre kojoj je glavni atribut grafike system("@cls||clear").
+ Kod#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <windows.h>
#define MAXR 15
#define MAXA 22
#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
struct Igrac {
int x, y, horiz, vert, repX[MAXR], repY[MAXR];
};
struct Zalogaj {
int x, y;
};
void promeniSmer(Igrac&, int);
void generisiZalogaj(Zalogaj&);
bool izgubiliSte();
int main() {
const int BONUS = 50;
srand((int)time(NULL));
do {
Igrac igrac;
Zalogaj jabuka, bonus;
bonus.x = -1;
bonus.y = -1;
igrac.x = 10;
igrac.y = 10;
igrac.horiz = 0;
igrac.vert = 1;
bool izgubio = false;
int poeni = 0, rep = 1, tajmer = time(NULL);
generisiZalogaj(jabuka);
do {
//Sleep(50); /*ako je nekome previse brza igrica nek obrise "//" i podesi po volji*/
system("@cls||clear");
printf("Poeni: %03d\nDo bonusa: %03d\n", poeni, (tajmer + BONUS) - (int)time(NULL));
for (int r = 0; r < MAXA; ++r) {
for (int c = 0; c < MAXA; ++c) {
bool space = true;
if (r == 0 || r == (MAXA - 1) || c == 0 || c == (MAXA - 1)) {
putchar('#');
space = false;
} else if (c == igrac.x && r == igrac.y) {
putchar('O');
space = false;
}
if (c == jabuka.x && r == jabuka.y) {
putchar('x');
space = false;
}
if (c == bonus.x && r == bonus.y) {
putchar('$');
space = false;
}
for (int i = 0; i < rep; ++i) {
if (r == igrac.repY[i] && c == igrac.repX[i]) {
putchar('o');
space = false;
}
if (igrac.x == igrac.repX[i] && igrac.y == igrac.repY[i]) {
izgubio = true;
break;
}
}
if (izgubio) break;
if (space) putchar(' ');
}
if (izgubio) break;
putchar('\n');
}
if (izgubio) break;
promeniSmer(igrac, rep);
if (igrac.x >= (MAXA - 1) || igrac.x <= 0 || igrac.y >= (MAXA - 1) || igrac.y <= 0) break;
if (igrac.x == jabuka.x && igrac.y == jabuka.y) {
++rep;
poeni += 10;
generisiZalogaj(jabuka);
}
if (igrac.x == bonus.x && igrac.y == bonus.y) {
rep += 2;
poeni += 50;
bonus.x = -1;
bonus.y = -1;
}
if (poeni >= 10000) {
poeni = 100000;
printf("Dosta vise...");
}
if (rep > MAXR) rep = MAXR;
if ((int)time(NULL) - BONUS >= tajmer) {
tajmer = time(NULL);
generisiZalogaj(bonus);
}
} while (true);
if (izgubiliSte()) return 0;
} while(true);
return 0;
}
bool izgubiliSte() {
char q;
system("@cls||clear");
printf("Izgubili ste. (q za izlaz) ");
if ((q = getchar()) == 'q' || q == 'Q') return true;
while ((q = getchar()) != '\n' && q != EOF);
return false;
}
void generisiZalogaj(Zalogaj& generisi) {
generisi.x = rand() % (MAXA - 2) + 1;
generisi.y = rand() % (MAXA - 2) + 1;
}
void promeniSmer(Igrac& igrac, int rep) {
if (kbhit()) {
switch (getch()) {
case UP:
igrac.horiz = 0;
igrac.vert = -1;
break;
case DOWN:
igrac.horiz = 0;
igrac.vert = 1;
break;
case LEFT:
igrac.horiz = -1;
igrac.vert = 0;
break;
case RIGHT:
igrac.horiz = 1;
igrac.vert = 0;
break;
}
}
int drugiX, drugiY;
int prviX = igrac.repX[0], prviY = igrac.repY[0];
igrac.repX[0] = igrac.x;
igrac.repY[0] = igrac.y;
for (int i = 1; i < rep; ++i) {
drugiX = igrac.repX[i];
drugiY = igrac.repY[i];
igrac.repX[i] = prviX;
igrac.repY[i] = prviY;
prviX = drugiX;
prviY = drugiY;
}
igrac.x += igrac.horiz;
igrac.y += igrac.vert;
}
|
|
|
|
Poslao: 06 Feb 2016 23:04
|
offline
- vasa.93

- Moderator foruma
- Pridružio: 17 Dec 2007
- Poruke: 14825
- Gde živiš: Niš
|
elzike7 ::Glava vuče prvi deo repa, on vuče drugi, drugi vuče treći i tako do poslednjeg.Rešenje sa lančanom listom je dosta optimalnije, i generalno njegova složenost je konstantna (O(2) - ne zavisi od dužine zmijice), dok je kod tvog rešenja složenost linearna (O(n-1) - zavisi od dužine zmijice).
Sve u svemu, nebitno je sve ovo za ovu igricu. Više je to moja sugestija da se trudiš da u startu stvari učiš i radiš onako kako treba, a ne samo da sklepaš neko rešenje koje radi. Istraživanje i informisanje o nekom konkretnom problemu (odnosno o njegovom rešenju) pre samog programiranja može umnogome da ti olakša samo programiranje i oslobodi te od potencijalnih problema.
Svakako, svaka čast na entuzijazmu. Samo napred.
|
|
|
|