2013-08-05 15 views
8

Przygotowuję grę Checkers do zadania. Cała sprawa przebiega tak, jak powinna, z wyjątkiem jednej dziwnej rzeczy. Oto moja płyta:Gra w warcaby: Nie błąd sprawdzanie poprawnie?

Checkers Board

przenieść dając wiersz źródłowy i kolumną, wówczas wiersz docelowy i kolumny.

move(int srcR, int srcC, int destR, int destC) 

Mam wydrukować błąd, jeśli spróbuję przenieść element do nieprawidłowego miejsca (nie po skosie). Więc jeśli spróbuję przenieść element z 5 2 -> 4 2, otrzymuję komunikat o błędzie.

if(destR == srcR+1 || destR == srcR-1 && 
    destC == srcC+1 || destC == srcC-1){ 
     // code code code 
}else 
    message = "Invalid Move! Can only move diagonally one space."; 

Dla większości rzeczy, to działa, ale gdy próbuję przenieść bezpośrednio w dół o jedno miejsce (na przykład 2 3 -> 3 3) to rusza kawałek i nie daje mi komunikat o błędzie.

Utknąłem! Jakieś pomysły, dlaczego tak się dzieje? W razie potrzeby mogę dodać więcej kodu.

+0

Czy ważne ruchy zależą od tego, który kolor się porusza? – arshajii

+1

@ErikPragt, który nigdy nie zostanie zatwierdzony, ponieważ destR nie może równać się srcR +/- 1 w tym samym czasie. – Deactivator2

+0

desrR nie może być == srcR + 1 && srcR-1 –

Odpowiedz

7

Według logiki, jeśli

destC == srcC-1 

jest prawdą, cała wyrażenie będzie prawdziwe. Musisz zwrócić uwagę na kolejność, w której Java ocenia operacje boolowskie ~ Dodaj() w razie potrzeby ~

+0

Masz rację! Inny zestaw nawiasów poprawił go. Dzięki! – alundy

+0

dziękuję za edycję @arshajii –

5

To jest dość proste, jak sądzę. Są tylko cztery dozwolone ruchy.

int deltaX = Math.abs(srcR - destR); 
int deltaY = Math.abs(srcC - destC); 
boolean validMove = deltaX == 1 && deltaY == 1; 

Oczywiście ta kontrola umożliwia ruchy do tyłu. Ale kierunek ruchu w tył zależy od koloru gry, a promowanie utworu następuje poprzez dotarcie do drugiego końca.

+2

+1 O wiele jaśniej jest o tym myśleć w kategoriach 'dx' i' dy'. – arshajii

2

Twoje wyrażenie logiczne jest nieprawidłowe.

zobacz Java operators precedence.

W razie wątpliwości zawsze używać nawiasów:

if((destR == srcR+1 || destR == srcR-1) && 
    (destC == srcC+1 || destC == srcC-1)) 
+0

Ups! Powinienem był to zauważyć. Dodatkowe nawiasy to naprawiły. Dzięki! – alundy

2
if(destR == srcR+1 || destR == srcR-1 && destC == srcC+1 || destC == srcC-1) 

myślę, że trzeba pewne nawiasów tu, jak ta ocena jest trudne ponieważ starasz się porównać dwa wyrażenia naraz. Spróbuj

if((destR == srcR+1 || destR == srcR-1) && (destC == srcC+1 || destC == srcC-1)) 

ten sposób, jeśli (destR = srcR +/- 1) i (destC = SRCC +/- 1), ruch jest ważny.

Oryginalny sposób zadziałałby na niektóre czasu, ponieważ Boolean Java porównuje dwa wyrażenia lub wynik poprzedniego i następnego.

1
if(destR == srcR+1 || destR == srcR-1 && destC == srcC+1 || destC == srcC-1) 

odpowiada

if(destR == srcR+1 || (destR == srcR-1 && destC == srcC+1) || destC == srcC-1) 

W drugim przykładzie:

srcR = 2 
srcC = 3 
destR = 3 
destC = 3 

destr (= 3) jest równa srcR (= 2) + 1 =>destR == srcR+1 jest prawda => ocena (destR == srcR+1 || (destR == srcR-1 && destC == srcC+1) || destC == srcC-1) jest true.

Aby rozwiązać problem, trzeba zmienić swoje oświadczenie if do:

if((destR == srcR+1 || destR == srcR-1) && (destC == srcC+1 || destC == srcC-1)) 
3

To wygląda dobrze. Właśnie zapomniałeś dodać nawias zamykający wokół instrukcji złożonej, jeśli. Tak więc powraca to prawda, kiedy nie powinno.

Powiązane problemy