javafx写一个小游戏-井字棋

2023-10-29

学了几天的javafx,感觉非常好用,自己写了一个小游戏,如有不足,希望大佬加以指正,谢谢。

1.先写UI界面

新建一个ui.fxml文件,用于显示ui界面
界面效果如下:
在这里插入图片描述
代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.shape.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane maxHeight="600.0" maxWidth="600.0" minHeight="600.0" minWidth="600.0" prefHeight="600.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
 fx:controller="application.MyController"><!--  此处添加fx:controller="xxxxr"来添加ui界面的功能处理 -->
   <children>
      <GridPane maxHeight="600.0" maxWidth="600.0" minHeight="600.0" minWidth="600.0" prefHeight="600.0" prefWidth="600.0" style="-fx-grid-lines-visible: true;">
        <columnConstraints>
          <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
          <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
        </columnConstraints>
        <rowConstraints>
          <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
          <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
          <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
        </rowConstraints>
         <children>
            <Button  maxHeight="200.0" maxWidth="200.0" minHeight="200.0" minWidth="200.0" mnemonicParsing="false"  prefHeight="200.0" prefWidth="200.0" />
            <Button  layoutX="10.0" layoutY="10.0" maxHeight="200.0" maxWidth="200.0" minHeight="200.0" minWidth="200.0" mnemonicParsing="false"  prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" />
            <Button  layoutX="210.0" layoutY="10.0" maxHeight="200.0" maxWidth="200.0" minHeight="200.0" minWidth="200.0" mnemonicParsing="false"  prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2" />
            <Button  layoutX="10.0" layoutY="10.0" maxHeight="200.0" maxWidth="200.0" minHeight="200.0" minWidth="200.0" mnemonicParsing="false"  prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="1" />
            <Button  layoutX="10.0" layoutY="210.0" maxHeight="200.0" maxWidth="200.0" minHeight="200.0" minWidth="200.0" mnemonicParsing="false" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="1" />
            <Button  layoutX="10.0" layoutY="10.0" maxHeight="200.0" maxWidth="200.0" minHeight="200.0" minWidth="200.0" mnemonicParsing="false" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.rowIndex="1" />
            <Button  maxHeight="200.0" maxWidth="200.0" minHeight="200.0" minWidth="200.0" mnemonicParsing="false"  prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="2" />
            <Button maxHeight="200.0" maxWidth="200.0" minHeight="200.0" minWidth="200.0" mnemonicParsing="false"  prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="2" />
            <Button  maxHeight="200.0" maxWidth="200.0" minHeight="200.0" minWidth="200.0" mnemonicParsing="false"  prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.rowIndex="2" />
         </children>
      </GridPane>
   </children>
</AnchorPane>

二.加载布局文件

在Main.java中,通过FXMLLoader.load()加载布局文件,
代码如下:

FXMLLoader.load(getClass().getResource("/application/ui.fxml")); //加载布局文件ui.fxml              

三.处理ui界面的功能

新建一个类,实现Initializable功能。
代码如下:

package application;

public class MyController implements Initializable {	
	
	@Override
	public void initialize(URL arg0, ResourceBundle arg1) {	//首先调用此方法
		
	}
}

在ui.fxml里添加 fx:controller="application.MyController"后,

 fx:controller="application.MyController"	//controller的名字和位置根据自己的配置选择

在MyController.java里可以用@FXML注解将属性分享到ui界面上

@FXML private Button bu;			//按钮控件

然后在ui.fxml文件里使用fx:id便可以绑定控件

<Button fx:id="b1" />		//绑定MyController中的属性

而按钮的点击方法可以通过设置方法的参数,如下:

public void play(ActionEvent event) {
		...
}

将方法分享到ui界面上,在ui界面上使用fx:onAction进行绑定

<onAction="#action">	//绑定点击的函数

完整代码如下:
1.Main.java

package application;
	
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {
	
	@Override
	public void start(Stage primaryStage) {
		try {	
			Parent root = FXMLLoader.load(getClass()			//加载布局文件ui.fxml
                    .getResource("/application/ui.fxml"));
			primaryStage.setTitle("井字棋");								//设置标题
			primaryStage.setScene(new Scene(root));				//设置主面板
			primaryStage.show();												//显示主界面
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		launch(args);
	}
}

2.MyController.java

package application;


import java.net.URL;
import java.util.Optional;
import java.util.ResourceBundle;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Dialog;
import javafx.scene.control.DialogPane;
import javafx.scene.image.Image;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundImage;
import javafx.scene.layout.BackgroundSize;

public class MyController implements Initializable {
	
	private Image imageX = new Image("x.jpg");	//图片X
	private Image imageO = new Image("o.jpg");	//图片O
	private boolean flag = true;				//标志物,决定当前是画X还是画O

	@FXML private Button b1;			//通过@FXML来绑定控件
	@FXML private Button b2;			//b1-b9代表9个格子
	@FXML private Button b3;
	@FXML private Button b4;
	@FXML private Button b5;
	@FXML private Button b6;
	@FXML private Button b7;
	@FXML private Button b8;
	@FXML private Button b9;
	private int[] r = new int[9];	//分别代表9个棋子	-1代表X 	1代表O
	
	private ButtonType buttonAgain = new ButtonType("重新开始");		//重新开始的按钮
	private ButtonType buttonOver = new ButtonType("结束游戏");		//重新开始的按钮
	private Alert alt = new Alert(AlertType.CONFIRMATION);			//游戏结束对话框
	
	@Override
	public void initialize(URL arg0, ResourceBundle arg1) {	//首先调用此方法
		setBackgroundEmpty();	//清空所有背景图片
		alt.setTitle("游戏结束!"); 	//设置对话框的标题
		alt.getButtonTypes().setAll(buttonAgain,buttonOver);	//添加按钮到对话框上
	}
	private	BackgroundSize bs =  new BackgroundSize(200, 200, false, false, false, false);	//设置画的图形的大小
	private BackgroundImage bX = new BackgroundImage(imageX, null, null, null, bs);		//图形X
	private BackgroundImage bO = new BackgroundImage(imageO, null, null, null, bs);		//图形O	
	
	//点击按钮时调用此方法
	public void action(ActionEvent event) {
		Button b = (Button) event.getSource();		//获得点击的对象
		int id = Integer.parseInt(b.getId().trim().substring(1))-1;	//通过按钮的id获得位置 例如是b1 得到0
		if(b.getBackground() == null) {		//如果还没有下这个位置
			if(flag == true) {					//该画X了
				b.setBackground(new Background(bX));	//画X
				r[id] = -1;
				flag = false;	//下一个应该画O
			}else {								//该画O了
				b.setBackground(new Background(bO));	//画O
				r[id] = 1;
				flag = true;	//下一个应该画X
			}
			check();
		}
	}
	//清空所有按钮的背景
	private void setBackgroundEmpty() {
		b1.setBackground(null);b2.setBackground(null);b3.setBackground(null);	
		b4.setBackground(null);b5.setBackground(null);b6.setBackground(null);
		b7.setBackground(null);b8.setBackground(null);b9.setBackground(null);
	}
	//重新开始
	private void again() {
		setBackgroundEmpty();			//清空背景
		r = new int[9];					//重新计数
	}
	//判断是否满足胜利条件
	private void check() {
		if(r[0]+r[1]+r[2]==3			//第一排横着3个O
		|| r[3]+r[4]+r[5]==3			//第二排横着3个O
		|| r[6]+r[7]+r[8]==3			//第三排横着3个O
		|| r[0]+r[3]+r[6]==3			//第一列竖着3个O
		|| r[1]+r[4]+r[7]==3			//第二列竖着3个O
		|| r[2]+r[5]+r[8]==3			//第三列竖着3个O
		|| r[0]+r[4]+r[8]==3			//  \的3个O
		|| r[2]+r[4]+r[6]==3) {			//  /的3个O
			alt.setHeaderText("O赢了");						//设置对话框内容
			Optional<ButtonType> result = alt.showAndWait();	//显示对话框
			if (result.get() == buttonAgain){		//再来一次
			    again();
			}else {
				System.exit(0);		//结束游戏
			}
		}
		if(r[0]+r[1]+r[2]==-3			//第一排横着3个X
		|| r[3]+r[4]+r[5]==-3			//第二排横着3个X
		|| r[6]+r[7]+r[8]==-3			//第三排横着3个X
		|| r[0]+r[3]+r[6]==-3			//第一列竖着3个X
		|| r[1]+r[4]+r[7]==-3			//第二列竖着3个X
		|| r[2]+r[5]+r[8]==-3			//第三列竖着3个X
		|| r[0]+r[4]+r[8]==-3			//  \的3个X
		|| r[2]+r[4]+r[6]==-3) {
			alt.setHeaderText("X赢了");						//设置对话框内容
			Optional<ButtonType> result = alt.showAndWait();	//显示对话框
			if (result.get() == buttonAgain){		//再来一次
			    again();
			}else {
				System.exit(0);		//结束游戏
			}
		}	
		//所有格子都被点了 但是没有分出胜负
		if(r[0]!=0 && r[1]!=0 && r[2]!=0	
		&& r[3]!=0 && r[4]!=0 && r[5]!=0
		&& r[6]!=0 && r[7]!=0 && r[8]!=0) {
			alt.setHeaderText("平局");						//设置对话框内容
			Optional<ButtonType> result = alt.showAndWait();	//显示对话框
			if (result.get() == buttonAgain){		//再来一次
			    again();
			}else {
				System.exit(0);		//结束游戏
			}
		}
	}
}

3.ui.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.shape.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane maxHeight="600.0" maxWidth="600.0" minHeight="600.0" minWidth="600.0" prefHeight="600.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.MyController">
   <children>
      <GridPane maxHeight="600.0" maxWidth="600.0" minHeight="600.0" minWidth="600.0" prefHeight="600.0" prefWidth="600.0" style="-fx-grid-lines-visible: true;">
        <columnConstraints>
          <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
          <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
        </columnConstraints>
        <rowConstraints>
          <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
          <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
          <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
        </rowConstraints>
         <children>
            <Button fx:id="b1" maxHeight="200.0" maxWidth="200.0" minHeight="200.0" minWidth="200.0" mnemonicParsing="false" onAction="#action" prefHeight="200.0" prefWidth="200.0" />
            <Button fx:id="b2" layoutX="10.0" layoutY="10.0" maxHeight="200.0" maxWidth="200.0" minHeight="200.0" minWidth="200.0" mnemonicParsing="false" onAction="#action" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" />
            <Button fx:id="b3" layoutX="210.0" layoutY="10.0" maxHeight="200.0" maxWidth="200.0" minHeight="200.0" minWidth="200.0" mnemonicParsing="false" onAction="#action" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2" />
            <Button fx:id="b4" layoutX="10.0" layoutY="10.0" maxHeight="200.0" maxWidth="200.0" minHeight="200.0" minWidth="200.0" mnemonicParsing="false" onAction="#action" prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="1" />
            <Button fx:id="b5" layoutX="10.0" layoutY="210.0" maxHeight="200.0" maxWidth="200.0" minHeight="200.0" minWidth="200.0" mnemonicParsing="false" onAction="#action" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="1" />
            <Button fx:id="b6" layoutX="10.0" layoutY="10.0" maxHeight="200.0" maxWidth="200.0" minHeight="200.0" minWidth="200.0" mnemonicParsing="false" onAction="#action" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.rowIndex="1" />
            <Button fx:id="b7" maxHeight="200.0" maxWidth="200.0" minHeight="200.0" minWidth="200.0" mnemonicParsing="false" onAction="#action" prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="2" />
            <Button fx:id="b8" maxHeight="200.0" maxWidth="200.0" minHeight="200.0" minWidth="200.0" mnemonicParsing="false" onAction="#action" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="2" />
            <Button fx:id="b9" maxHeight="200.0" maxWidth="200.0" minHeight="200.0" minWidth="200.0" mnemonicParsing="false" onAction="#action" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.rowIndex="2" />
         </children>
      </GridPane>
   </children>
</AnchorPane>

运行结果如下:
在这里插入图片描述

学习交流请加QQ群:1062828738

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

javafx写一个小游戏-井字棋 的相关文章

随机推荐

  • Django框架全面讲解 -- Model

    Django提供了一个抽象层 Model 来构建和管理Web应用程序的数据 django中遵循 Code Frist 的原则 即 根据代码中定义的类来自动生成数据库表 关系对象映射 Object Relational Mapping 简称O
  • ntohs, ntohl, htons,htonl的比较和详解

    假设在x86平台上 有一个int型变量 在内存中的内部由低到高分别是 0x12 0x34 0x56 0x78当通过网络发送该数据时 正确的发送顺序是 0x78 0x56 0x34 0x12 X86 系列 CPU都是 little endia
  • selenium与自动化测试成神之路

    在群里总是会遇到很多人问低级问题 写了一个selenium脚本 却执行失败 跑到群里来问 大神 这里为什么会报错 很多都是明显的语法问题 一问方知 今天刚刚学selenium 之前也没有语法基础 没学过Java 没学过Python 就跑来搞
  • 开关电源基本工作原理

    本文以丰富的开关电源案例分析 介绍单端正激式开关电源 自激式开关电源 推挽式开关电源 降压式开关电源 升压式开关电源和反转式开关电源 随着全球对能源问题的重视 电子产品的耗能问题将愈来愈突出 如何降低其待机功耗 提高供电效率成为一个急待解决
  • 21 【styled-components的使用】

    21 styled components的使用 1 为什么要用这个 我们都知道 我们从最开始学css的时候 为了避免写的样式影响到另外的地方 所以我们这样来写的 userConten userBtn button font size 18p
  • Anaconda安装pytorch虚拟环境

    Anaconda安装pytorch虚拟环境 Anaconda部分操作 查看安装了哪些包 查看当前存在哪些虚拟环境 检查更新当前conda Python创建虚拟环境 激活或者切换虚拟环境 虚拟环境中安装额外的包 删除虚拟环境 Pytorch虚
  • 计算机视觉算法岗面试题

    大佬的面试经验 https www nowcoder com discuss 128148 以及大佬的博客 https blog csdn net liuxiao214 article details 83043170 根据大佬的面试经验一
  • pipeline 获取 tag_Docker镜像获取(gcr.io等)- 2.0

    在 Docker镜像获取 gcr io等 中 介绍了几种获取 Docker 镜像的方式 对于大部分镜像来说都可以通过这些方式获得 但是对于较新的镜像 上面几种方式就很不方便了 所以今天介绍一种简单又安全的方式来获取被墙的镜像 通过 Dock
  • 单机数据库性能测试总结

    当前单机数据库 文件型数据库 有很多 为了选择更好的数据库 以便以后使用 在这主要对以下数据库进了插入 查询的速度进行测试 以及数据库的管理方式进行详细说明 数据库分别为 SQLLite FireBird Derby HSql Postgr
  • RabbitMQ入门------Java

    RabbitMQ RabbitMQ是一个开源的AMQP实现 服务器端用Erlang语言编写 支持多种客户端 如 Python Ruby NET Java JMS C PHP ActionScript XMPP STOMP等 支持AJAX 用
  • sql计算占比

    计算占比是日常分析中常见的需求 下面我们来小结一下怎么用sql来实现计算占比 1 数据准备 现在有一张表 表里有两个字段 op name与state 都为离散型可枚举数据 除此以外表里还有其他字段 数据形式如下 op name state
  • Neo4j Desktop数据导出,导入Neo4j Community (Docker环境)

    目前课题组有基于Kubernetes和Dockers的集群以及阿里云镜像托管仓库 我们以往建立的知识图谱都是在本机有数据备份 怎么将他们导出到集群环境的Neo4j中呢 本机数据导出 Neo4j Desktop提供很多功能 但是一键导出功能根
  • VMware虚拟机设置网络

    https jingyan baidu com article f0e83a257beae322e591013d html
  • JS中int和string的转换

    在javascript里怎么样才能把int型转换成string型 1 var x 100 a x toString 2 var x 100 a x JS会自动隐性转换 javascript 将string 变成 int JScript va
  • 列表查询和分组统计字段其他类型

    示例 列表查询 字段单选
  • 分支循环练习篇

    选择题第一部分练习 1 2 3 4 5 6 答案 cccddd 选择题第二部分练习 1 2 答案 bc 代码练习第一部分 1 2 3 4 5 使用试除法 ps 用到了新的库函数sqrt 开方 代码练习第二部分 1 2 老师写法 我的写法 3
  • PhpStorm同时编辑多行

    看到这张图基本就都明白了
  • HIT-ICS大作业

    计算机系统大作业 题目 程序人生 Hello s P2P 计算机科学与技术学院 摘 要 大作业题为程序人生 Hello s P2P 围绕一个较简单的hello c函数的整个生命周期展开 介绍了该示例程序从编写到执行到结束的全过程 详细地分析
  • 【Unity API】Input类

    Input类函数是游戏输入系统的接口 使用此类函数可以读取游戏输入设置中的虚轴 以及访问移动设备上的多点触摸或加速度计数据 关于 游戏输入设置 可以看到我的另一篇文章 https blog csdn net Ha1f Awake artic
  • javafx写一个小游戏-井字棋

    学了几天的javafx 感觉非常好用 自己写了一个小游戏 如有不足 希望大佬加以指正 谢谢 1 先写UI界面 新建一个ui fxml文件 用于显示ui界面 界面效果如下 代码如下