学了几天的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 { @Overridepublic 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 {@Overridepublic 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"); //图片Xprivate Image imageO = new Image("o.jpg");  //图片Oprivate 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代表Oprivate ButtonType buttonAgain = new ButtonType("重新开始");     //重新开始的按钮private ButtonType buttonOver = new ButtonType("结束游戏");     //重新开始的按钮private Alert alt = new Alert(AlertType.CONFIRMATION);            //游戏结束对话框@Overridepublic 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);     //图形Xprivate 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 得到0if(b.getBackground() == null) {        //如果还没有下这个位置if(flag == true) {                    //该画X了b.setBackground(new Background(bX));  //画Xr[id] = -1;flag = false;  //下一个应该画O}else {                                //该画O了b.setBackground(new Background(bO));  //画Or[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个Oalt.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

javafx写一个小游戏-井字棋相关推荐

  1. 用c语言编写的打字母游戏,用C语言编写小游戏——“井字棋”

    原标题:用C语言编写小游戏--"井字棋" 作者:Milo Yip 来源:知乎 原文链接:https://zhuanlan.zhihu.com/p/39581573 在 Milo Y ...

  2. python小游戏井字棋(人机对战)

    游戏简介:在九宫格内进行,如果一方抢先于另一方向(横.竖.斜)连成3子,则获得胜利.游戏中输入方格位置代号的形式如下: 设计前的思路: 游戏中,board棋盘存储玩家.计算机的落子信息,未落子处未EM ...

  3. C++ 小游戏 井字棋

    c++井字棋小游戏,里面有人机对战 和 双人对战 先创建一个游戏类 #pragma once #include<iostream> #include<vector> #incl ...

  4. vb小游戏——井字棋

    欠了一个星期的小游戏..我得补一补.以下效果图: 特别简单,其实学一段就能做的小东西,愣是给我拖了不知道多久orz 新手初学,错误和不好的习惯请一定要纠正我.Thanks♪(・ω・)ノ 以下实现方法: ...

  5. C语言小游戏井字棋(三子棋)

    1.自定义game.h头文件 #pragma once#include <stdio.h>//符号定义 #define Row 3 #define Col 3//函数声明//棋盘 void ...

  6. 一个n维井字棋的游戏

    前几天在任务中国上接了一个任务,主要完成一个n维井字棋的设计.n维井字棋的概念是从二维井字棋开始的,二维井字棋为3×3的棋盘,而三维的就为3×3×3,四维,五维以此类推,不过四维,五维有点难以想象,呵 ...

  7. 用IE网页学游戏-井字棋

    IE网页学游戏-井字棋 井字棋实现交互的简单小游戏,学习使用表格,理解javascript函数. 1.构造棋盘 用table元素的行列构造三行三列的表格.设置好120像素的井字棋背景,三个小图表示方格 ...

  8. python写游戏脚本-使用Python写一个小游戏

    引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下 ...

  9. python编程小游戏-使用Python写一个小游戏

    引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下 ...

最新文章

  1. 「AI 质检员」在富士通上岗,效率比人工高 25%
  2. 【转】【Android】使用BaseAdapter实现复杂的ListView
  3. Java多线程专题一:并发所面临的问题
  4. nacos 公共_Springboot,Nacos并向使用研究
  5. 记一次 .NET 医院CIS系统 内存溢出分析
  6. day34 数据库入门
  7. 【Clickhouse】Clickhouse 外部存储引擎之 MySQL
  8. h3c trunk口改access_H3CNE配置VLAN的Access链路端口和Trunk链路端口
  9. 看看虚函数表是什么样的
  10. Nginx的端口修改问题
  11. VLOOK Markdown 主题包和增强插件
  12. PS2019剪裁、切片、标尺工具、吸管工具、颜色取样器、注释工具、计数工具
  13. java 毕向东_毕向东java视频目录
  14. 翻书法记忆GRE词汇
  15. 上班族时间自由,做什么副业合适?最好是在手机或电脑上的副业?
  16. liteon460w服务器电源管理系统,【LITEON PS-2112-5L 1200W C6100 C6220 C6220I服务器电源】价格_厂家 - 中国供应商...
  17. 网络营销的15大形式
  18. Mysql 分组查询取max 那条记录其他字段
  19. Vue中插入base64图片
  20. Java 2 实用教程

热门文章

  1. c++中三角函数的用法
  2. wechart微信小程序遇到的问题总结(一)
  3. 3、UML统一建模语言是什么?
  4. python爬取知乎回答并进行舆情分析:舆情分析部分
  5. mescroll-uni上拉加载失效
  6. 算法导论/第一部分_基础知识
  7. 一招破解抓包工具Charles,并进行移动APP抓包分析
  8. 解决tomcat的控制台输出信息乱码问题_刘锋的博客
  9. android反编译APK后,是smali文件,能反编译成dex文件
  10. 【电气专业知识问答】问:为什么现代大型汽轮发电机应装设过电压保护?