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

SFML Kółko i krzyżyk - nie działa

Object Storage Arubacloud
0 głosów
394 wizyt
pytanie zadane 26 lipca 2016 w C i C++ przez Gracjan Pasik Obywatel (1,810 p.)

Po nauczeniu się podstaw SFML'a przeszedłem to praktyki. Na pierwsze zadanie (zaraz po Hello World) wyznaczyłem sobie zrobienie gry w kółko i krzyżyk. Udało mi się zrobić dużą część kodu, ale nie wiem jak poradzić sobie z problemem przechodzenia przez system sprawdzania. Załączę kod dla lepszego obrazu problemu:

#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
int gracz, ruchy1, ruchy2;
int msc[9];
ruchy1 = 0;
ruchy2 = 0;

int main()
{
	sf::RenderWindow okno(sf::VideoMode(900, 900, 32), "Kolko i krzyzyk");
	okno.setVerticalSyncEnabled(true);
	sf::Music music;
	music.setVolume(0);
	music.openFromFile("smts.wav");
	music.play();
	sf::Texture gui;
	gui.loadFromFile("gui.png");
	sf::Sprite guis;
	guis.setTexture(gui);
	sf::Texture o;
	o.loadFromFile("o.png");
	sf::Sprite os[9];
	os[0].setTexture(o);
	os[0].setScale(0.8, 0.8);
	os[1].setTexture(o);
	os[1].setScale(0.8, 0.8);
	os[1].move(0, 325);
	os[2].setTexture(o);
	os[2].setScale(0.8, 0.8);
	os[2].move(0, 650);
	os[3].setTexture(o);
	os[3].setScale(0.8, 0.8);
	os[3].move(325, 0);
	os[4].setTexture(o);
	os[4].setScale(0.8, 0.8);
	os[4].move(325, 325);
	os[5].setTexture(o);
	os[5].setScale(0.8, 0.8);
	os[5].move(650, 325);
	os[6].setTexture(o);
	os[6].setScale(0.8, 0.8);
	os[6].move(325, 650);
	os[7].setTexture(o);
	os[7].setScale(0.8, 0.8);
	os[7].move(650, 0);
	os[8].setTexture(o);
	os[8].setScale(0.8, 0.8);
	os[8].move(650, 650); 
	//ustawianie kół
	sf::Texture x;
	x.loadFromFile("x.png");
	sf::Sprite xs[9];
	xs[0].setTexture(x);
	xs[0].setScale(0.8, 0.8);
	xs[1].setTexture(x);
	xs[1].setScale(0.8, 0.8);
	xs[1].move(0, 325);
	xs[2].setTexture(x);
	xs[2].setScale(0.8, 0.8);
	xs[2].move(0, 650);
	xs[3].setTexture(x);
	xs[3].setScale(0.8, 0.8);
	xs[3].move(325, 0);
	xs[4].setTexture(x);
	xs[4].setScale(0.8, 0.8);
	xs[4].move(325, 325);
	xs[5].setTexture(x);
	xs[5].setScale(0.8, 0.8);
	xs[5].move(650, 325);
	xs[6].setTexture(x);
	xs[6].setScale(0.8, 0.8);
	xs[6].move(325, 650);
	xs[7].setTexture(x);
	xs[7].setScale(0.8, 0.8);
	xs[7].move(650, 0);
	xs[8].setTexture(x);
	xs[8].setScale(0.8, 0.8);
	xs[8].move(650, 650); 
	//ustawianie krzyżyków


	while (okno.isOpen())
	{
		sf::Event event;
		while (okno.pollEvent(event))
		{
			if (event.type == sf::Event::Closed)
				okno.close();

		} //while

		
		if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num1) && ruchy1 == ruchy2)
		{
			ruchy1++;
			if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num1) && msc[0] == false)
			{
				okno.draw(os[0]);
				msc[0] = true;
			}
			else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num2) && msc[1] == false)
			{
				okno.draw(os[1]);
				msc[1] = true;
			}
			else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num3) && msc[2] == false)
			{
				okno.draw(os[2]);
				msc[2] = true;
			}
			else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num4) && msc[3] == false)
			{
				okno.draw(os[3]);
				msc[3] = true;
			}
			else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num5) && msc[4] == false)
			{
				okno.draw(os[4]);
				msc[4] = true;
			}
			else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num6) && msc[5] == false)
			{
				okno.draw(os[5]);
				msc[5] = true;
			}
			else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num7) && msc[6] == false)
			{
				okno.draw(os[6]);
				msc[6] = true;
			}
			else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num8) && msc[7] == false)
			{
				okno.draw(os[7]);
				msc[7] = true;
			}
			else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num9) && msc[8] == false)
			{

				okno.draw(os[8]);
				msc[8] = true;
			}


		}
		if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num2) && ruchy1 >= ruchy2)
		{
			ruchy2++;
			if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num1) && msc[0] == false)
			{
				okno.draw(xs[0]);
				msc[0] = true;
			}
			else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num2) && msc[1] == false)
			{
				okno.draw(xs[1]);
				msc[1] = true;
			}
			else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num3) && msc[2] == false)
			{
				okno.draw(xs[2]);
				msc[2] = true;
			}
			else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num4) && msc[3] == false)
			{
				okno.draw(xs[3]);
				msc[3] = true;
			}
			else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num5) && msc[4] == false)
			{
				okno.draw(xs[4]);
				msc[4] = true;
			}
			else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num6) && msc[5] == false)
			{
				okno.draw(xs[5]);
				msc[5] = true;
			}
			else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num7) && msc[6] == false)
			{
				okno.draw(xs[6]);
				msc[6] = true;
			}
			else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num8) && msc[7] == false)
			{
				okno.draw(xs[7]);
				msc[7] = true;
			}
			else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num9) && msc[8] == false)
			{

				okno.draw(xs[8]);
				msc[8] = true;
			}


		}
		okno.clear();
		okno.draw(guis);
		okno.display();
	} //while
	return 0;
}

 

Kiedy klikam na klawiaturze 1, a później którąkolwiek z cyfr 1-9 nic się nie dzieje, a ja nie mogę tego rozgryźć na logikę. Czy trzeba użyć wielowątkowości?

1
komentarz 26 lipca 2016 przez Ehlert Ekspert (212,670 p.)

Oczy krwawią. Słyszałeś o pętlach? Vectorach? sad

komentarz 26 lipca 2016 przez Gracjan Pasik Obywatel (1,810 p.)
O pętlach tak, ale o Vectorach nie
komentarz 26 lipca 2016 przez Ehlert Ekspert (212,670 p.)
To wystarczy żeby chociaż spróbować skrócić te 55 linijki.
komentarz 26 lipca 2016 przez Gracjan Pasik Obywatel (1,810 p.)
Nawet jak skrócę, to i tak nie będzie działać. Upraszczaniem kodu zajmę się na końcu, najpierw chciałbym uzyskać jakikolwiek efekt, by wiedzieć że nie skracam złego kodu.

1 odpowiedź

0 głosów
odpowiedź 26 lipca 2016 przez Programista3 Gaduła (3,390 p.)
wybrane 26 lipca 2016 przez Gracjan Pasik
 
Najlepsza
  1. Najlepiej by było gdybyś spakował ten plik razem z grafikami i dźwiękiem do jakiegoś zipa, dodał na jakiś hosting plików np. przyklej.org i podał link. Z tymi plikami łatwiej by było sprawdzić działanie programu (uruchamiając go a nie tylko z poziomu kodu),
  2. Tablica msc jest typu int a Ty przypisujesz jej elementom wartość true. (powinno być bool),
  3. Zmienne gracz, ruchy1, ruchy2 oraz tablica msc nie muszą być globalne, wystarczy jak zdeklarujesz je na początku main,
  4. Zamiast skalować obrazki w SFML lepiej jest zrobić je od razu we właściwych rozmiarach lub przeskalować je w programie graficznym - mniej kodu w programie,
  5. Nie potrzebnie tworzysz oddzielne Sprite'y dla x i o. Powinieneś tworzyć tylko raz planszę w której później będziesz ustawiał odpowiednie tekstury dla konkretnych pól,
  6. Zamiast przesuwać Sprite'y ustawiaj ich pozycję (setPosition() zamiast move()),
  7. Pozycje ustawiaj za pomocą pętli,
  8. Zamiast sf::Keyboard::isKeyPressed​ lepiej sprawdziło by się sf::Event::KeyReleased.

To tak z grubsza.

komentarz 26 lipca 2016 przez Gracjan Pasik Obywatel (1,810 p.)
Nie rozumiem pkt. 5, jak mam to zrobić bez tekstur x i o?
komentarz 4 sierpnia 2016 przez Programista3 Gaduła (3,390 p.)

Sprite'y to nie tekstury!​

sf::Sprite os[9];
...
sf::Sprite xs[9];

Ty tworzysz dwie plansze gdy w zupełności wystarczy jedna. Utwórz jedną tablicę 9-cio elementową np sf::Sprite plansza[9] i po naciśnięciu przycisku zależnie od tury (x/o) ustawiaj dla właściwego pola (elementu tablicy plansza) odpowiednią teksturę x albo o. W ten sposób o wiele skrócisz obecny kod.

Podobne pytania

+1 głos
0 odpowiedzi 2,022 wizyt
+5 głosów
1 odpowiedź 1,026 wizyt
pytanie zadane 28 lipca 2018 w Nasze projekty przez C☺ndzi Stary wyjadacz (12,100 p.)
0 głosów
0 odpowiedzi 201 wizyt
pytanie zadane 16 czerwca 2021 w Systemy operacyjne, programy przez Maren Nowicjusz (120 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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!

...