javafx实现五子棋游戏

作者:逆光al 时间:2022-02-01 07:00:01 

需求描述

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

项目结构如下图

javafx实现五子棋游戏

一、实体

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<height;i++)
for(int j=0;j<width;j++)
chess[i][j]=' ';
}

public void play(int x,int y){

//将当前的棋子放置到(x,y)
if(chess[x][y]==' '){
chess[x][y]=currentSide;
if(!judgeGame(x,y,currentSide)){
//游戏结束弹出信息框
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("五子棋游戏");
alert.setHeaderText("提示信息");
alert.setContentText(currentSide+"方取得胜利!");

alert.showAndWait();
}
changeSide();
}
}

public void changeSide(){

//更换下棋方

setCurrentSide(currentSide=='B'?'W':'B');

}

public boolean judgeGame(int row, int col, char chessColor){

//判断游戏是否结束
if(rowJudge(row,col,chessColor)&&colJudge(row,col,chessColor)&&mainDiagonalJudge(row,col,chessColor)&&DeputyDiagonalJudge(row,col,chessColor))
return true;
return false;

}

public boolean rowJudge(int row,int col,char chessColor){
//判断一行是否五子连线
int count=0;
for(int j=col;j<width;j++){
if(chess[row][j]!=chessColor)
break;
count++;
}
for(int j=col-1;j>=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<height;i++){
if(chess[i][col]!=chessColor)
break;
count++;
}
for(int i=row-1;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<height&&j<width;i++,j++){
if(chess[i][j]!=chessColor)
break;
count++;
}

for(int i=row-1,j=col-1;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<width;i--,j++){
if(chess[i][j]!=chessColor)
break;

count++;
}

for(int i=row+1,j=col-1;i<height&&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<fiveChess.getWidth();i++)
for(int j=0;j<fiveChess.getHeight();j++){
gc.strokeRect(100+i*cell,100+cell*j,cell,cell);//清理一个矩形取区域的内容
}

}

public void drawChess(double cell){

char[][] chess=fiveChess.getChess();
for(int i=0;i<fiveChess.getHeight();i++)
for(int j=0;j<fiveChess.getWidth();j++){
if(chess[i][j]=='B'){
gc.setFill(Color.BLACK);//设置填充色
gc.fillOval(100+i*cell-cell/2,100+j*cell-cell/2,cell,cell);
}
else if(chess[i][j]=='W'){
gc.setFill(Color.WHITE);

gc.fillOval(100+i*cell-cell/2,100+j*cell-cell/2,cell,cell);//填充椭圆
gc.strokeOval(100+i*cell-cell/2,100+j*cell-cell/2,cell,cell);//绘制轮廓
}
}

}

}

三、控制器

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<MouseEvent> {

/**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();

}
}

效果图

javafx实现五子棋游戏

来源:https://blog.csdn.net/qq_40933929/article/details/88809085

标签:javafx,五子棋,游戏
0
投稿

猜你喜欢

  • Input系统之InputReader处理按键事件详解

    2023-11-09 20:57:05
  • C#编程中使用ref和out关键字来传递数组对象的用法

    2021-09-25 23:19:45
  • SpringBoot如何使用Fastjson解析Json数据

    2023-11-25 11:55:58
  • java实现国产sm4加密算法

    2022-02-14 06:27:08
  • 在C#中捕获内存不足异常

    2021-07-14 11:50:46
  • C#异步委托调用实例分析

    2022-12-14 05:41:06
  • SpringCloud超详细讲解微服务网关Gateway

    2021-09-11 14:54:49
  • Java使用Gateway自定义负载均衡过滤器

    2022-06-27 03:55:09
  • C# 设计模式系列教程-策略模式

    2022-04-30 16:09:03
  • C# 读写自定义的Config文件的实现方法

    2022-09-08 23:22:35
  • 浅谈java多线程wait,notify

    2023-11-29 16:29:03
  • Java设计模式之观察者模式_动力节点Java学院整理

    2022-01-14 12:27:47
  • SpringMvc后台接收json数据中文乱码问题详解

    2022-12-03 00:08:58
  • 关于maven:pom文件的使用解析

    2022-02-08 06:21:41
  • Android可签到日历控件的实现方法

    2023-11-18 15:11:28
  • Android App开发中ViewPager组件的入门使用教程

    2023-04-30 21:45:34
  • Android刷新加载框架详解

    2022-11-20 05:41:10
  • Spring security如何重写Filter实现json登录

    2023-09-15 13:33:31
  • Android中如何安全地打印日志详解

    2023-02-10 12:17:42
  • Android实现手势滑动多点触摸放大缩小图片效果

    2022-02-13 09:26:28
  • asp之家 软件编程 m.aspxhome.com