Wąż (jak wyświetlać)

0

Witam

Robię węża w c++ i nie wiem w sumie jak wyświetlać to na ekranie.

Najpierw zrobiłem dwuwymiarową tablicę znaków, a następnie użyłem funkcji system("cls") czyszczącą konsolę no i zaaplikowałem w pętli drukowanie wszystkich znaków tablicy.

Ale nie jest to dobre rozwiązanie ponieważ obraz ciągle miga, a program jest powolny przez to że musi cały czas drukować nawet te znaki które nie zmieniły się w tablicy.

Ma ktoś pomysł jak inaczej rozwiązać wyświetlanie. Dodam że nie chcę się zagłębiać w żadne skomplikowane biblioteki, bo na skończenie tego projektu mam tydzień, więc nie miałbym czasu na ich naukę.

Z góry dziękuję za pomoc.

0

Rysuj tylko to co się zmienia

0

ncurses - milion razy było.

1

Coś jak:

Rysuj(DupaWęża, Mapa.BlokNaPozycji(DupaWęża).Znaczek);

gdzie DupaWęża = (X, Y)

EDIT:

#include <windows.h>
typedef COORD Point;

void GotoXY(int column, int line)
{
	COORD coord = { column, line };
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void DrawSign(const Point &p, char sign){
	GotoXY(p.X, p.Y);
	cout << sign;
}
0

Bez ncurses to trochę taka prostytucja umysłowa, ale jeśli chcesz się babrać :) Elementy jakie się zmieniają to głowa i ogon węża i tam powinieneś rysować. Musisz zaprzęgnąć do tego WinAPI, jest tam funkcja która nazywa się SetConsoleCursorPosition dla której nie znam żadnej alternatywy. Jak sugeruje Twój komentarz do jednego z postów, masz narzucony DEV-C++ co na pewno Ci zadania nie ułatwi.

1
 
#include <windows.h> 
void gotoxy(short x, short y) 
{ 
    HANDLE hstdout = GetStdHandle(STD_OUTPUT_HANDLE); 
    COORD position = { x, y }; 
    SetConsoleCursorPosition(hstdout, position); 
} 
0

Dzięki bardzo spartanpage, myślę że jakoś przebrnę przez tą prostytucję umysłową.

0

Ok pojawia się następne pytanie.
Jak zrobić by wąż nie czekał na wciśnięcie klawisza?

char czytaj_klawiature() {
  char klawisz, kierunek;
  klawisz = getch();
  switch(klawisz) {
    case char(75) : kierunek = 'l'; break;
    case char(77) : kierunek = 'p'; break;
    case char(72) : kierunek = 'g'; break;
    case char(80) : kierunek = 'd'; break;
  }
  return kierunek;
}

int main(){
	// b - tyl, h - glowa	
	int bx = 10, by = 10, hx = 10, hy = 16;
	bool koniec = 1;
	rys_mapy();
	do {
		por_h_waz(&bx, &by, &hx, &hy, czytaj_klawiature());
		opoznienie(250);
	} while (koniec);
	return 0;
}

Taki kod powoduje, że każde wywołanie funkcji getch() stopuje węża i czeka na wciśnięcie klawisza klawiatury.

0

Musisz sprawdzić, czy jest jakiś klawisz do odczytania i dopiero wtedy go odczytywać.

0

Jakbyś chciał być ambitny mógłbyś obsługiwać sterowanie w nowym wątku.

1

Funkcja z biblioteki conio powinna pomóc.

 _kbhit(); 
if(_kbhit())
{
key=_getch();
}
 
0

Mój prowadzący powiedział, że muszę jeszcze ulepszyć kod, a więc muszę dorobić jeszcze.

  • Rozszerzanie węża
  • Najlepsze wyniki
  • Zrobić by wąż nie ginął gdy wchodzi sam w siebie tzn. nie ignorował zmianę kierunku gdy ma się poruszać w przeciwną stronę do aktualnej

Zacznijmy od rozszerzania węża myślałem na początku o zapisywaniu pozycji węża w kolejce, ale gdy wąż zjadłby malinkę musiałbym ją usuwać i tworzyć nową o 1 większą. Potem przyszedł mi do głowy zapis wektorowy, ale muszę zapisywać dwie dane (x i y) każdego punktu, a wektory są przecież "jednowymiarowe". Ma ktoś jakiś pomysł?

1 użytkowników online, w tym zalogowanych: 0, gości: 1