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

Czy można jakoś skrócić ten kod ?

Cloud VPS
0 głosów
662 wizyt
pytanie zadane 2 lipca 2015 w C i C++ przez Pixel040 Gaduła (3,100 p.)
Robię gre w kółko i krzyżyk. Ten fragment kodu sprawdza czy gracz wygrał.

        for(int i=0;i<3;i++)
        {

            if(((tab[0][i]=="X")&&(tab[1][i]=="X")&&(tab[2][i]=="X")) ||
               ((tab[i][0]=="X")&&(tab[i][1]=="X")&&(tab[i][2]=="X")) ||
               ((tab[0][0]=="X")&&(tab[1][1]=="X")&&(tab[2][2]=="X")) ||
               ((tab[0][2]=="X")&&(tab[1][1]=="X")&&(tab[2][0]=="X")))
            {
                cout<<"Wygral "<<gr1<<endl;
                
            }
            if(((tab[0][i]=="O")&&(tab[1][i]=="O")&&(tab[2][i]=="O")) ||
               ((tab[i][0]=="O")&&(tab[i][1]=="O")&&(tab[i][2]=="O")) ||
               ((tab[0][0]=="O")&&(tab[1][1]=="O")&&(tab[2][2]=="O")) ||
               ((tab[0][2]=="O")&&(tab[1][1]=="O")&&(tab[2][0]==" O")))
            {
                cout<<"Wygral "<<gr2<<endl;
                
            }
        }

4 odpowiedzi

+5 głosów
odpowiedź 2 lipca 2015 przez kotfuterkowy Dyskutant (9,220 p.)
edycja 3 lipca 2015 przez kotfuterkowy
Można spróbować  zrobić dwuwymiarową tablicę intów - kółko było by reprezentowane przez -1, krzyżyk przez 1. Wówczas wystarczyło by po każdym sprawdzić sumę trzech elementów danego wiersza lub kolumny. Gdy jej wartość bezwzględna była by równa 3 oznaczało by to koniec gry. Na samym początku była by wypełniona zerami. Gdy gracz z kółkiem ma ruch wybrane przez niego pole zostaje oznaczone jako -1. Gdy ten z krzyżykiem - jako 1. Należało by też napisać funkcję która wysuje planszę i jeśli w tabeli jest -1 wypisuje "O", a jeśli w tabeli jest 1 wypisuje "X".
+1 głos
odpowiedź 2 lipca 2015 przez rafal.budzis Szeryf (85,820 p.)

Można by takl ale wymagało by to innych wartości w tablicy 

for(int i=0;i<3;i++)
{
	for(int j=0;j<1;j++)
	{
		if(((tab[0][i]==j)&&(tab[1][i]==j)&&(tab[2][i]==j)) ||
		   ((tab[i][0]==j)&&(tab[i][1]==j)&&(tab[i][2]==j)) ||
		   ((tab[0][0]==j)&&(tab[1][1]==j)&&(tab[2][2]==j)) ||
		   ((tab[0][2]==j)&&(tab[1][1]==j)&&(tab[2][0]==j)))
		{
			if(j == 0)
			{
				cout<<"Wygral "<<gr1<<endl;
			}
			else
			{
				cout<<"Wygral "<<gr2<<endl;
			}
			break;//kończ petle jak ci nie potrzebna :P tyle ze tu dodałem dwie pętle więc wypadało by zrobić to na funkcji i return
		}
	}

}

ale zeby pasowało do tego co zrobiłeś to ja bym rozdzielił to tak 

if(horizontalWin('X') || verticalWin('X') || diagonalWin('X'))
{
	cout<<"Wygral "<<gr1<<endl;
}
else if(horizontalWin('O') || verticalWin('O') || diagonalWin('O'))
{
	cout<<"Wygral "<<gr2<<endl;
}
else
{
	cout<<"Remis"<<endl;
}

		
bool horizontalWin(char sign)
{
	for(int i=0;i<3;i++)
	{
		if((tab[0][i] == sign) && (tab[1][i] == sign) && (tab[2][i] == sign))
		{
			return true;
		}
	}
}

bool verticalWin(char sign)
{
	for(int i=0;i<3;i++)
	{
		if((tab[i][0] == sign) && (tab[i][1] == sign) && (tab[i][2] == sign))
		{
			return true;
		}
	}
}

bool diagonalWin(char sign)
{
	if(tab[1][1] != sign)
	{
		return false;
	}
	return ((tab[0][0] == sign) && (tab[2][2] == sign)) || ((tab[0][2] == sign) && (tab[2][0] == sign));
}

 

0 głosów
odpowiedź 2 lipca 2015 przez Pan Kulomb Pasjonat (18,630 p.)
Na pewno można, ale czy to takie potrzebne? Chcesz rozbudować grę do większej ilości pól?
komentarz 2 lipca 2015 przez kotfuterkowy Dyskutant (9,220 p.)
O większej ilości pól nie myślałem bardziej o tym by uprościć te straszne ify. Nawet kosztem napisania kilku funkcji. Kod zyska wtedy czytelność.
0 głosów
odpowiedź 3 lipca 2015 przez Gariw Użytkownik (920 p.)
edycja 3 lipca 2015 przez Gariw

Ja napisał bym taki kod:

    if((tabela[1][1] == 'X')||(tabela[1][1] == 'Y'))
        spr(tabela,tabela[1][1]);
    if(wygrana == 'Q')
        for(int i = 0; i < 3; i+=2)
        {
            if(tabela[i][i] == tabela[0][2])
                if(tabela[i][i] == tabela[i][1])
                    wygrana = tabela[i][i];
            if(tabela[i][i] == tabela[2][0])
                if(tabela[i][i] == tabela[1][i])
                    wygrana = tabela[i][i];
        }

Gdzie zmienna globalna wygrana domyślnie ma wartość Q i jest typu char. Poniżej dodaje funkcję sprawdzającą spr. 

int spr(char tab[3][3], char s)
{
    for(int i = 0; i < 2; i++)
    {
        int z = 0;
        for(int j = 2; j >= 0; j--)
        {
            if((tab[i][z] == s)&&(tab[j - i][j + z]) == s)
            {
                wygrana = s;
                break;
            }
            if(i == 1)
                break;
            z++;
        }
    }
    return 0;
}

Mam nadzieję, że pomogłem.

Podobne pytania

+1 głos
3 odpowiedzi 1,176 wizyt
pytanie zadane 15 stycznia 2021 w C i C++ przez rain.deer Początkujący (430 p.)
+1 głos
1 odpowiedź 787 wizyt
pytanie zadane 7 kwietnia 2021 w C i C++ przez Mavimix Dyskutant (8,420 p.)
0 głosów
2 odpowiedzi 190 wizyt
pytanie zadane 4 lipca 2017 w JavaScript przez `Krzychuu Stary wyjadacz (13,940 p.)

93,485 zapytań

142,417 odpowiedzi

322,765 komentarzy

62,898 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

Kursy INF.02 i INF.03
...