cuốn sách gpt4 ai đã làm

Java: Nối 4 đường chéo chiến thắng

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-02 08:43:06 28 4
mua khóa gpt4 Nike

Gần đây tôi đã tạo một trò chơi Connect4 và Connect4 của tôi không thắng trò chơi khi được kết nối theo đường chéo bên phải. Và nó chỉ hoạt động trong một số kết hợp nhất định khi được kết nối với đường chéo bên trái. Tọa độ:- Góc trên bên trái: (0,0), góc dưới bên trái: (5,0), góc trên bên phải: (0,6), góc dưới bên phải: (5,6). Bảng Connect4 có kích thước 6 x 7.

câu hỏi:Kết nối theo đường chéo sang trái chỉ hoạt động đối với một số kết hợp nhất định. Tuy nhiên, không có kết nối nào được kết nối theo đường chéo hoạt động chính xác.

/** Cách thắng chéo về bên trái khi chơi nối 4 hai người*/
/** Đưa ra phương pháp mới với tất cả các khả năng có thể để người dùng giành chiến thắng theo đường chéo trái */
public static void diagWinningLeft() {
for (int x = 5; x > 2; x--) { // Kiểm tra xem các chốt cùng màu có xếp chéo sang trái không
for (int y = 6; y > 3; y--) {
if (board[x][y] == 1 && board[x - 1][y - 1] == 1 && board[x - 2][y - 2] == 1 && board[x - 3][ y - 3] == 1) {
JOptionPane.showMessageDialog(null, playerNames[0]+" đã kết nối bốn đường chéo trái liên tiếp trong lượt " +(countForRed)+ "!");
b.drawLine(x,y,x-3,y-3);
}
if (board[x - 1][y - 1] == 1 && board[x - 2][y - 2] == 1 && board[x - 3][y - 3] == 1 && board[x - 4][y - 4] == 1) {
JOptionPane.showMessageDialog(null, playerNames[0]+" đã kết nối bốn đường chéo trái liên tiếp trong lượt " +(countForRed)+ "!");
b.drawLine(x,y,x-3,y-3);
}

if (board[x][y] == 2 && board[x - 1][y - 1] == 2 && board[x - 2][y - 2] == 2 && board[x - 3][ y - 3] == 2) {
JOptionPane.showMessageDialog(null, playerNames[1]+ " đã kết nối bốn đường chéo trái liên tiếp trong lượt " +(countForYellow)+ "!");
b.drawLine(x,y,x-3,y-3);
}
}
}
}

/** Một phương pháp khác để giành chiến thắng theo đường chéo về phía bên phải khi chơi nối 4 hai người chơi*/
/** Đưa ra phương pháp mới với tất cả các khả năng có thể để người dùng giành chiến thắng theo đường chéo-phải*/
public static void diagWinningRight() {
for (int x = 0; x < 2; x++) { // Kiểm tra xem các chốt cùng màu có xếp chéo sang bên phải không
vì (int y = 0; y < 3; y++) {
if (board[x][y] == 1 && board[x + 1][y + 1] == 1 && board[x + 2][y + 2] == 1 && board[x + 3][ y + 3] == 1) {
JOptionPane.showMessageDialog(null, playerNames[0]+" đã kết nối bốn đường chéo bên phải liên tiếp trong lượt " +(countForRed)+ "!");
}
if (board[x][y] == 2 && board[x + 1][y + 1] == 2 && board[x + 2][y + 2] == 2 && board[x + 3][ y + 3] == 2) {
JOptionPane.showMessageDialog(null, playerNames[1]+" đã kết nối bốn đường chéo bên phải liên tiếp trong các lượt " +(countForYellow)+ "!");
}

}
}
}

câu trả lời hay nhất

Xin hãy tha thứ cho tôi vì đã không trả lời trực tiếp câu hỏi, nhưng nội dung này có thể giúp bạn giải quyết vấn đề và cuối cùng nhận được mã tốt hơn cũng như khả năng viết mã tốt hơn trong tương lai.

Việc trích xuất logic của điều kiện "if" thành một phương thức riêng biệt giúp bạn dễ dàng nghĩ ra logic đó một cách riêng biệt và cho phép bạn kiểm tra nó một cách độc lập với phần còn lại của chương trình.

Vì vậy, thay vào đó:

  if (board[x][y] == 1 && board[x - 1][y - 1] == 1 && board[x - 2][y - 2] == 1 && board[x - 3][ y - 3] == 1) {
JOptionPane.showMessageDialog(...)
}

...sử dụng:

 if(isDiagonalLeft(x,y,1) { ... }

...Và...

 boolean isDiagonalLeft(int x, int y, int player) {
bảng quay lại[x] [y] == người chơi &&
board[x - 1][y - 1] == người chơi &&
board[x - 2][y - 2] == người chơi &&
bảng[x - 3][y - 3] == người chơi
}

Bây giờ bạn có thể chạy trên isDiagonalLeft()Kiểm tra đơn vịđể đảm bảo nó hoạt động tốt. Nói cách khác, một chương trình nhỏ để thiết lập bàn cờ 只是 Chạy isDiagonalLeft() để đảm bảo nó đưa ra câu trả lời đúng trong từng tình huống. Có cảm giác như phải làm thêm, nhưng hầu hết những người đã thử đều biết rằng nó giúp tiết kiệm công sức bằng cách phát hiện lỗi sớm.

Những gì bạn làm là tách logic trò chơi khỏi mã trình bày (JOptionPane) một chút để mã trình bày không gây cản trở khi bạn chỉ muốn chạy logic trò chơi. Sau này trong quá trình nghiên cứu lập trình, bạn sẽ gặp các cách để tách chúng ra xa hơn, chẳng hạn như mô hình Model - View - Controller.

Nếu bạn cần đặt câu hỏi trên Stack Overflow, việc trích xuất logic như thế này cũng rất hữu ích - bằng cách tách logic trò chơi khỏi Swing, bạn mở câu hỏi cho những người trả lời tiềm năng không biết gì về Swing.

Ngoài ra, bạn có thể sử dụng lại phương pháp này, một lần cho mỗi người chơi, thay vì sao chép logic sang hai nơi như bạn đã làm.

Nếu nó không hoạt động, hãy sử dụngtrình gỡ lỗiHãy làm việc theo cách của bạn để vượt qua nó.

Bây giờ bạn đã hoàn thành bước này, bạn có thể cải tiến phương pháp để máy tính thực hiện việc giảm dần thay cho người lập trình...

  boolean isDiagonalLeft(int x, int y, int player) {
for(int i = 0; i<4; i++) {
if(board[xi][yi] != player) {
trả về sai;
}
}
trả về đúng sự thật;
}

...bạn có thể khái quát nó để nó bao phủ cả hai hướng của đường chéo:

  boolean isDiagonal(int x, int y, int player, boolean Direction) {
int dirUnit = hướng ? -1 : 1;
for(int i = 0; i<4; i++) {
if(board[xi][y + dirUnit] != player) {
trả về sai;
}
}
trả về đúng sự thật;
}

...vì vậy bây giờ bạn có thể sử dụng lại phương pháp này ở 4 nơi cho mỗi người chơi và mỗi hướng.

Khi bạn gặp phải tình huống nó không hoạt động trong GUI của bạn, hãy làm bài kiểm tra đơn vị, thiết lập bo mạch theo cách nó hoạt động trong GUI và chạy nó trên isDiagonal() .Nếu bài kiểm tra thành công, bạn biết vấn đề nằm ở chỗ khác. Nếu thử nghiệm thất bại, bạn có thể sử dụng trình gỡ lỗi và mã phương thức để vượt qua.

Về Java: Connect 4 Winning Diagonal, chúng tôi tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/30905138/

28 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress