Kółko i krzyżyk w C, niedziałające warunki.

0

Hej, cześć, mam taki program, a właściwie "grę" Kółko i krzyżyk, jednak w tym problem, że nawet jesli wykona sie 9 prób lub warunki z funkcji spr zostaną spełnione, to program dalej pobiera dane.

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

void wypisz(char arr[3][3])
{
	printf("_____________\n");
	printf("| %c | %c | %c |\n",arr[0][0],arr[0][1],arr[0][2]);
	printf("_____________\n");
	printf("| %c | %c | %c |\n",arr[1][0],arr[1][1],arr[1][2]);
	printf("_____________\n");
	printf("| %c | %c | %c |\n",arr[2][0],arr[2][1],arr[2][2]);
	printf("_____________\n");
}
bool spr(char arr[3][3], bool win)
{
	if(arr[0][0]==arr[0][1] && arr[0][1]==arr[0][2] || arr[1][0]==arr[1][1] && arr[1][1] ==arr[1][2] || arr[2][0]==arr[2][1] && arr[2][1]==arr[2][2])
	{
		win=1;		
	
	}
	else if(arr[0][0]==arr[1][0] && arr[1][0]==arr[2][0] || arr[0][1]==arr[1][1] && arr[1][1]==arr[2][1] || arr[0][2]==arr[1][2] && arr[1][2]==arr[2][2])
	{
		win=1;
	
	}
	else if(arr[0][0]==arr[1][1] && arr[1][1]==arr[2][2] || arr[0][2]==arr[1][1] && arr[1][1]==arr[2][0])
	{
		win=1;
			
	}
	return win;
	printf("wygrales");
}

int main()
{
	char arr[3][3]={{' ',' ',' '},{' ',' ',' '}};
	int x1,x2,y1,y2;
	int kolejka=0;
	bool win;
	printf("GRA W KOLKO I KRZYZYYK!");
	Sleep(2000);
	system("cls");
	
	
while(win!=1 || kolejka <=9)
{
	printf(" KOLKO: Wprowadz wspodlrzedne: \n");
	scanf("%d",&x1);
	scanf("%d",&y1);
	arr[x1][y1]='O';
	
	spr(arr,win);
	wypisz(arr);
	
	printf("KRZYZYK: Wprowadz wspolrzedne:\n ");
	scanf("%d",&x2);
	scanf("%d",&y2);
	arr[x2][y2]='X';
	
	spr(arr,win);
	wypisz(arr);
	kolejka++;
}

3

Masz wiele błędów w kodzie. Jeśli miałbym coś radzić:

  1. Wyprowadź warunki sprawdzenia linii poziomych i pionowych oraz diagonalnych do oddzielnych funkcji.
  2. Zastanów się jak funkcja spr(...) może zmienić wartość win jeśli:
    a) przekazujesz ją jako kopie w argumencie funkcji,
    b) po wykonaniu spr(..) nie przypisujesz nigdzie wyniku działania tej funkcji.
  3. Zmienna win jest typu bool więc nie przypisuj do niej 0 i 1 tylko true i false.
  4. Tablica arr[3][3], nie ma przypisanego 3-go wiersza tylko 2.
  5. Warunek while(...) jest błędny. Czy "jeśli win jest fałszem lub kolejka jest mniejsza równa 9 to kontynuuj" czy raczej "jeśli win jest fałszem i kolejka jest mniejsza równa 9 to kontynuuj"?
  6. W przypadku braku ułożenia wiersza przez jakiegokolwiek z graczy, brakuje uwzględnienia stanu "remis".
  7. Jeśli najpierw zrobisz return a później printf(... ) w funkcji, printf(...) nigdy się nie wyświetli.

Jeszcze trochę drobnicy co do zasad by się znalazło, ale te uwagi są IMHO najważniejsze.

2

A co najistotniejsze - wypadałoby chociaż sprawdzić, czy wrzucony kod się kompiluje skoro nauka o jego wcześniejszym sformatowaniu przez zaprezentowaniem poszła jak widzę w las...
Jest jeszcze taki błąd, że sobie mogę w to samo pole, np 1,1 na zmianę wpisywać kółko i krzyżyk.

1

Aby móc modyfikować zewnętrzną zmienną w w funkcji spr() zmień deklarację funkcji na taką:

bool spr(char arr[3][3], bool &win)

EDIT:
jednak w C powyższe nie działa, zatem tak:

void spr(char arr[3][3], int *win);//bool też widzę coś mu nie w smak
1

Kamila, sugeruję nieco przeprojektować program.

Rzecz pierwsza, sprawdzanie czy jest ustawienie krzyżyk/kółko robisz przez:

arr[0][0] == arr[0][1]

co to tak naprawdę oznacza? Wcale nie, czy na sąsiednim polu jest krzyżyk czy kółko, tylko czy znak spod [0][0] jest taki sam jak ten spod [0][1]. Wydawać by się mogło, że to dokładnie to o co Ci chodzi, ale jednak nie - wyobraź sobie, że w pierwszej komórce masz np 'M', a drugiej też 'M'. Co wtedy? Równość spełniona.
A teraz przyjrzyj się dziewczę jak zainicjalizowałaś sobie tą tablicę :] Dostrzegasz błąd?
Imo lepiej sobie zdefiniować funkcję która do tablicy wpisze znak, po czym porówna, czy odpowiednie komórki zawierają ten sam znak. Prototyp wyglądałby tak:

bool wstawZnak(unsigned int x, unsigned int y, char znak)//znak to będzie 'X' lub 'O', współrzędne wiadomo. 

funkcja ta:

  • może zwalidować zakres współrzędnych - jeśli > 2 to robi printf za duże współrzędne, i zwraca false.
  • wpisuje w odpowiednią komórkę tabeli przesłany znak
  • sprawdza, czy w odpowiednich, sąsiednich komórkach jest ten sam znak co przesłany. Tutaj trochę zabawy Cię czeka, ale przykład:
    wstawiłaś 'X' w 0,1, więc do sprawdzenia jest 0,0 i 0,2, następnie 1,1 i 2,1 - tylko taka kombinacja daje wygraną.
  • funkcja zwraca bool = true jeśli powyższe sprawdzenie znajdzie przesłany znak na szukanych pozycjach, false jeśli nie - to możesz wykorzystać do kontynuacji pętli.

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