• 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

VPS Starter Arubacloud
0 głosów
453 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 (213,860 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 (213,860 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,233 wizyt
+5 głosów
1 odpowiedź 1,150 wizyt
pytanie zadane 28 lipca 2018 w Nasze projekty przez C☺ndzi Stary wyjadacz (12,100 p.)
0 głosów
0 odpowiedzi 219 wizyt
pytanie zadane 16 czerwca 2021 w Systemy operacyjne, programy przez Maren Nowicjusz (120 p.)

92,958 zapytań

141,919 odpowiedzi

321,149 komentarzy

62,290 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...