• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Tabela wynikow w grze Snake

Object Storage Arubacloud
+1 głos
332 wizyt
pytanie zadane 22 kwietnia 2019 w C i C++ przez Marcin Płoński Nowicjusz (130 p.)

Witam pracuje nad "projektem" na studia, potrzebuje stworzyc tabele wynikow. Tabela powinna znajdować się po prawej stronie po uruchomieniu programu i pokazywac 5 najlepszych wynikow. Nie mam pojecia jak sie zabrac za to żeby zapisywać dane w tym przypadku wynik, i następnei go wyswietwlic  jesli będzie lepszy niż ostatni wynik z tabeli. Tutaj kod mojej gry https://pastebin.com/pJbX0Dmk. Z góry dziękuje za pomoc.

#include <iostream>
#include <conio.h>
#include <Windows.h>
using namespace std;
bool koniecGry;
const int szerokosc = 20;
const int wysokosc = 20; 
int xWeza, yWeza, owocX, owocY, wynik;
int xOgon[100], yOgon[100];
//dlugosc ogona
int dlugoscOgona;
enum kierunek { STOP = 0, LEWO, PRAWO, GORA, DOL };
kierunek kWeza;
void konfiguracja()
{
	koniecGry = false;
	kWeza = STOP;
	xWeza = szerokosc / 2;
	yWeza = wysokosc / 2;
	owocX = rand() % szerokosc;
	owocY = rand() % wysokosc;
	wynik = 0;
}

void rysuj()
{
	system("cls");

	//gorna sciana
	for (int i = 0; i < szerokosc+2; i++)
		cout << "#";
	cout << endl;
	//boczne sciany
	for (int i = 0; i < wysokosc; i++)
	{
		for (int j = 0; j < szerokosc; j++)
		{
			if (j == 0)
				cout << "#";
			if (i == yWeza && j == xWeza)
				cout << "O";
			else if (i == owocY && j == owocX)
				cout << "F";
			else
			{
				bool wyswietl = false;

				for (int k = 0; k < dlugoscOgona; k++)
				{
					if (xOgon[k] == j && yOgon[k] == i)
					{
						cout << "o";
						wyswietl = true;
					}
				}
				if (!wyswietl)
					cout << " ";
			}
				//cout << " ";
			if (j == szerokosc - 1)
				cout << "#";
		}
		cout << endl;
	}
	//dolna sciana
	for (int i = 0; i < szerokosc+2; i++)
		cout << "#";
	cout << endl;
	cout << "Wynik: " << wynik << endl;
}

void wejscie()
{
	if (_kbhit())
	{
		switch (_getch())
		{
		case 'a':
			kWeza = LEWO;
			break;
		case 'd':
			kWeza = PRAWO;
			break;
		case 'w':
			kWeza = GORA;
			break;
		case 's':
			kWeza = DOL;
			break;
		case 'x':
			koniecGry = true;
			break;

		default:
			break;
		}
	}
}
 
void logika()
{
	int poprzedniX = xOgon[0];
	int poprzedniY = yOgon[0];
	int poprzedni2X, poprzedni2Y;
	xOgon[0] = xWeza;
	yOgon[0] = yWeza;

	for (int i = 1; i < dlugoscOgona; i++)
	{
		poprzedni2X = xOgon[i];
		poprzedni2Y = yOgon[i];
		xOgon[i] = poprzedniX;
		yOgon[i] = poprzedniY;
		poprzedniX = poprzedni2X;
		poprzedniY = poprzedni2Y;		
	}
	switch (kWeza)
	{
	case LEWO:
		xWeza--;
		break;
	case PRAWO:
		xWeza++;
		break;
	case GORA:
		yWeza--;
		break;
	case DOL:
		yWeza++;
		break;
	default:
		break;
	}
	if (xWeza > szerokosc || xWeza < 0 || yWeza > wysokosc || yWeza < 0)
		koniecGry = true;
	for (int i = 0; i < dlugoscOgona; i++)
		if (xOgon[i] == xWeza && yOgon[i] == yWeza)
			koniecGry = true;
	if (xWeza == owocX && yWeza == owocY)
	{	
		wynik = wynik + 10;
		owocX = rand() % szerokosc;
		owocY = rand() % wysokosc;
		dlugoscOgona++;
	}
}




int main()
{
	konfiguracja();
	while (!koniecGry)
	{
		rysuj();
		wejscie();
		logika();
		//ustawianie szybkosci; 
		Sleep(50);
	}
	return 0;
}

 

komentarz 22 kwietnia 2019 przez Ajver Bywalec (2,430 p.)
Czy chcesz także zapisywać te wyniki do zewnętrznego pliku, aby po ponownym uruchomieniu programu się zapisywaly?

1 odpowiedź

0 głosów
odpowiedź 22 kwietnia 2019 przez Ajver Bywalec (2,430 p.)

Jeśli chodzi o zapisywanie, to proponuję stworzyć tablicę np. 5-cio elementowa. Będzie przechowywać wyniki w kolejności od największego.

W funkcji konfiguracja() warto upewnić się, że ta tablica jest wypełniona zerami (czyli w pętli ustawić wszystkie jej komórki na 0) np. W ten sposób:

for(int i=0; i<5; i++) 
  najlepszeWyniki[i] = 0;

Za każdym razem, gdy skończy się gra musimy wcisnąć aktualny wynik do tej tablicy. Proponuję do tego zrobić funkcję:

void wcisnijWynik(int w) {
  for(int i=0; i<5; i++) {
    if(w > najlepszeWyniki[i]) {
      // przesuwamy wszystkie następne elementy tablicy w dol
      for(int j=4; j>=i; j++) {
        najlepszeWyniki[j] = najlepszeWyniki[j+1];
      }
      // gdy wszystkie kolejne elementy zostaną przesunięte w dół, zapisujemy wynik
      najlepszeWyniki[i] = wynik; 
    }
  }
}

(Nie testowałem tego kodu, więc nie ma gwarancji, że jest poprawny).

Wyświetlanie można zrobić w ten sposób:

Trzeba zmienić liczbę na napis, np. Funkcją std::to_string(int), która znajduje się bodajże w bibliotece string. Przechodzimy przez wszystkie elementy tablicy najlepszeWyniki i wykonujemy kolejne linijki kodu:

std::string sWynik = std::to_string(najlepszeWyniki[i]);

Zakładając, że szerokość konsoli to 80 komórek, aby napis był po prawej stronie musimy zacząć go wypisywać na pozycji x = 80-szerokość napisu.

Tę pozycję uzyskasz robiąc odpowiednią ilość spacji w pętli. Później robisz endl i w ten sam sposób wyświetlasz wszystkie 5 najlepszych wyników.

Podobne pytania

0 głosów
1 odpowiedź 844 wizyt
pytanie zadane 28 czerwca 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
0 głosów
1 odpowiedź 594 wizyt
pytanie zadane 5 maja 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
0 głosów
0 odpowiedzi 105 wizyt
pytanie zadane 21 listopada 2019 w C i C++ przez Wiktor Michalski Początkujący (430 p.)

92,589 zapytań

141,440 odpowiedzi

319,697 komentarzy

61,974 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...