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

 }
}

效果图

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

(0)

相关推荐

  • javafx实现五子棋游戏

    需求描述 一个五子棋游戏,能实现双方黑白对决,当一方获胜时给出提示信息,利用GUI界面实现 项目结构如下图 一.实体 FiveChess类 提供五子棋实体包含的所有信息 判断游戏是否结束 play方法改变chess[][]棋盘中的数据 package entity; import javafx.scene.control.Alert; public class FiveChess{ public double getWidth() { return width; } public void se

  • javaFX实现五子棋小游戏

    javaFX实现五子棋游戏,供大家参考,具体内容如下 做课程设计的时候做到这个,分享出来大家参考一下吧,图片为游戏运行过程 最下的代码就是整个实现整个需求的 package Version3; import javafx.application.Application; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.

  • 基于C语言实现五子棋游戏完整实例代码

    本文实例讲述了基于C语言实现五子棋游戏的方法,代码备有比较完整的注释,可以帮助读者更好的加以理解. 五子棋游戏代码如下: /* * 使用键盘的上下左右键移动棋盘,空格键表示下棋,ESC键退出程序 */ #include <stdio.h> #include <stdlib.h> #include <bios.h> #include <graphics.h> #include<malloc.h> /* * 对应键盘键的十六进制数字 */ #defi

  • java基于swing实现的五子棋游戏代码

    本文实例讲述了java基于swing实现的五子棋游戏代码.分享给大家供大家参考. 主要功能代码如下: 复制代码 代码如下: import java.awt.*; import javax.swing.*; import java.awt.event.*; public class Main extends JFrame implements ActionListener{         private static final long serialVersionUID = 1L;      

  • VC实现五子棋游戏的一个算法示例

    本文讲述了VC实现五子棋游戏的一个算法示例,该算法采用极大极小剪枝博弈算法,感兴趣的读者可以对程序中不完善的部分进行修改与完善. 该设计主要包括:数据结构.估值函数.胜负判断.搜索算法 程序运行界面如下: 具体实现步骤如下: 1.数据结构 //记录每步棋,可以建立链表用来进行悔棋.后退(本程序没有实现) struct Step { int x,y; //棋子坐标 int ball; //表示下子方{BLACK,WHITE} }; //记录棋盘情况,用于搜索过程 class CBoardSitua

  • jQuery实现的五子棋游戏实例

    本文实例讲述了jQuery实现的五子棋游戏.分享给大家供大家参考.具体如下: 这是一款非常不错的代码,就是人工智能方面差了一点 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999

  • java实现单人版五子棋游戏

    本文实例讲述了java实现的五子棋游戏代码,分享给大家供大家参考,具体代码如下 package gyb.exam; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Point; import java.awt.Toolkit; import java.awt.

  • 原生JS+Canvas实现五子棋游戏实例

    一.功能模块 先看下现在做完的效果: 线上体验:https://wj704.github.io/five_game.html 主要功能模块为: 1.人机对战功能 2.悔棋功能 3.撤销悔棋功能 二.代码详解 2.1 人机对战功能实现 从效果图可以看到,棋盘的横竖可以放的位置为15*15,通过canvas画棋盘: //绘画棋盘 var drawChessBoard = function(){ for(var i = 0; i < 15; i++){ context.moveTo(15 + i *

  • JS+canvas实现的五子棋游戏【人机大战版】

    本文实例讲述了JS+canvas实现的五子棋游戏.分享给大家供大家参考,具体如下: 运行效果图: html代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>五子棋</title> <link rel="stylesheet" type="text/css" href="css

  • 原生JS+Canvas实现五子棋游戏

    本文实例为大家分享了JS  Canvas实现五子棋游戏的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>五子棋</title> <style type='text/css'> canvas { display: block; margin: 50px auto; box-shadow: -2p

随机推荐