javafx写一个小游戏-井字棋
学了几天的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写一个小游戏-井字棋相关推荐
- 用c语言编写的打字母游戏,用C语言编写小游戏——“井字棋”
原标题:用C语言编写小游戏--"井字棋" 作者:Milo Yip 来源:知乎 原文链接:https://zhuanlan.zhihu.com/p/39581573 在 Milo Y ...
- python小游戏井字棋(人机对战)
游戏简介:在九宫格内进行,如果一方抢先于另一方向(横.竖.斜)连成3子,则获得胜利.游戏中输入方格位置代号的形式如下: 设计前的思路: 游戏中,board棋盘存储玩家.计算机的落子信息,未落子处未EM ...
- C++ 小游戏 井字棋
c++井字棋小游戏,里面有人机对战 和 双人对战 先创建一个游戏类 #pragma once #include<iostream> #include<vector> #incl ...
- vb小游戏——井字棋
欠了一个星期的小游戏..我得补一补.以下效果图: 特别简单,其实学一段就能做的小东西,愣是给我拖了不知道多久orz 新手初学,错误和不好的习惯请一定要纠正我.Thanks♪(・ω・)ノ 以下实现方法: ...
- C语言小游戏井字棋(三子棋)
1.自定义game.h头文件 #pragma once#include <stdio.h>//符号定义 #define Row 3 #define Col 3//函数声明//棋盘 void ...
- 一个n维井字棋的游戏
前几天在任务中国上接了一个任务,主要完成一个n维井字棋的设计.n维井字棋的概念是从二维井字棋开始的,二维井字棋为3×3的棋盘,而三维的就为3×3×3,四维,五维以此类推,不过四维,五维有点难以想象,呵 ...
- 用IE网页学游戏-井字棋
IE网页学游戏-井字棋 井字棋实现交互的简单小游戏,学习使用表格,理解javascript函数. 1.构造棋盘 用table元素的行列构造三行三列的表格.设置好120像素的井字棋背景,三个小图表示方格 ...
- python写游戏脚本-使用Python写一个小游戏
引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下 ...
- python编程小游戏-使用Python写一个小游戏
引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下 ...
最新文章
- 「AI 质检员」在富士通上岗,效率比人工高 25%
- 【转】【Android】使用BaseAdapter实现复杂的ListView
- Java多线程专题一:并发所面临的问题
- nacos 公共_Springboot,Nacos并向使用研究
- 记一次 .NET 医院CIS系统 内存溢出分析
- day34 数据库入门
- 【Clickhouse】Clickhouse 外部存储引擎之 MySQL
- h3c trunk口改access_H3CNE配置VLAN的Access链路端口和Trunk链路端口
- 看看虚函数表是什么样的
- Nginx的端口修改问题
- VLOOK Markdown 主题包和增强插件
- PS2019剪裁、切片、标尺工具、吸管工具、颜色取样器、注释工具、计数工具
- java 毕向东_毕向东java视频目录
- 翻书法记忆GRE词汇
- 上班族时间自由,做什么副业合适?最好是在手机或电脑上的副业?
- liteon460w服务器电源管理系统,【LITEON PS-2112-5L 1200W C6100 C6220 C6220I服务器电源】价格_厂家 - 中国供应商...
- 网络营销的15大形式
- Mysql 分组查询取max 那条记录其他字段
- Vue中插入base64图片
- Java 2 实用教程