Java语言程序设计基础篇_编程练习题***16.31(游戏:四子连)

news2024/11/25 18:57:49

目录

题目:***16.31(游戏:四子连)

习题思路 

 代码示例

 结果展示


题目:***16.31(游戏:四子连)

   编程练习题8.20让两个玩家在控制台上可以玩四子连的游戏。为这个程序重写一个GUI版本,如图16-49c所示。这个程序让两个玩家轮流放置红色和黄色棋子。为了放置棋子,玩家需要在可用的格子上单击。可用的格子(available cell)是指不被占用的格子,而其下方临接的格子是被占用的格子。如果一个玩家胜了,这个程序就闪烁这四个赢的格子,如果所有的格子都被占用但还没有胜者,就报告无胜者。

  • 习题思路 
  1. 创建一个GridPane,把面板背景设为灰色, 创建一个Circle[7][6]并逐步添加到面板中,每一个圆初始都设置成白色,并同时为圆设置事件。
  2. 创建一个HBox,居中放置一个Label。
  3. 创建一个BorderPane,把GridPane设置在顶部,把HBox设置在底部。
  4. 定义一个下棋方法,在鼠标点击圆的时候更新圆的颜色并切换玩家,同时更新标签以显示当前玩家的回合。
  5. 定义一个游戏是否结束的方法,可以参考16.30题的代码。
  6. 创建一个TimeLine用来闪烁圆,可以把连续的棋子的坐标放在一个int[4][2]中,在事件内不断设置圆的本来颜色(黄/红)和另一个颜色(例如蓝色)。
  •  代码示例

编程练习题16_31ConnectFour.java

package chapter_16;

import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import javafx.util.Duration;

public class 编程练习题16_31ConnectFour extends Application{
	private int[][] index = new int[4][2];
	private int weidth = 7;//棋盘的长度
	private int heigth = 6;//棋盘的宽度
	private boolean end = false;
	private int circleRadius = 20;//圆的半径
	private int spacing = 8;
	private Circle[][] circleList = new Circle[weidth][heigth];//定义一个棋盘
	private Label lbText;//显示信息的标签
	private boolean who = false;//决定该哪一方下棋
	
	private boolean count = false;
	EventHandler<ActionEvent> eventHandler = e -> {  
	    for (int i = 0; i < 4; i++) {  
	    	Color color = who?Color.YELLOW:Color.RED;
	        int row = index[i][0];  
	        int col = index[i][1];  
	        System.out.println(i+" "+row+","+col);
	        
	        Circle c = circleList[row][col];  
	        if (c != null ) {
	        	if(count) {
	        		c.setFill(color);
	        	}else {
	        		c.setFill(Color.BLUE);
	        	}
	        }  
	    }  
	    count = !count;
	};  
	  
	private Timeline t = new Timeline(new KeyFrame(Duration.millis(500), eventHandler));  
	@Override
	public void start(Stage primaryStage) throws Exception {
		t.setCycleCount(Timeline.INDEFINITE);  
		GridPane gridPane = new GridPane();
		gridPane.setPadding(new Insets(10, 10, 10, 10));
		gridPane.setStyle("-fx-background-color:Gray");
		gridPane.setVgap(8);
		gridPane.setHgap(8);
		gridPane.setAlignment(Pos.CENTER);
		for(int i = 0;i < circleList.length;i++) {
			for(int j = 0;j < circleList[i].length;j++) {
				circleList[i][j] = new Circle(circleRadius);
				circleList[i][j].setFill(Color.WHITE);
				circleList[i][j].setStroke(Color.BLACK);
				circleList[i][j].setOnMouseClicked(e -> playChess(e));
				gridPane.add(circleList[i][j], i, j);
			}
		}
		lbText = new Label("X's turn to play");
		HBox hBox = new HBox(lbText);
		hBox.setAlignment(Pos.CENTER);
		
		
		BorderPane borderPane = new BorderPane();
		borderPane.setTop(gridPane);
		borderPane.setBottom(hBox);
		Scene scene = new Scene(borderPane,350, 330);
		primaryStage.setTitle("编程练习题16_31ConnectFour");
		primaryStage.setScene(scene);
		primaryStage.show();
	}
	private void playChess(MouseEvent e) {  
	    if (end) return; // 如果游戏已经结束,则不执行任何操作  
	  
	    Circle clickedCircle = (Circle) e.getSource();  
	  
	    // 遍历circleList以找到clickedCircle的索引  
	    for (int i = 0; i < circleList.length; i++) {  
	        for (int j = 0; j < circleList[i].length; j++) {  
	            if (circleList[i][j] == clickedCircle) {  
	                if (circleList[i][j].getFill() != Color.WHITE) {  
	                    return; // 如果圆已经被填充,则不执行任何操作  
	                }  
	  
	                // 更新圆的颜色并切换玩家  
	                if (who) {  
	                    circleList[i][j].setFill(Color.RED);  
	                } else {  
	                    circleList[i][j].setFill(Color.YELLOW);  
	                }  
	                who = !who;  
	  
	                // 更新标签以显示当前玩家的回合(但在游戏结束时不会更新)  
	                if (!end) {  
	                    lbText.setText(who ? "Yellow's turn to play" : "Red's turn to play");  
	                }  
	  
	                // 检查游戏是否结束  
	                end = isConsecutiveFour(circleList);  
	                if (end) {  
	                    // 更新标签以反映哪一方获胜  
	                    lbText.setText(who ? "Yellow wins!" : "Red wins!");  
	                    // 这里可以停止Timeline或进行其他清理工作  
	                    t.play();
	                }  
	  
	                return; // 找到并更新后退出循环  
	            }  
	        }  
	    }  
	  
	    // 如果没有找到匹配的圆,则抛出异常或记录日志  
	    System.err.println("Failed to find clicked circle in array!");  
	}
	public boolean isConsecutiveFour(Circle[][] values) {  
	    if (values == null || values.length == 0 || values[0].length == 0) {  
	        return false;  
	    }  
	  
	    int rows = values.length;  
	    int cols = values[0].length;  
	  
	    // 检查行  
	    for (int i = 0; i < rows; i++) {  
	        for (int j = 0; j <= cols - 4; j++) { // 只需检查到 cols-4  
	            Color color = (Color) values[i][j].getFill();  
	            if (color.equals(values[i][j + 1].getFill()) &&  
	                color.equals(values[i][j + 2].getFill()) &&  
	                color.equals(values[i][j + 3].getFill())) {  
	            	if(color!=Color.WHITE) {
	            		for(int k = 0;k < 4;k++) {
	            			index[k][0] = i;
	            			index[k][1] = j+k;
	            			System.out.println("("+i+","+j+")");
	            		}
	            		return true;  
	            	}
	            }  
	        }  
	    }  
	  
	    // 检查列  
	    for (int j = 0; j < cols; j++) {  
	        for (int i = 0; i <= rows - 4; i++) { // 只需检查到 rows-4  
	            Color color =(Color)  values[i][j].getFill();  
	            if (color.equals(values[i + 1][j].getFill()) &&  
	                color.equals(values[i + 2][j].getFill()) &&  
	                color.equals(values[i + 3][j].getFill())) {  
	            	if(color!=Color.WHITE) {
	            		for(int k = 0;k < 4;k++) {
	            			index[k][0] = i+k;
	            			index[k][1] = j;
	            			System.out.println("("+i+","+j+")");
	            		}
	            		return true;  
	            	}
	            }  
	        }  
	    }  
	  
	    // 检查主对角线  
	    for (int i = 0; i <= rows - 4; i++) {  
	        for (int j = 0; j <= cols - 4; j++) {  
	            Color color = (Color) values[i][j].getFill();  
	            if (color.equals(values[i + 1][j + 1].getFill()) &&  
	                color.equals(values[i + 2][j + 2].getFill()) &&  
	                color.equals(values[i + 3][j + 3].getFill())) {
	            	if(color!=Color.WHITE) {
	            		for(int k = 0;k < 4;k++) {
	            			index[k][0] = i+k;
	            			index[k][1] = j+k;
	            		}
	            		return true;  
	            	}
	            }  
	        }  
	    }  
	  
	    // 检查副对角线  
	    for (int i = 0; i <= rows - 4; i++) {  
	        for (int j = 3; j < cols; j++) { // 注意起始点是3,因为是从右上角往左下角检查  
	            Color color = (Color) values[i][j].getFill();  
	            if (color.equals(values[i + 1][j - 1].getFill()) &&  
	                color.equals(values[i + 2][j - 2].getFill()) &&  
	                color.equals(values[i + 3][j - 3].getFill())) {
	            	if(color!=Color.WHITE) {
	            		for(int k = 0;k < 4;k++) {
	            			index[k][0] = i+k;
	            			index[k][1] = j-k;
	            		}
	            		return true;  
	            	}
	            }  
	        }  
	    }  
	  
	    // 如果没有找到连续的四个相同颜色的圆  
	    return false;  
	}
	public static void main(String[] args) {
		Application.launch(args);
	}
}
 结果展示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2061318.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Open3D mesh 模型锐化

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 输入参数 输出参数 2.2完整代码 三、实现效果 3.1原始mesh 3.2处理后mesh 3.3数据显示 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总…

反射异常捕获 | InvocationTargetException 要用e.getCause()打印才能看到具体异常

背景&#xff1a;线上某段和反射相关的代码报错了&#xff0c;但是异常信息打印只看到了 InvocationTargetException&#xff0c;没打印具体的异常。就像这样&#xff1a;java.lang.reflect.InvocationTargetException: null 查阅资料后发现要用e.getCause()才能打印具体异常&a…

[数据集][目标检测]航拍屋顶检测数据集VOC+YOLO格式458张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;458 标注数量(xml文件个数)&#xff1a;458 标注数量(txt文件个数)&#xff1a;458 标注类别…

深度剖析数字媒体产业链的无限潜力与创新生态

在当今信息爆炸的时代&#xff0c;数字媒体产业链正以势不可挡的姿态展现出其令人瞩目的无限潜力与创新生态。 数字媒体的发展潜力简直无可限量。从在线视频的爆发式增长&#xff0c;到虚拟现实和增强现实技术带来的沉浸式体验&#xff0c;再到社交媒体平台上丰富多彩的内容创…

抽象类与抽象函数+接口

抽象类与抽象函数 什么是抽象方法 抽象方法是没有实现代码的虚方法 抽象方法使用abstract修饰符进行声明&#xff0c;只能在同样声明了abstract的类中使用。 继承了抽象类的子类必须实现抽象类的所有抽象方法。 什么是抽象类 用abstract修饰过的类是抽象类 抽象类无法被…

《机器学习》 决策树 ID3算法

一、什么是决策树&#xff1f; 1、概念 决策树是机器学习中一种常见的分类和回归算法。它基于树状结构的模型&#xff0c;通过对数据进行逐步划分&#xff0c;最终生成一棵决策树来进行预测或分类任务。 在决策树中&#xff0c;每个节点代表一个特征或属性&#xff0c;每个分支…

数据库:数据更新和视图

1 实验目的 &#xff08;1&#xff09;掌握SQL语言的数据更新功能&#xff1a; update 语句用于对表进行更新 delete 语句用于对表进行删除 insert 语句用于对表进行插入 &#xff08;2&#xff09;掌握对视图的操作&#xff1a; 视图的定义 视图的更新 基于视图的查询 …

總結熱力學_4(完了)

參考: 陈曦<<热力学讲义>>http://ithatron.phys.tsinghua.edu.cn/downloads/thermodynamics.pdf 7 最大功定理 考虑一个与外界隔绝的由几个彼此不处于热平衡、但相互绝热的物体组成的系统。另外还需要一个重物,它不参与热力学过程,但是可以以重力势能的 方式存…

js vscode 关于对象数组的一个bug

数据结构&#xff1a; let address [{label: "北京市",children: []},{label: "天津市",children: []},{label: "上海市",children: []},{label: "重庆市",children: []},{label: "河北省",children: [{label: "石家…

Flink 同步 MySQL 到 Doris

一、前言 使用Apache Flink实现数据同步的ETL&#xff08;抽取、转换、加载&#xff09;过程通常涉及从源系统&#xff08;如数据库、消息队列或文件&#xff09;中抽取数据&#xff0c;进行必要的转换&#xff0c;然后将数据加载到目标系统&#xff08;如另一个数据库…

Spring自动注册-Bean的加载

Spring在进行完xml文件标签解析后,我们如何获取对应的Bean? 核心方法: getBean() Spring三级缓存&循环依赖: 由于单例在Spring容器中只会被创建一次&#xff0c;即&#xff1a;创建出来的单例实例对象就会被缓存到singletonObjects(一级缓存)中。所以&#xff0c;当要获得…

Nginx高级部分

一、web服务基础介绍 Web 服务基础介绍 正常情况下的单次web服务访问流程&#xff1a; Apache 经典的 Web 服务端 Apache起初由美国的伊利诺伊大学香槟分校的国家超级计算机应用中心开发 目前经历了两大版本分别是1.X和2.X 其可以通过编译安装实现特定的功能 1.Apache pr…

<数据集>航拍牧场牛羊识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1021张 标注数量(xml文件个数)&#xff1a;1021 标注数量(txt文件个数)&#xff1a;1021 标注类别数&#xff1a;3 标注类别名称&#xff1a;[cattle, cow, sheep] 序号类别名称图片数框数1cattle29741282cow6740…

网络安全漏洞防护技术原理与应用

网络安全漏洞概述 概念 定义&#xff1a;又称脆弱性&#xff0c;简称漏洞。一般是致使网络信息系统安全策略相冲突的缺陷&#xff08;安全隐患&#xff09; 影响&#xff1a;机密性受损、完整性破坏、可用性降低、抗抵赖性缺失、可控制性下降、真实性不保等 范围&#xff…

Kerberos认证以及黄金票据白银票据的简单介绍

目录 1. 什么是Kerberos认证2. Kerberos认证流程3. 票据伪造4. 金票和银票的原理5. 金票和银票的区别6. 针对Kerberos的攻击 1. 什么是Kerberos认证 Kerberos是一种网络身份认证的协议&#xff0c;协议设计目的是通过使用秘钥加密技术为客户端/服务器应用程序提供强身份验证&am…

【vue3|第24期】深入了解useRouter:方法、属性与使用示例

日期&#xff1a;2024年8月20日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

安装CUDA、CUDNN、pytorch

2.1 安装CUDA 2.1.1找到CUDA的版本号 2.1.1.1 屏幕的左下角&#xff0c;找到NVIDIA控制面板的图标&#xff0c;如下图所示&#xff1a; 图2.1.1.1 NVIDIA控制面板图标 2.1.1.2 打开NVIDIA控制面板&#xff0c;找到系统信息&#xff0c;如下图所示&#xff1a; 图2.1.1.2 系…

Qt中英文支持

目的 就是想让QT编的软件支持中英文。 情况 1、首先配置项目的pro文件&#xff1a; 这样就会生成相应的翻译配置文件&#xff0c;当前是&#xff1a; translate1_cn.ts&#xff1a;中文的配置文件&#xff0c;因为一般默认就是中文&#xff0c;所以一般中文的翻译文件是不需…

GPT的token是怎么计算的

百花齐放的AI模型 自从ChatGPT横空出世 计算机进入了AI时代 国内也诞生了不少优秀的替代品 讯飞系、通义系、文心等等 国内排名最高的阿里通义 720亿参数的模型Qwen-72B 力压Llama 2等国内外开源大模型 登顶Hugging Face的开源大模型排行榜首 包括C-Eval、CMMLU、Gaok…

electron-vite封装UI级的消息提示

说明 Electron Vite Vue3 Element Plus Electron中写提示有两种方案&#xff1a; 系统级&#xff1a;electron带的dialog相关APIUI级&#xff1a;UI框架内部的提示&#xff0c;如ElMessage、ElMessageBox、ElNotification等 今天来封装一下UI级别的提示 代码 效果图 源…