利用javafx写一个简单的2048小游戏

我比较菜,代码没有设置良好的游戏结束语句,只要面板内没有空白方格,就会提示游戏结束(但是你还可以继续移动,不会强制结束游戏)。游戏界面也不美观…

在这里插入图片描述
游戏界面代码

package sample;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.text.Font;
import javafx.stage.Stage;

public class Main extends Application {


        Controller a=new Controller();
        Button[] but = new Button[5];
        Label[][] lab = new Label[4][4];
        TextField ta=new TextField();
        Label scor=new Label("得分:");

        @Override
        public void start(Stage primaryStage) throws Exception{
            a.zonelocat();
            try {

                heti();
                but[0] = new Button("上");
                but[1] = new Button("下");
                but[2] = new Button("左");
                but[3] = new Button("右");
                but[4] = new Button("开始");
                but[0].setOnAction((ActionEvent arg0) -> up());
                but[1].setOnAction((ActionEvent arg0) -> down());
                but[2].setOnAction((ActionEvent arg0) -> left());
                but[3].setOnAction((ActionEvent arg0) -> right());
                but[4].setOnAction((ActionEvent arg0) -> begin());
                but[0].setPrefSize(100, 50);
                but[1].setPrefSize(100, 50);
                but[2].setPrefSize(100, 50);
                but[3].setPrefSize(100, 50);
                but[4].setPrefSize(200, 50);
                GridPane root = new GridPane();
                for (int i = 1; i < 5; i++) {
                    for (int ii = 0; ii < 4; ii++) {
                        root.add(lab[i-1][ii], ii, i);
                    }
                }
                root.add(scor,1,0);
                root.add(ta,2,0,2,1);
                root.add(but[0], 0, 5);
                root.add(but[1], 1, 5);
                root.add(but[2], 2, 5);
                root.add(but[3], 3, 5);
                root.add(but[4],1,6,2,1);
                root.setGridLinesVisible(true);
                Scene scene = new Scene(root, 400, 500);

                primaryStage.setScene(scene);
                primaryStage.show();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        void heti(){
            for (int i = 0; i < 4; i++) {
                for (int ii = 0; ii < 4; ii++) {
                    lab[i][ii] = new Label(a.data[i][ii] + "");
                    lab[i][ii].setPrefSize(100, 100);
                    //lab[i][ii].setPadding(new Insets(40));
                    lab[i][ii].setAlignment(Pos.CENTER);
                    lab[i][ii].setFont(new Font(40));
                }
            }
        }

        void change() {
            for (int i = 0; i < 4; i++)
                for (int ii = 0; ii < 4; ii++){
                    lab[i][ii].setText(a.data[i][ii] + "");
                    if(a.data[i][ii]==0)
                        lab[i][ii].setStyle("-fx-background-color:#334455");
                    else if(a.data[i][ii]==2)
                        lab[i][ii].setStyle("-fx-background-color:green");
                    else if(a.data[i][ii]==4)
                        lab[i][ii].setStyle("-fx-background-color:yellow");
                    else if(a.data[i][ii]==8)
                        lab[i][ii].setStyle("-fx-background-color:tomato");
                    else if(a.data[i][ii]==16)
                        lab[i][ii].setStyle("-fx-background-color:gold");
                    else if(a.data[i][ii]==32)
                        lab[i][ii].setStyle("-fx-background-color:cyan");
                    else if(a.data[i][ii]==64)
                        lab[i][ii].setStyle("-fx-background-color:orange");
                    else if(a.data[i][ii]==128)
                        lab[i][ii].setStyle("-fx-background-color:silver");
                    else if(a.data[i][ii]==256)
                        lab[i][ii].setStyle("-fx-background-color:pink");
                    else if(a.data[i][ii]==512)
                        lab[i][ii].setStyle("-fx-background-color:magenta");
                    else if(a.data[i][ii]==1024)
                        lab[i][ii].setStyle("-fx-background-color:#ff1111");
                    else
                        lab[i][ii].setStyle("-fx-background-color:red");
                }
        }

        void up() {
            a.up();
            change();
            ta.setText(a.score+"");
        }
        void down() {
            a.down();
            change();
            ta.setText(a.score+"");
        }
        void left() {
            a.left();
            change();
            ta.setText(a.score+"");
        }
        void right() {
            a.right();
            change();
            ta.setText(a.score+"");
        }
        void begin(){
            a.queding();
            a.queding();
            change();
            ta.setText(a.score+"");
        }


    public static void main(String[] args) {
        launch(args);
    }
}

后台数据处理部分

package sample;

import java.util.LinkedList;
import java.util.Random;

public class Controller {
    int[][] data = new int[4][4];
    private LinkedList<Integer> locate = new LinkedList<Integer>();
    private LinkedList<Integer> row = new LinkedList<Integer>();
    Random ran = new Random();
    int score=0;
    int create() {
        int a = ran.nextInt(4);
        if (a > 2)
            return 4;
        else
            return 2;
    }

    private int location() {
        int w = locate.size();
//      System.out.println(w);
        int a = ran.nextInt(w);
        int x = locate.remove(a);
        return x;
    }

    void queding() {
        int l = location();
        int x = l / 4;
        int y = l % 4;
        int d = create();
        data[x][y] = d;
    }

    void up() {
        for (int i = 0; i < 4; i++) {

            for (int ii = 0; ii < 4; ii++) {
                row.add(data[ii][i]);
                data[ii][i] = 0;
            }
            for (int w = 0; w < row.size(); )
                if (row.get(w).equals(0))
                    row.remove(w);
                else
                    w++;


            for (int w = 0; w < row.size() - 1; )
                if (row.get(w).equals(row.get(w + 1))) {
                    row.set(w, row.get(w) * 2);
                    score+=row.get(w);
                    if (row.get(w)==1024){
                        System.out.println("通关,您的分数为:"+score);
                    }
                    row.remove(w + 1);
                } else
                    w++;

            int q = 0;
            for (int w : row) {
                data[q][i] = w;
                q++;
            }
            row.clear();

        }
        locate.clear();
        zonelocat();
        if(panding())
            queding();
        else
            System.out.println("游戏结束");
    }

    void down() {
        for (int i_ = 0; i_ < 4; i_++) {
            for (int ii = 0; ii < 4; ii++) {
                row.add(data[ii][i_]);
                data[ii][i_] = 0;
            }
            for (int w = 0; w < row.size(); )
                if (row.get(w).equals(0))
                    row.remove(w);
                else
                    w++;

            for (int w = 0; w < row.size() - 1; )
                if (row.get(w).equals(row.get(w + 1))) {
                    row.set(w, row.get(w) * 2);
                    score+=row.get(w);
                    if (row.get(w)==1024){
                        System.out.println("通关,您的分数为:"+score);
                    }
                    row.remove(w + 1);
                } else
                    w++;

            int q = 4-row.size();
            for (int w : row) {
                data[q][i_] = w;
                q++;
            }
            row.clear();

        }
        locate.clear();
        zonelocat();
        if(panding())
            queding();
        else
            System.out.println("游戏结束");

    }

    void left() {
        for (int i_ = 0; i_ < 4; i_++) {
            for (int ii = 0; ii < 4; ii++) {
                row.add(data[i_][ii]);
                data[i_][ii] = 0;
            }
            for (int w = 0; w < row.size(); )
                if (row.get(w).equals(0))
                    row.remove(w);
                else
                    w++;

            for (int w = 0; w < row.size() - 1; )
                if (row.get(w).equals(row.get(w + 1))) {
                    row.set(w, row.get(w) * 2);
                    score+=row.get(w);
                    if (row.get(w)==1024){
                        System.out.println("通关,您的分数为:"+score);
                    }
                    row.remove(w + 1);
                } else
                    w++;

            int q = 0;
            for (int w : row) {
                data[i_][q] = w;
                q++;
            }
            row.clear();
        }
        locate.clear();
        zonelocat();
        if(panding())
            queding();
        else
            System.out.println("游戏结束");

    }

    void right() {
        for (int i_ = 0; i_ < 4; i_++) {
            for (int ii = 0; ii < 4; ii++) {
                row.add(data[i_][ii]);
                data[i_][ii] = 0;
            }
            for (int w = 0; w < row.size(); )
                if (row.get(w).equals(0))
                    row.remove(w);
                else
                    w++;

            for (int w = 0; w < row.size() - 1; )
                if (row.get(w).equals(row.get(w + 1))) {
                    row.set(w, row.get(w) * 2);
                    score+=row.get(w);
                    if (row.get(w)==1024){
                        System.out.println("通关,您的分数为:"+score);
                    }
                    row.remove(w + 1);
                } else
                    w++;

            int q = 4-row.size();
            for (int w : row) {
                data[i_][q] = w;
                q++;
            }
            row.clear();

        }
        locate.clear();
        zonelocat();
        if(panding())
            queding();
        else
            System.out.println("游戏结束");
    }

    void zonelocat() {
        for (int i = 0; i < 4; i++)
            for (int ii = 0; ii < 4; ii++)
                if (data[i][ii] == 0)
                    locate.add(i * 4 + ii);
    }

    boolean panding(){
        return locate.size() != 0;
    }
}

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单JavaFx俄罗斯方块的实现: ```java import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.layout.BorderPane; import javafx.scene.paint.Color; import javafx.stage.Stage; public class Tetris extends Application { private static final int WIDTH = 300; // 画布宽度 private static final int HEIGHT = 600; // 画布高度 private static final int BLOCK_SIZE = 30; // 方块大小 private static final int ROWS = HEIGHT / BLOCK_SIZE; // 行数 private static final int COLS = WIDTH / BLOCK_SIZE; // 列数 private int[][] board = new int[ROWS][COLS]; // 游戏区域 private int[][][] shapes = { // 方块形状 { { 0, 1, 1 }, { 1, 1, 0 } }, // Z { { 1, 1, 0 }, { 0, 1, 1 } }, // S { { 1, 1, 1, 1 } }, // I { { 1, 1, 1 }, { 0, 1, 0 } }, // T { { 1, 1 }, { 1, 1 } }, // O { { 1, 0, 0 }, { 1, 1, 1 } }, // L { { 0, 0, 1 }, { 1, 1, 1 } } // J }; private int shapeIndex; // 当前方块的形状 private int row; // 当前方块的行数 private int col; // 当前方块的列数 private boolean isGameOver; // 是否结束游戏 private Canvas canvas; // 画布对象 private GraphicsContext gc; // 画笔对象 @Override public void start(Stage primaryStage) throws Exception { canvas = new Canvas(WIDTH, HEIGHT); gc = canvas.getGraphicsContext2D(); BorderPane root = new BorderPane(); root.setCenter(canvas); Scene scene = new Scene(root); scene.setOnKeyPressed(e -> { switch (e.getCode()) { case LEFT: moveLeft(); break; case RIGHT: moveRight(); break; case DOWN: moveDown(); break; case UP: rotate(); break; default: break; } }); primaryStage.setScene(scene); primaryStage.setTitle("Tetris"); primaryStage.setResizable(false); primaryStage.show(); new Thread(() -> { while (!isGameOver) { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } moveDown(); } }).start(); } /** * 游戏结束 */ private void gameOver() { isGameOver = true; } /** * 是否能够移动 * * @param shape 形状 * @param row 行数 * @param col 列数 * @return */ private boolean canMove(int[][] shape, int row, int col) { for (int i = 0; i < shape.length; i++) { for (int j = 0; j < shape[i].length; j++) { if (shape[i][j] == 1) { int r = row + i; int c = col + j; if (r < 0 || r >= ROWS || c < 0 || c >= COLS || board[r][c] == 1) { return false; } } } } return true; } /** * 绘制游戏区域 */ private void drawBoard() { gc.setFill(Color.WHITE); gc.fillRect(0, 0, WIDTH, HEIGHT); gc.setStroke(Color.GRAY); for (int i = 0; i <= ROWS; i++) { gc.strokeLine(0, i * BLOCK_SIZE, WIDTH, i * BLOCK_SIZE); } for (int i = 0; i <= COLS; i++) { gc.strokeLine(i * BLOCK_SIZE, 0, i * BLOCK_SIZE, HEIGHT); } gc.setFill(Color.BLACK); for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { if (board[i][j] == 1) { gc.fillRect(j * BLOCK_SIZE, i * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE); } } } } /** * 绘制方块 * * @param shape 形状 * @param row 行数 * @param col 列数 */ private void drawShape(int[][] shape, int row, int col) { gc.setFill(Color.BLACK); for (int i = 0; i < shape.length; i++) { for (int j = 0; j < shape[i].length; j++) { if (shape[i][j] == 1) { gc.fillRect((col + j) * BLOCK_SIZE, (row + i) * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE); } } } } /** * 移动左边 */ private void moveLeft() { if (canMove(shapes[shapeIndex], row, col - 1)) { col--; drawBoard(); drawShape(shapes[shapeIndex], row, col); } } /** * 移动右边 */ private void moveRight() { if (canMove(shapes[shapeIndex], row, col + 1)) { col++; drawBoard(); drawShape(shapes[shapeIndex], row, col); } } /** * 移动下边 */ private void moveDown() { if (canMove(shapes[shapeIndex], row + 1, col)) { row++; drawBoard(); drawShape(shapes[shapeIndex], row, col); } else { // 当前方块无法移动,落下 int[][] shape = shapes[shapeIndex]; for (int i = 0; i < shape.length; i++) { for (int j = 0; j < shape[i].length; j++) { if (shape[i][j] == 1) { int r = row + i; int c = col + j; board[r][c] = 1; } } } // 计算得分 int score = 0; for (int i = 0; i < ROWS; i++) { int count = 0; for (int j = 0; j < COLS; j++) { if (board[i][j] == 1) { count++; } } if (count == COLS) { score++; for (int j = i; j > 0; j--) { for (int k = 0; k < COLS; k++) { board[j][k] = board[j - 1][k]; } } } } // 更新画布 drawBoard(); // 随机生成下一个方块 shapeIndex = (int) (Math.random() * shapes.length); row = -1; col = COLS / 2 - shapes[shapeIndex][0].length / 2; if (!canMove(shapes[shapeIndex], row, col)) { gameOver(); } drawShape(shapes[shapeIndex], row, col); } } /** * 旋转 */ private void rotate() { int[][] oldShape = shapes[shapeIndex]; int[][] newShape = new int[oldShape[0].length][oldShape.length]; for (int i = 0; i < oldShape.length; i++) { for (int j = 0; j < oldShape[i].length; j++) { newShape[j][oldShape.length - i - 1] = oldShape[i][j]; } } if (canMove(newShape, row, col)) { shapes[shapeIndex] = newShape; drawBoard(); drawShape(shapes[shapeIndex], row, col); } } public static void main(String[] args) { launch(args); } } ``` 这个实现中,我们使用JavaFx的Canvas和GraphicsContext来绘制游戏界面。游戏区域是一个二维数组,每个方块的状态用0或1来表示。当一个方块落下时,我们将其状态设置为1。当一行都被填满时,将其清除并计算得分。 我们使用shapes数组来存储所有方块的形状。每个方块由一个二维数组来表示,1表示方块的一部分,0表示空白。所以,我们可以将方块看作是一个矩阵,将其绘制到画布上就可以了。 在main方法中,我们启动JavaFx应用程序。在应用程序中,我们使用线程来控制方块的移动。我们使用scene.setOnKeyPressed方法来监听键盘事件,根据键盘事件来移动方块。 这个实现很简单,但是足够演示如何使用JavaFx来制作俄罗斯方块游戏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值