Strona 1 z 1

Projekt węŻa z pomocoą ncurses

: 26 grudnia 2009, 22:30
autor: komjg
Zacząłem dzisiaj pisać wężyka, ponieważ mam takie zadanie, nigdy bym nie pomyślał, że to może być aż takie męczące. Ale uporałem się z błędami jednak nie wyświetla się, a myślę, że powinien możliwe, że źle znam ncurses jeśli ktoś wie co jak niech poprawi będę wdzięczny, ponieważ ważne to jest do dalszych dodatków do programów. A w planach mam.
Dodanie lvl, jedzenie, przeszkody, ewentualnie najlepsze wyniki.

Kod: Zaznacz cały

#include <iostream>
//#include <stdio.h>
/* biblioteka ncurses automatycznie dolacza stdio.h i kilka innych */
#include <ncurses.h>
using namespace std;

void SleepMs(int ms) {
usleep(ms*1000); /*usleep jest funkcja do ktorej w odroznieniu do sleep
wprowadza sie mikrosekundy*/
return;
}
struct waz_charakterystyka {

int dlugosc;
int glowax;
int gloway;
int glowakierunek;
int *cialox;
int *cialoy; 
} waz;

void start()
{
initscr();
int kolumny = 0;
int rzedy = 0;
getmaxyx(stdscr, rzedy, kolumny);
 WINDOW *oknogry=newwin(rzedy-1,kolumny, 0, 0);
box(oknogry, 0, 0);
wrefresh(oknogry);
//def_prog_mode();
delwin(oknogry);
endwin();
waz.dlugosc = 3;
waz.cialox = new int[waz.dlugosc-1 ];
waz.cialoy = new int[waz.dlugosc-1 ];
waz.glowax = 4;
waz.gloway = 4;
waz.cialoy[0]=waz.cialoy[1]=waz.cialoy[2]=waz.gloway;
for (int i = 0; i < waz.dlugosc; ++i){
waz.cialox[i] = 4 -i;
}
waz.glowakierunek = KEY_RIGHT;
}


void ruch ()

{
initscr();
noecho();
waz.glowakierunek = getch(); 
if (waz.glowakierunek == KEY_LEFT)
 {
waz.glowax --;
}
if (waz.glowakierunek == KEY_RIGHT)
{
waz.glowax ++;
}
if (waz.glowakierunek == KEY_UP)
{
waz.gloway --;
}
if (waz.glowakierunek == KEY_DOWN)
{
waz.gloway ++;
}
endwin();
	}
void cialo()
{
int p1, p2;
p1 = waz.glowax;
for (int i = 0; i < waz.dlugosc; ++i) {
p2 = waz.cialox[i];
waz.cialox[i]= p1;
p1 = p2;
}

p1 = waz.gloway;
for (int i = 0; i < waz.dlugosc; ++i) {
p2 = waz.cialoy[i];
waz.cialoy[i]= p1;
p1 = p2;
}
initscr();
//reset_prog_mode();
//refresh();
mvprintw(waz.cialoy[0], waz.cialox[0], "@");
for (int i=1; i<waz.dlugosc; ++i) {
mvprintw(waz.cialoy[i],waz.cialox[i], "o" );
}
//wrefresh(stdscr);        
//wrefresh(oknogry);
refresh();
endwin();
}

void delcialo()
{
//reset_prog_mode();
//refresh();
initscr();
mvdelch(waz.cialoy[0], waz.cialox[0]);
for (int i=1; i<waz.dlugosc; ++i) {
mvdelch(waz.cialoy[i],waz.cialox[i]);
}
//wrefresh(stdscr);        
//wrefresh(oknogry);
refresh();
endwin();
}
void silnik ()
{
 while(1)
    {
         ruch ();
         cialo();
         SleepMs (50);
         delcialo();
//printf(" \033[2J");
}
}


int main()
{
start();
//cialo();
silnik();
return 0;
}
Z góry dziękuję i myślę dyskusja się rozwinie w temacie.

: 27 grudnia 2009, 21:57
autor: pietrzuch
Co mi się nie podoba?
Za dużo tych initscr()'ów.
Generalnie rób według takiego schematu:
  • 1. Inizjalizacje takie jak initscr().
    2. Pętelka do...while, a w niej wszystko związane z grą, czyli:
    [list:2e71c43cf0] a) wejście
    b) jakieś algorytmy
    b) wyświetlanie
3. Koniec tj. endwin().[/list:u:2e71c43cf0]

: 28 grudnia 2009, 08:58
autor: komjg
Humm, problem stoi w tym, że nie wiem czy rysowanie w stylu okno gry, i ciało weżą następnie jego kasowanie i rysowanie od początku tego samego nie wywali błędu. Zresztą ja już kombinowałem rysowac okno i węża osobno i nic. Dla mnie to jest wszystko dziwne, bo właściwie to się będzie tak samo przetwarzać po prostu czym się różni, osobiście dla mnie wydaje się, że źle coś robię korzystając z ncurses, bo naprawdę mam metek w głowie jest to dla mnie coś nowego. A tam jest od groma funckji które robią czasem te same rzeczy. :evil: Dzisiaj pokombinuje i dam rezultat.

: 28 grudnia 2009, 11:34
autor: Marcinnn
Masz zainstalowane Ubuntu. Ja bym Ci polecił ściągnąć podobną grę (np. Snake4) zagrać w nią, potem ściągnąć sobie kod źródłowy

Kod: Zaznacz cały

apt-get source snake4
i zobaczyć jak się takie rzeczy robi, bo mam wrażenie, że robisz to po raz pierwszy w życiu a warto od razu się uczyć właściwego myślenia i prawidłowych przyzwyczajeń, nawet jeśli od razu się ich nie rozumie. Kod programiku naprawdę nie jest obszerny. :-)

: 28 grudnia 2009, 12:16
autor: bagsiur
warto od razu się uczyć właściwego myślenia i prawidłowych przyzwyczajeń
Tak ale kopiując gotowy kod, nikt niczego się nie nauczy. Najlepiej uczyć się na błędach i zdobywać przez to doświadczenie.

: 28 grudnia 2009, 12:25
autor: Marcinnn
Chodzi mi o zdobycie właściwych wzorców, które jednak uczy. :-) Ponadto "zobaczyć kod" to nie tylko go przeczytać, ale też poeksperymentować trochę z nim albo przerobić go na własny. Na następny raz wie się jak się do tego zabrać mając już odpowiednie przygotowanie, bez niepotrzebnego odkrywania Ameryki. :-)

: 29 grudnia 2009, 14:12
autor: pietrzuch
Najpierw uruchom okno. (initscr()) Później w pętli sprawdzaj jaki i czy jest jakiś przycisk wciśnięty. Następnie nadal w pętli czyścisz ekran i rysujesz węża. (jeśli pozycja się zmieniła) Pętlę kończysz np. przy przyciśnięciu przycisku esc. Koniec programu.