标签分类
技术文章
当前位置:主页 > 计算机编程 > java > javafx五子棋游戏编写详解

javafx五子棋游戏开发过程

  • 发布时间:
  • 作者:码农之家原创
  • 点击:106

javafx五子棋游戏编写详解

这篇文章主要知识点是关于javafx,五子棋,游戏,javafx五子棋游戏编写详解,Java五子棋单机版源码分享 的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

神经网络算法与实现 基于Java语言
  • 类型:神经网络大小:32 MB格式:PDF出版:人民邮电出版社作者:法比奥
立即下载

更多相关的学习资源可以参阅 程序设计电子书Java电子书Java视频、等栏目。

需求描述

一个五子棋游戏,能实现双方黑白对决,当一方获胜时给出提示信息,利用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实现五子棋游戏

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

Java五子棋单机版源码分享

初学JavaGUI编程,就写了一个小游戏–五子棋。

目前只实现了单机版,任何事情都是从简制作的,有问题请大牛们不吝指教啊。

此处的棋盘和棋子都未用图片,全部都是使用Java中的Graphics画出来的。

源码已提交至GitHub,点击此处GitHub源码

以下列出其中的五子棋类:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class FiveInARow extends JFrame implements MouseListener {
 Vector v = new Vector(); //所有的每步走棋信息
 Vector white = new Vector(); //白方走棋信息
 Vector black = new Vector(); //黑方走棋信息
 boolean b; //用来判断白旗还是黑棋
 int whiteCount, blackCount; //计算悔棋步数
 int w = 25; //间距大小
 int px = 100, py = 100; //棋盘的大小
 int pxw = px + w, pyw = py + w;
 int width = w * 16, height = w * 16;
 int vline = width + px; //垂直线的长度
 int hline = height + py; //水平线的长度

 /**
  * 构造方法
  */
 public FiveInARow() {
  super("单机版五子棋");
  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭按钮
  Container con = this.getContentPane();
  con.setLayout(new BorderLayout());
  this.addMouseListener(this);//添加监听
  this.setSize(600, 600);//设置窗体大小
  this.setBackground(Color.orange);
  this.setVisible(true);
 }

 /**
  * 画棋盘和棋子
  * @param e
  */
 public void paint(Graphics g) {
  g.clearRect(0, 0, this.getWidth(), this.getHeight());//清除画板
  g.setColor(Color.BLACK);//绘制网格颜色
  g.drawRect(px, py, width, height);//网格大小
  g.drawString("单机版五子棋小游戏,右击可以悔棋,欢迎使用", 180, 70);

  for (int i=0; i<15; i++) {
   g.drawLine(pxw+i*w, py, pxw+i*w, hline);//每条横线和竖线
   g.drawLine(px, pyw+i*w, vline, pyw+i*w);
  }

  for (int x=0; x<v.size(); x++) {
   String str = (String)v.get(x);
   String tmp[] = str.split("-");
   int a = Integer.parseInt(tmp[0]);
   int b = Integer.parseInt(tmp[1]);
   a = a * w + px;
   b = b * w + py;
   if (x%2 == 0) {
    g.setColor(Color.WHITE);
   } else {
    g.setColor(Color.BLACK);
   }
   g.fillArc(a-w/2, b-w/2, w, w, 0, 360);
  }
 }

 @Override
 public void mouseClicked(MouseEvent e) {
  if (e.getButton() == e.BUTTON1) {
   int x = e.getX();
   int y = e.getY();
   x = (x - x % w) + (x % w > w / 2 ? w : 0);
   y = (y - y % w) + (y % w > w / 2 ? w : 0);
   x = (x - px) / w;
   y = (y - py) / w;

   if (x >= 0 && y >= 0 && x <= 16 && y <= 16) {
    if (v.contains(x+"-"+y)) {
     System.out.println("已经有棋了!");
    } else {
     v.add(x+"-"+y);
     this.repaint();
     if (v.size() % 2 == 0) {
      black.add(x+"-"+y);
      this.victory(x, y, black);
//      System.out.println("黑棋");
     } else {
      white.add(x+"-"+y);
      this.victory(x, y, white);
//      System.out.println("白棋");
     }
//     System.out.println(e.getX()+"-"+e.getY());
    }
   } else {
//    System.out.println(e.getX()+"-"+e.getY()+"|"+x+"-"+y+"\t超出边界了");
   }
  }

  if (e.getButton() == e.BUTTON3) { //右击悔棋的方法
//   System.out.println("鼠标右击--悔棋");
   if (v.isEmpty()) {
    JOptionPane.showMessageDialog(this, "没有棋可悔");
   } else {
    if (v.size() % 2 == 0) { //判断是白棋悔棋,还是黑棋悔棋
     blackCount++;
     if (blackCount > 3) {
      JOptionPane.showMessageDialog(this, "黑棋已经悔了3步");
     } else {
      v.remove(v.lastElement());
      this.repaint();
     }
    } else {
     whiteCount++;
     if (whiteCount > 3) {
      JOptionPane.showMessageDialog(this, "白棋已经悔了3步");
     } else {
      v.remove(v.lastElement());
      this.repaint();
     }
    }
   }
  }
 }

 /**
  * 判断胜利的方法
  * @param x
  * @param y
  * @param contain
  */
 private void victory(int x, int y, Vector contain) {
  int cv = 0; //垂直方向棋子数量
  int ch = 0; //水平方向棋子数量
  int ci1 = 0; //斜面方向棋子数量1
  int ci2 = 0; //斜面方向棋子数量2

  //计算水平方向棋子数量
  for (int i=1; i<5; i++) {
   if (contain.contains((x+i)+"-"+y)) {
    ch++;
   } else {
    break;
   }
  }
  for (int i=1; i<5; i++) {
   if (contain.contains((x-i)+"-"+y)) {
    ch++;
   } else {
    break;
   }
  }

  //计算垂直方向棋子数量
  for (int i=1; i<5; i++) {
   if (contain.contains(x+"-"+(y+i))) {
    cv++;
   } else {
    break;
   }
  }
  for (int i=1; i<5; i++) {
   if (contain.contains(x+"-"+(y-i))) {
    cv++;
   } else {
    break;
   }
  }

  //计算45°斜面方向棋子数量
  for (int i=1; i<5; i++) {
   if (contain.contains((x+i)+"-"+(y+i))) {
    ci1++;
   } else {
    break;
   }
  }
  for (int i=1; i<5; i++) {
   if (contain.contains((x-i)+"-"+(y-i))) {
    ci1++;
   } else {
    break;
   }
  }

  //计算135°斜面方向棋子数量
  for (int i=1; i<5; i++) {
   if (contain.contains((x+i)+"-"+(y-i))) {
    ci2++;
   } else {
    break;
   }
  }
  for (int i=1; i<5; i++) {
   if (contain.contains((x-i)+"-"+(y+i))) {
    ci2++;
   } else {
    break;
   }
  }

  if (ch>=4 || cv>=4 ||ci1>=4 ||ci2>=4) {
   System.out.println(v.size()+"步棋");
   if (v.size() % 2 == 0) {
    //判断是黑棋赢,还是白棋赢
    JOptionPane.showMessageDialog(null, "黑棋赢了");
   } else {
    JOptionPane.showMessageDialog(null, "白棋赢了");
   }
   this.v.clear();
   this.black.clear();
   this.white.clear();
   this.repaint();
  }
 }

 @Override
 public void mouseEntered(MouseEvent e) {
  // TODO Auto-generated method stub

 }

 @Override
 public void mouseExited(MouseEvent e) {
  // TODO Auto-generated method stub

 }

 @Override
 public void mousePressed(MouseEvent e) {
  // TODO Auto-generated method stub

 }

 @Override
 public void mouseReleased(MouseEvent e) {
  // TODO Auto-generated method stub

 }

}

PS:打算再写个网络版的五子棋,可惜对Java中网络不太清楚,得学习一段时间后再继续完成了,检验下个人学习成果。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

以上就是本次给大家分享的全部知识点内容总结,大家还可以在下方相关文章里找到vue项目中使用md5加密以及、 儿童python编程入门书籍推、 解决axios.interceptors.respon、 等java文章进一步学习,感谢大家的阅读和支持。

上一篇:springboot写一个自己的starter源码实例详解

下一篇:Java实现中文字符串与unicode互转工具类方法详解

展开 +

收起 -

学习笔记
网友NO.668267

Java实现两人五子棋游戏(七) 屏幕提示信息

之前的两篇文章:Java实现两人五子棋游戏(二) 画出棋盘;Java实现两人五子棋游戏(三) 画出棋子;Java实现两人五子棋游戏(四) 落子动作的实现;Java实现两人五子棋游戏(六) 行棋方变换,可以点击查看。 接下来我们要实现的功能是在有五连珠的时候,在屏幕上提示信息。直接在mousePressed函数的isWin部分使用showMessageDialog即可。 mousePressed函数代码如下: @Override //当用户按下鼠标按钮时发生 public void mousePressed(MouseEvent e) { int point_x=e.getX(); int point_y=e.getY(); int imgWidth = boardImg.getHeight(this); int imgHeight = boardImg.getWidth(this); int FWidth = getWidth(); int FHeight= getHeight(); int x=(FWidth-imgWidth)/2; int y=(FHeight-imgHeight)/2; int span_x=imgWidth/ROWS; int span_y=imgHeight/ROWS; //System.out.println("press"); int status_x = 0; int status_y = 0; if(point_x=x point_x=x+imgWidth point_y=y point_y = y+imgHeight) { //System.out.println("合法"); for(int i=0;iROWS+1;i++) { if(point_x=x-chessman_width/2+1+i*span_x) { if(point_x=x+chessman_width/2-1+i*span_x)//如果是width/2会在中间点出现两个匹配值 { //System.out.println("point x "+i+" "+point_x+" "+(x-chessman_width/2+i*span_x)+" "+(x+chessman_width/2+i*span_x)); status_x = i; } } } for(int i=0;iROWS+1;i++) { if(point_y=y-chessman_width/2+1+i*span_y) { if(point_y = y+chessman_width/2-1+i*span_y) { //System.out.println("point y "+i+" "+point_y+" "+(y-chessman_width/2+1+……

网友NO.561700

Java基于享元模式实现五子棋游戏功能实例详解

本文实例讲述了Java基于享元模式实现五子棋游戏功能。分享给大家供大家参考,具体如下: 一、模式定义 享元模式,以共享的方式高效地支持大量的细粒度对象。通过复用内存中已存在的对象,降低系统创建对象实例的性能消耗。享元的英文是Flyweight,表示特别小的对象,即细粒度对象。 二、模式举例 1. 模式分析 我们借用五子棋游戏来说明这一模式。 2. 享元模式静态类图 3. 代码示例 3.1 创建抽象棋子一AbstractChessman package com.demo.flyweight.object;public abstract class AbstractChessman { // 棋子坐标 protected int x; protected int y; // 棋子类别(黑|白) protected String chess; public AbstractChessman(String chess) { this.chess = chess; } // 点坐标设置 public abstract void point(int x, int y); // 显示棋子信息 public void show() { System.out.println(this.chess + "(" + this.x + "," + this.y + ")"); }} 3.2 创建黑子一BlackChessman package com.demo.flyweight.object;public class BlackChessman extends AbstractChessman { /** * 构造方法 初始化黑棋子 */ public BlackChessman() { super("●"); System.out.println("--BlackChessman Construction Exec!!!"); } // 点坐标设置 @Override public void point(int x, int y) { this.x = x; this.y = y; // 显示棋子内容 show(); }} 3.3 创建白子一WhiteChessman package com.demo.flyweight.object;public class WhiteChessman extends AbstractChessman { /** * 构造方法 初始……

<
1
>

Copyright 2018-2019 xz577.com 码农之家

版权责任说明