java面向对象拼图游戏完整示例


以下是一个简单的 Java 面向对象拼图游戏的示例代码,它包括一个 Puzzle 类和一个 Main 类,可以让用户玩一个简单的拼图游戏。

Puzzle.java:

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Puzzle {

    private final int rows;
    private final int cols;
    private int[][] board;

    public Puzzle(int rows, int cols) {
        this.rows = rows;
        this.cols = cols;
        this.board = new int[rows][cols];
        initBoard();
        shuffleBoard();
    }

    private void initBoard() {
        int counter = 1;
        for (int row = 0; row < rows; row++) {
            for (int col = 0; col < cols; col++) {
                board[row][col] = counter++;
            }
        }
        board[rows-1][cols-1] = 0; // the blank space
    }

    private void shuffleBoard() {
        List<Integer> numbers = Arrays.asList(0,1,2,3,4,5,6,7,8);
        Collections.shuffle(numbers);

        int counter = 0;
        for (int row = 0; row < rows; row++) {
            for (int col = 0; col < cols; col++) {
                board[row][col] = numbers.get(counter++);
            }
        }
    }

    public boolean isSolved() {
        int counter = 1;
        for (int row = 0; row < rows; row++) {
            for (int col = 0; col < cols; col++) {
                if (board[row][col] != counter++ % (rows*cols)) {
                    return false;
                }
            }
        }
        return true;
    }

    public void moveTile(int row, int col) {
        int blankRow = -1;
        int blankCol = -1;

        // Find the blank space
        for (int r = 0; r < rows; r++) {
            for (int c = 0; c < cols; c++) {
                if (board[r][c] == 0) {
                    blankRow = r;
                    blankCol = c;
                }
            }
        }

        // Check if the selected tile can be moved
        if ((row == blankRow && Math.abs(col - blankCol) == 1) ||
            (col == blankCol && Math.abs(row - blankRow) == 1)) {
            // Swap the selected tile with the blank space
            int temp = board[row][col];
            board[row][col] = board[blankRow][blankCol];
            board[blankRow][blankCol] = temp;
        }
    }

    public void printBoard() {
        for (int row = 0; row < rows; row++) {
            for (int col = 0; col < cols; col++) {
                System.out.print(board[row][col] + " ");
            }
            System.out.println();
        }
        System.out.println();
    }
}

Main.java:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        Puzzle puzzle = new Puzzle(3, 3);

        while (!puzzle.isSolved()) {
            puzzle.printBoard();

            System.out.print("Enter row and column of tile to move: ");
            int row = scanner.nextInt();
            int col = scanner.nextInt();

            puzzle.moveTile(row, col);
        }

Main.java(续):

System.out.println("Congratulations, you solved the puzzle!");
    }
}

这个示例代码创建了一个 Puzzle 类来表示拼图,使用一个二维数组来保存当前的拼图状态,并提供了一些方法来操作拼图。在 main 方法中,它创建了一个 3x3 的拼图对象,并让用户通过输入坐标来移动拼图上的方块,直到完成拼图。每次用户移动方块时,程序会检查移动是否有效,并打印出当前拼图的状态。当拼图完成时,程序会打印出一条恭喜信息。

当用户运行程序时,他们将看到类似以下内容的输出:

2 1 7 
0 6 8 
5 3 4 

Enter row and column of tile to move: 1 0

2 1 7 
6 0 8 
5 3 4 

Enter row and column of tile to move: 1 1

2 1 7 
6 3 8 
5 0 4 

Enter row and column of tile to move: 2 1

2 1 7 
6 3 8 
5 4 0 

Congratulations, you solved the puzzle!

这个示例只是一个基本的框架,你可以根据自己的需要扩展它,例如添加计时器,改进拼图的图形界面等。

在上面的示例中,拼图使用了一个二维数组来表示状态。这种表示方法适用于较小的拼图,但当拼图规模变得更大时,这种方法可能变得不太实用。在这种情况下,可以考虑使用其他数据结构来表示拼图,例如一个一维数组或者一个链表。

除了数据结构之外,还可以考虑使用其他算法来解决拼图问题。例如,可以使用 A* 算法来找到最优解,或者使用随机化搜索算法来解决一些难以处理的拼图。这些算法都需要更多的代码实现和更复杂的逻辑,但它们可以帮助我们处理更大、更复杂的拼图。

在实现一个拼图游戏时,我们还需要考虑到用户体验和图形界面设计。拼图游戏应该易于使用,直观且美观。用户应该能够轻松地将拼图块移动到它们想要的位置,并且能够看到拼图的进度和剩余的步骤。

总之,实现一个拼图游戏需要考虑到多个方面,包括数据结构、算法、用户体验和图形界面设计等等。上面的示例代码提供了一个基本的框架,可以根据自己的需要进行扩展和改进。


原文链接:codingdict.net