Przeszukiwanie planszy (Gra Gomoku)

0

Proszę o pomoc ponieważ nie wiem jak napisać cześć programu w której plansza będzie skanowana w poszukiwaniu 5 takich samych znaków (w poziomie, pionie i po przekątnych).

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <conio.h>




/*  Funkcja czyszcąca planszę  */

void wyczysc(char plansza[15][15])
{
	int i, j;
	for (i = 0; i<15; i++)
	for (j = 0; j<15; j++)
		plansza[i][j] = ' ';

}


/*  Funkcja rysująca planszę na ekranie  */

void wypisz(char plansza[15][15])
{
	system("cls");
	for (int i = 0; i<15; i++){
		for (int j = 0; j<15; j++)
		{
			printf("[%c]", plansza[i][j]);
		}
		printf("\n");
	}
}

/*  Ruch gracza 1 (o)  */

void ruch_gracza1(char plansza[15][15])
{
	unsigned int i = 15, j;
	wypisz(plansza);
	printf("\nPodaj wiersz i kolumne w ktorej chcesz wstawic krzyzyk\n");
	while ((i>14) || (j>14) || (plansza[i][j] != ' '))
		scanf_s("%u %u", &i, &j);
	plansza[i][j] = 'x';
}

/*  Ruch gracza 2 (x)  */

void ruch_gracza2(char plansza[15][15])
{
	unsigned int i = 15, j;
	wypisz(plansza);
	printf("\nPodaj wiersz i kolumne w ktorej chcesz wstawic kolko\n");
	while ((i>14) || (j>14) || (plansza[i][j] != ' '))
		scanf_s("%u %u", &i, &j);
	plansza[i][j] = 'o';
}

/*  Funkcja sprawdzająca tablicę  */


char sprawdz(char plansza[15][15])
{
	int i, j, c, k;

	//sprawdz poziomie

	for (i = 1; i < 15; i++);
	{
		c = 1;

		for (j = 1; j < 15; j++);
		{
			if (plansza[i][j - 1] == plansza[i][j])
				c++;
			else c = 1;

			if ((c == 5) && plansza[i][j])
			{
				if ((j < 14) && (plansza[i][j] == plansza[i][j + 1]))
					return 0;
				
				sprawdz(plansza) == 'x';
				return 1;
			}
		}
	}
	return 0;
	}





	/*  Główny kod programu (pentla)  */

	int main()
	{
		int ruch = 1;
		char wynik = 0;
		char plansza[15][15];

		printf("***********************************************************************\n");
		printf("=============================== Gomoku ================================\n");


		wyczysc(plansza);

		while (wynik == 0)
		{
			if (ruch == 0)
				ruch_gracza1(plansza);
			else
				ruch_gracza2(plansza);
			ruch = 1 - ruch;
			wynik = sprawdz(plansza);
		}
		wypisz(plansza);

		if (wynik == 'x')
			printf("gracz\n");
	}
 
0

Dsotałeś już wskazówki tutaj: http://4programmers.net/Forum/C_i_C++/227382-pomocy_gra_gomuku?p=1000978#id1000978

edit
Ewentualnie mogłeś odświeżyć powyższy temat jeśli nadal masz jakiś problem.

0

Nie przeszukuj całej planszy.
W momencie wstawienia znaku: plansza[i][j] = 'x'; szukaj takich samych w każdym z kierunków
ilość sztuk 'x' wlewo plus ilość sztuk 'x' wprawo plus jeden dadzą ilość 'x' w poziomie.

0

Mógłby ktoś wytlumaczyc dlaczego po wprowadzeniu x wyskakuje od razu printf (jak by nie bralo pod uwage tego warunku (v = 3)?
To jest tylko taki prototyp chce po prostu dojsc do tego jak znajdować te 5 znaków chociaz w 1 linii.

 
void ruch_gracza1(char plansza[15][15])
{
	unsigned int i = 15, j;
	int v = 1;
	wypisz(plansza);
	printf("\nPodaj wiersz i kolumne w ktorej chcesz wstawic krzyzyk\n");
	while ((i>14) || (j>14) || (plansza[i][j] != ' '))
		scanf_s("%u %u", &i, &j);
	plansza[i][j] = 'x';
	// w pionie
	for (i = 1; i <= 15; i++);
	{
		if (plansza[i - 1][j] == 'x' && plansza[i][j] == 'x')
			v++;
		else
			v = 1;
	}
	if (v = 2)
	{
		printf("wygral gracz x");
		system("pause");
	}
		
0

if (v = 2) - jak się porównuje wartości w C/C++ ?

0

Jeśli to ma być tak: if (v == 2). Dalej nie działa :/

0

for (i = 1; i <= 15; i++); - to też błąd.

Poza tym sprawdzasz tylko w jednym kierunku, zaś ma być w 8 kierunkach.

0

no tak o tych kierunkach wiem tylko chce na razie 1 dobrze zrobic :)
for (i = 1; i <= 15; i++); a w tym chodzi tylko o to że ma się zaczynać od zera czyli for (i = 0; i < 15; i++); ?

0

Doszedłem do tego:

 
for (i = 0; i < 15; i++)
	{
		for (j = 0; j < 15; j++)
		{
			if (plansza[i - 1][j] == 'x' && plansza[i][j] == 'x')
				v++;
		}
	}
		printf("%d\n", v); // tylko do sprawdzania ile wynosi v
		system("pause");
		if (v == 5)
		{
			printf("wygral gracz x\n");
			system("pause");
		}
}

tylko teraz pojawił się taki problem że gdy ustawie w 5 różnych miejscach 2 "krzyżyki" obok siebie też v wynosi 5 i sygnalizuje wygrana.

0

Teraz odszukaj moją pierwszą podpowiedź w tym temacie i powiedz którego słowa nie rozumiesz.

0

To tez nie działa :/

if ((v >= 5) && (plansza[i - 2][j] == 'x') && (plansza[i - 1][j] == 'x') && (plansza[i][j] == 'x') && (plansza[i + 1][j] == 'x') && (plansza[i + 2][j] == 'x'))
0

Co myślicie o tym ?

void ruch_gracza1(char plansza[15][15])
{
	unsigned int i = 15, j;
	int v = 1, z;
	wypisz(plansza);
	printf("\nPodaj wiersz i kolumne w ktorej chcesz wstawic krzyzyk\n");
	while ((i>14) || (j>14) || (plansza[i][j] != ' '))
		scanf_s("%u %u", &i, &j);
	plansza[i][j] = 'x';

	// w pionie

	for (i = 0; i < 15; i++)
	{
		for (j = 0; j < 15; j++)
		{
			if (plansza[i - 2][j] == 'x' && plansza[i - 1][j] == 'x' && plansza[i][j] == 'x' && plansza[i + 1][j] == 'x' && plansza[i + 2][j] == 'x')
				v++;
		}
		if (v == 2)
		{
			printf("wygral gracz x\n");
			exit(0);
		}
	}

	// w poziomie

	for (i = 0; i < 15; i++)
	{
		for (j = 0; j < 15; j++)
		{
			if (plansza[i][j - 2] == 'x' && plansza[i][j - 1] == 'x' && plansza[i][j] == 'x' && plansza[i][j + 1] == 'x' && plansza[i][j + 2] == 'x')
				v++;
		}
		if (v == 2)
		{
			printf("wygral gracz x\n");
			exit(0);
		}
	}

	// po przekatnej (z dolu do gory)

	for (i = 0; i < 15; i++)
		for (j = 0; j < 15; j++)
		{
			for (z = 1; z < 5; z++)
		{
				if (plansza[i + z - 2][j + z - 2] == 'x' && plansza[i + z - 1][j + z - 1] == 'x' && plansza[i + z][j + z] == 'x' && plansza[i + z + 1][j + z + 1] == 'x' && plansza[i + z + 2][j + z + 2] == 'x')
				v++;
		}
		if (v == 2)
		{
			printf("wygral gracz x\n");
			exit(0);
		}
	}

	// po przekatnej (z gory do dolu)

		for (i = 0; i < 15; i++)
		for (j = 0; j < 15; j++)
		{
			for (z = 1; z < 5; z++)
			{
				if (plansza[i + z - 2][j - z + 2] == 'x' && plansza[i + z - 1][j - z + 1] == 'x' && plansza[i + z][j - z] == 'x' && plansza[i + z + 1][j - z - 1] == 'x' && plansza[i + z + 2][j - z - 2] == 'x')
					v++;
			}
			if (v == 2)
			{
				printf("wygral gracz x\n");
				exit(0);
			}
		}
}
0

Wyłazisz poza zakres tablicy

0

Jeszcze 1:) gdy wpiszę zamiast kordów jakiś znak to się włącza jakaś pętla, jakieś wskazówki ?

W tym momencie to wygląda tak: tylko z 1 skanowaniem w pionie

void ruch_gracza1(char plansza[15][15])
{
	unsigned int i = 15, j;
	int v = 1, z, p;
	wypisz(plansza);
	printf("\n\tPodaj wiersz i kolumne w ktorej chcesz wstawic krzyzyk:");
	while ((i > 14) || (j > 14) || (plansza[i][j] != ' '))
	{
		printf("\n\t\tx: ");
		scanf_s("%u", &j);
		printf("\t\ty: ");
		scanf_s("%u", &i);
		if ((i > 14) || (j > 14))
			printf("\n\tZle kordy. Wprowadz ponownie:");
		if ((i < 15) && (j < 15) && (plansza[i][j] != ' '))
			printf("\n\tTo pole jest zajete. Wprowadz ponownie kordy:");
	}
	plansza[i][j] = 'x';

	// skanowanie tabliwy w poszukiwaniu 5 'x' w 1 lini
	// w pionie

	for (i = 0; i < 15; i++)
	{
		for (j = 0; j < 15; j++)
		{
			if (plansza[i - 2][j] == 'x' && plansza[i - 1][j] == 'x' && plansza[i][j] == 'x' && plansza[i + 1][j] == 'x' && plansza[i + 2][j] == 'x')
				v++;
		}
		if (v == 2)
		{
			printf("\t\t\twygral gracz x!\n");
			printf("\t\twbierz 1 aby zaczac gre od nowa\n");
			printf("\t\twybierz 2 aby zakonczyc\n\t\t");
			scanf_s("%d", &p);
			switch (p)
			{
			case 1:
				main();
			case 2:
				exit(0);
			}

		}
	}
1

Bo to co robisz nie ma nić wspólnego z tym co trzeba zrobić. Teraz już wiem niczego nie udawałeś:

int licz(char plansza[15][15],int y,int x,int dy,int dx)
  {
   int count=-1;
   for(char z=plansza[y][x];(0<=y)&&(y<15)&&(0<=x)&&(x<15)&&(plansza[y][x]==z);y+=dy,x+=dx) ++count;
   return count;
  }

plansza[i][j] = 'x';
if
  (
   (licz(plansza,i,j,-1,0)+licz(plansza,i,j,1,0)+1>=5)||
   (licz(plansza,i,j,0,-1)+licz(plansza,i,j,0,1)+1>=5)||
   (licz(plansza,i,j,-1,1)+licz(plansza,i,j,1,-1)+1>=5)||
   (licz(plansza,i,j,1,-1)+licz(plansza,i,j,-1,1)+1>=5)
  ) printf("\t\t\twygral gracz x!\n");
0

Dzięki za napisanie tego kawałka ale nie rozumiem go, może w przyszłości zrozumie i się będę śmiał tak jak Ty z tego co napisałem :) Swój problem rozwiązałem czyszcząc buffor klawiatury przed wprowadzeniem kordów funkcją fflush(stdin);

0

@creed a rozwiązałeś już swój problem z wychodzeniem poza tablicę? Bo przecież to że ten program się nie wysypuje to jest tylko szczęśliwy zbieg okoliczności...
Swoja drogą ciekawi mnie czy napisałbyś ten kod tak samo gdyby plansza była rozmiaru N na M i K w jednej linii wygrywa, a wartości N, M, K są podawane przy starcie programu przez użytkownika...

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