2013-08-05 27 views
8

Tôi đang thực hiện trò chơi Cờ đam cho bài tập. Toàn bộ điều đang chạy theo cách nó nên, ngoại trừ một điều kỳ lạ. Dưới đây là bảng của tôi:Checkers Trò chơi: Không kiểm tra lỗi chính xác?

Checkers Board

tôi di chuyển bằng cách cho dòng nguồn và cột, sau đó hàng đích và cột.

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

Tôi phải in ra một lỗi nếu tôi cố gắng di chuyển một mảnh đến vị trí không hợp lệ (không theo đường chéo). Vì vậy, nếu tôi cố gắng di chuyển một mảnh từ 5 2 -> 4 2, nó mang lại cho tôi một thông báo lỗi.

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."; 

Vì hầu hết mọi thứ hoạt động, nhưng nếu tôi cố di chuyển trực tiếp xuống một khoảng trống (ví dụ, 2 3 -> 3 3), nó sẽ di chuyển mảnh và không cho tôi thông báo lỗi.

Tôi bị kẹt! Bất kỳ ý tưởng nào tại sao điều này có thể xảy ra? Tôi có thể đăng thêm mã nếu cần.

+0

Không di chuyển hợp lệ phụ thuộc vào màu sắc đang di chuyển? – arshajii

+1

@ErikPragt sẽ không bao giờ xác nhận, vì destR không thể bằng cả srcR +/- 1 cùng một lúc. – Deactivator2

+0

desrR không thể == srcR + 1 && srcR-1 –

Trả lời

7

Theo logic của bạn, nếu

destC == srcC-1 

là sự thật, toàn bộ biểu hiện sẽ là sự thật. Bạn phải chú ý đến thứ tự mà Java đánh giá các hoạt động boolean ~ Add() khi cần thiết ~

+0

Bạn nói đúng! Một bộ ngoặc đơn cố định nó. Cảm ơn! – alundy

+0

cảm ơn bạn đã chỉnh sửa @arshajii –

5

Nó khá đơn giản, tôi nghĩ vậy. Chỉ có bốn động tác được phép.

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

Tất nhiên, kiểm tra này cho phép di chuyển lùi. Nhưng hướng di chuyển lạc hậu phụ thuộc vào màu sắc chơi và thời tiết được thúc đẩy bằng cách đạt đến đầu kia.

+2

+1 Sẽ rõ ràng hơn khi nghĩ về nó về 'dx' và 'dy'. – arshajii

2

Biểu thức logic của bạn là sai.

hãy xem Java operators precedence.

Nếu nghi ngờ luôn luôn sử dụng dấu ngoặc:

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

Rất tiếc! Tôi nên chú ý. Các dấu ngoặc bổ sung cố định nó. Cảm ơn! – alundy

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

Tôi nghĩ rằng bạn cần một số dấu ngoặc ở đây, như đánh giá này là khó khăn kể từ khi bạn đang cố gắng để so sánh hai biểu thức cùng một lúc. Hãy thử

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

Bằng cách này, nếu (destR = srcR +/- 1) AND (destC = srcC +/- 1), di chuyển hợp lệ.

Cách ban đầu sẽ hoạt động một số thời gian, vì boolean Java so sánh hai biểu thức hoặc kết quả của biểu thức trước đó và biểu thức tiếp theo.

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

tương đương với

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

Trong ví dụ thứ hai của bạn:

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

destr (= 3) là tương đương với srcR (= 2) + 1 =>destR == srcR+1đúng => đánh giá của (destR == srcR+1 || (destR == srcR-1 && destC == srcC+1) || destC == srcC-1)đúng.

Để khắc phục vấn đề của bạn, bạn cần thay đổi tuyên bố if của bạn để:

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

Nó có vẻ tốt. Bạn chỉ cần quên thêm dấu đóng ngoặc xung quanh hợp chất nếu câu lệnh. Vì vậy, nó trở lại đúng khi nó không nên.

Các vấn đề liên quan