javafx实现五子棋游戏

这篇文章主要为大家详细介绍了javafx实现五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

需求描述

一个五子棋游戏,能实现双方黑白对决,当一方获胜时给出提示信息,利用GUI界面实现

项目结构如下图

一、实体

FiveChess类

提供五子棋实体包含的所有信息

判断游戏是否结束

play方法改变chess[][]棋盘中的数据

package entity; import javafx.scene.control.Alert; public class FiveChess{ public double getWidth() { return width; } public void setWidth(double width) { this.width = width; } public double getHeight() { return height; } public void setHeight(double height) { this.height = height; } public double getCellLen() { return cellLen; } public void setCellLen(double cellLen) { this.cellLen = cellLen; } /** * 维度 */ private int n; private double width; private double height; private double cellLen; private char currentSide='B'; public char getFlag() { return flag; } private char flag=' '; private char[][] chess; public char[][] getChess() { return chess; } public void setChess(char[][] chess) { this.chess = chess; } public char getCurrentSide() { return currentSide; } public void setCurrentSide(char currentSide) { this.currentSide = currentSide; } //其他请补充 public FiveChess(double width,double height,double cellLen){ this.width=width; this.height=height; this.cellLen=cellLen; chess=new char[(int)height][(int)width]; for(int i=0;i=0;j--){ if(chess[row][j]!=chessColor) break; count++; } if(count>=5) return false; return true; } public boolean colJudge(int row,int col,char chessColor){ //判断一列是否五子连线 int count=0; for(int i=row;i=0;i--){ if(chess[i][col]!=chessColor) break; count++; } if(count>=5) return false; return true; } public boolean mainDiagonalJudge(int row,int col,char chessColor){ //判断主对角线是否五子连线 int count=0; for(int i=row,j=col;i=0&&j>=0;i--,j--){ if(chess[i][j]!=chessColor) break; count++; } if(count>=5) return false; return true; } public boolean DeputyDiagonalJudge(int row,int col,char chessColor){ //判断副对角线是否五子连线 int count=0; for(int i=row,j=col;i>=0&&j=0;i++,j--){ if(chess[i][j]!=chessColor) break; count++; } if(count>=5) return false; return true; } }

二、视图

Chesspane类继承Pane类实现棋盘和五子棋的绘制

package view; import entity.FiveChess; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.layout.Pane; import javafx.scene.paint.Color; public class Chesspane extends Pane { public Canvas getCanvas() { return canvas; } public Canvas canvas; public GraphicsContext getGc() { return gc; } public GraphicsContext gc; public FiveChess getFiveChess() { return fiveChess; } public void setFiveChess(FiveChess fiveChess) { this.fiveChess = fiveChess; } public FiveChess fiveChess; public Chesspane(FiveChess fiveChess){ this.fiveChess=fiveChess; double cell=fiveChess.getCellLen(); drawPane(cell); drawChess(cell); getChildren().add(canvas); } public void drawPane(double cell){ canvas = new Canvas(800,700); gc = canvas.getGraphicsContext2D(); gc.clearRect(0,0,canvas.getWidth(),canvas.getHeight()); //绘制棋盘 gc.setstroke(Color.BLACK); for(int i=0;i

三、控制器

playAction类继承自事件处理器EventHandler并传递的参数是鼠标事件,表示接受鼠标点击面板事件

package controller; import entity.FiveChess; import javafx.event.EventHandler; import javafx.scene.control.Alert; import javafx.scene.input.MouseEvent; import view.Chesspane; public class PlayAction implements EventHandler { /**fiveChess表示五子棋游戏模型*/ private FiveChess fiveChess; /**chesspane表示五子棋显示面板*/ private Chesspane chesspane; public PlayAction(FiveChess fiveChess,Chesspane chesspane){ this.chesspane=chesspane; this.fiveChess = fiveChess; } @Override public void handle(MouseEvent event) { //处理鼠标点击事件 double cell=fiveChess.getCellLen(); //event.getX()获取鼠标点击x坐标,返回double类型 double x=event.getX(); double y=event.getY(); int i=(int)((x-100+cell/2)/cell); int j=(int)((y-100+cell/2)/cell); System.out.println(i+" "+j); fiveChess.play(i,j); chesspane.drawChess(cell); if(!fiveChess.judgeGame(i,j,fiveChess.getCurrentSide()=='B'?'W':'B')){ Alert alert = new Alert(Alert.AlertType.informatION); alert.setTitle("五子棋游戏"); alert.setHeaderText("提示信息"); alert.setContentText((fiveChess.getCurrentSide()=='B'?"白":"黑")+"方取得胜利!"); alert.showAndWait(); } } }

四、测试

import controller.PlayAction; import entity.FiveChess; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Alert; import javafx.stage.Stage; import view.Chesspane; import javax.print.attribute.standard.Fidelity; public class Test extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { FiveChess fiveChess = new FiveChess(20,20,28.0); Chesspane chesspane=new Chesspane(fiveChess); chesspane.setonMouseClicked(new PlayAction(fiveChess,chesspane));//事件源绑定处理器 Scene scene=new Scene(chesspane,800,700); primaryStage.setScene(scene); primaryStage.setTitle("五子棋游戏"); primaryStage.show(); } }

效果

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...