JAVAFX基于α-β剪枝树的五子棋人机博弈

该博客介绍了如何使用JAVAFX开发一款五子棋游戏,并结合α-β剪枝算法实现人机博弈功能。尽管目前的算法只能搜索到第三层,尝试搜索第五层会导致程序卡死,但展示了五子棋AI的基本实现思路。
摘要由CSDN通过智能技术生成

Main主类:

背景图片和音乐就不传了

package application;

import java.util.Optional;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.stage.Stage;
import javafx.scene.Scene;
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.Label;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TextArea;
import javafx.scene.control.ToggleGroup;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.scene.text.Font;

/* ----------------------
 * 
  	南昌大学 计科142级 周天钜
  	
  	毕业设计 基于α-β剪枝树的五子棋人机博弈系统
  	
	完成时间 2018.4.1
	
------------------------*/

public class Main extends Application {

	public static Board[][] board = new Board[14][14]; // 绘制棋盘 大小14X14
	public static boolean AIPlay = true; // 为false为人人对战,为true时为和电脑下棋
	public static boolean AIToken = false; // 为false电脑执白,为true电脑执黑
	public static char whoseTurn = ' '; // 判断是哪方下棋,在后面的代码中会先置whoseTurn为'B'即默认为黑棋先下
	public static TextArea textArea = new TextArea(); // 文本域 输出消息用	
	public static Circle[][] arrayCircle = new Circle[14][14];// 将棋子存入arrayCircle中,便于后面的重新开始及悔棋操作
	public static int step = 0; // 用于标记当前落子的步数

	public static AI robot = new AI(); // AI类

	private Image image = new Image("timg.jpg"); // 背景图片
	private Media media = new Media(getClass().getClassLoader().getResource("BGM.mp3").toString());
	private Button btSet = new Button("游戏设置");
	private Button btStart = new Button("开始游戏");
	private Button btRegret = new Button("悔    棋");
	private Button btSurrender = new Button("认    输");
	private Button btExit = new Button("结束游戏");

	// 弹出式窗口,分别为点击游戏设置、游戏投降即退出游戏时弹出一个确认窗口
	private Alert startConfirm = new Alert(AlertType.CONFIRMATION, "该局对战尚未结束,是否开始新游戏?");
	private Alert setConfirm = new Alert(AlertType.INFORMATION);
	private Alert surrenderConfirm = new Alert(AlertType.CONFIRMATION, "是否认输?");
	private Alert exitConfirm = new Alert(AlertType.CONFIRMATION, "是否退出游戏?");
	private Alert winner = new Alert(AlertType.INFORMATION);

	@Override // 主面板
	public void start(Stage primaryStage) {

		try {
			// 背景图片
			Pane pane = new Pane();
			pane.getChildren().add(new ImageView(image));

			//背景音乐
			MediaPlayer mediaPlayer = new MediaPlayer(media);
			mediaPlayer.setVolume(30);
			mediaPlayer.setCycleCount(MediaPlayer.INDEFINITE);
			mediaPlayer.setAutoPlay(true);

			//初始化棋盘
			GridPane gridPane = new GridPane();
			for (int i = 0; i < 14; i++)
				for (int j = 0; j < 14; j++)
					gridPane.add(board[i][j] = new Board(i, j), i, j);

			// 把棋盘 放在pane中间
			gridPane.setLayoutX(150);
			gridPane.setLayoutY(30);

			// 绘制按钮 添加到VBOX中 VBOX在后续会添加到Pane的左侧
			VBox vBox = new VBox(50);
			vBox.setPadding(new Insets(20, 20, 20, 20));
			vBox.setLayoutY(100);
			vBox.getChildren().addAll(btSet, btStart, btRegret, btSurrender, btExit);

			// 游戏设置按钮
			btSet.setOnAction(e -> {
				// 点击 游戏设置按钮 弹出一个新的面板 游戏的所有设置在此面板中调节
				// 只允许在游戏未开始时进行设置
				if (whoseTurn == ' ') {
					Stage settingStage = new Stage();
					Pane settingPane = new Pane();
					ToggleGroup group1 = new ToggleGroup();// group1对应radioButton1、2
															// 对应label1
					ToggleGroup group2 = new ToggleGroup();
					ToggleGroup group3 = new ToggleGroup();
					Label label1 = new Label("对战模式");
					Label label2 = new Label("人机对战设置");
					Label label3 = new Label("游戏难度");
					label1.setLayoutX(30);
					label1.setLayoutY(15);
					label2.setLayoutX(30);
					label2.setLayoutY(100);
					label3.setLayoutX(30);
					label3.setLayoutY(190);

					// 添加单选按钮 这一块为对战模式设置 默认为人人对战
					RadioButton rb1 = new RadioButton("人机对战");
					RadioButton rb2 = new RadioButton("人人对战");
					rb1.setLayoutX(50);
					rb1.setLayoutY(50);
					rb2.setLayoutX(200);
					rb2.setLayoutY(50);
					// 将rb1 rb2加入group中
					rb1.setToggleGroup(group1);
					rb2.setToggleGroup(group1);
					rb1.setSelected(true);
					Line line1 = new Line(0, 80, 350, 80);

					// 这一块为人机对战设置 默认为电脑执白
					RadioButton rb3 = new RadioButton("电脑执黑");
					RadioButton rb4 = new RadioButton("电脑执白");
					rb3.setLayoutX(50);
					rb3.setLayoutY(130);
					rb4.setLayoutX(200);
					rb4.setLayoutY(130);
					rb3.setToggleGroup(group2);
					rb4.setToggleGroup(group2);
					rb4.setSelected(true);
					Line line2 = new Line(0, 165, 350, 165);

					// 这一块为游戏难度设置
					RadioButton rb5 = new RadioButton("简单");
					RadioButton rb6 = new RadioButton("正常");
					RadioButton rb7 = new RadioButton("困难");

					rb5.setLayoutX(50);
					rb5.setLayoutY(220);
					rb6.setLayoutX(200);
					rb6.setLayoutY(220);
					rb7.setLayoutX(50);
					rb7.setLayoutY(250);
					rb5.setToggleGroup(group3);
					rb5.setSelected(true);
					rb6.setToggleGroup(group3);
					rb7.setToggleGroup(group3);
					Line line3 = new Line(0, 280, 350, 280);

					// 确认按钮与取消按钮
					Button confirm = new Button("确认");
					Button cancel = new Button("取消");
					confirm.setLayoutX(90);
					confirm.setLayoutY(315);
					cancel.setLayoutX(190);
					cancel.setLayoutY(315);
					// 添加按钮事件 点击确认将修改游戏参数 点击取消直接关闭设置窗口
					confirm.setOnAction(event -> {
						// 若选中第一个radioButton则为人机对战,否则为人人对战
						if (rb1.isSelected() == true) {
							AIPlay = true;
							rb1.setSelected(true);
						} else if (rb2.isSelected() == true) {
							AIPlay = false;
							rb2.setSelected(true);
						}
						// 若选中第三个按钮则为电脑执黑 ,否则为电脑执白
						if (rb3.isSelected() == true) {
							AIToken = true;
							rb3.setSelected(true);
						} else if (rb4.isSelected() == true) {
							AIToken = false;
							rb4.setSelected(true);
						}
						settingStage.close();
					});
					cancel.setOnAction(event -> {
						settingStage.close();
					});

					settingPane.getChildren().addAll(label1, rb1, rb2, line1, label2, rb3, rb4, line2, label3, rb5, rb6,
							rb7, line3, confirm, cancel);
					Scene settingScene = new Scene(settingPane);
					settingScene.getStylesheets().add(getClass().getResource("textStyle.css").toExternalForm());
					settingStage.setHeight(400);
					settingStage.setWidth(350);
					settingStage.setScene(settingScene);
					settingStage.setTitle("游戏设置");
					settingStage.setResizable(false); // 设置面板大小不可变
					settingStage.show();
				} else {
					setConfirm.setHeaderText(null);
					setConfirm.setContentT
  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值