javaFX 實現粗糙版的挖地雷

本文介绍了一个使用JavaFX开发的地雷游戏实现方案。通过Java构建地雷对象及地图,并利用JavaFX进行图形化界面展示,实现了左键点击揭示地雷状态及右键标记功能。
首先..因為javafx剛開始接觸..不是很熟悉..既然他能調用java類..所以我們用java來構建
地雷對象

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package landmine;

/**
*
* @author Administrator
*/
public class Landmine {
public Landmine getBottom() {
return bottom;
}

public void setBottom(Landmine bottom) {
this.bottom = bottom;
}

public Landmine getLeft() {
return left;
}

public void setLeft(Landmine left) {
this.left = left;
}

public Landmine getRight() {
return right;
}

public void setRight(Landmine right) {
this.right = right;
}

public int getStatus() {
return status;
}

public void setStatus(int status) {
this.status = status;
}

public Landmine getTop() {
return top;
}

public void setTop(Landmine top) {
this.top = top;
}

public Landmine getBottomLeft() {
return bottomLeft;
}

public void setBottomLeft(Landmine bottomLeft) {
this.bottomLeft = bottomLeft;
}

public Landmine getBottomRight() {
return bottomRight;
}

public void setBottomRight(Landmine bottomRight) {
this.bottomRight = bottomRight;
}

public Landmine getTopLeft() {
return topLeft;
}

public void setTopLeft(Landmine topLeft) {
this.topLeft = topLeft;
}

public Landmine getTopRight() {
return topRight;
}

public void setTopRight(Landmine topRight) {
this.topRight = topRight;
}
public void updateStatus(){
if(this.top!=null&&this.top.status!=-1){
this.top.status++ ;
}
if(this.topLeft!=null&&this.topLeft.status!=-1){
this.topLeft.status++ ;
}
if(this.topRight!=null&&this.topRight.status!=-1){
this.topRight.status++ ;
}
if(this.left!=null&&this.left.status!=-1){
this.left.status++ ;
}
if(this.right!=null&&this.right.status!=-1){
this.right.status++ ;
}
if(this.bottom!=null&&this.bottom.status!=-1){
this.bottom.status++ ;
}
if(this.bottomLeft!=null&&this.bottomLeft.status!=-1){
this.bottomLeft.status++ ;
}
if(this.bottomRight!=null&&this.bottomRight.status!=-1){
this.bottomRight.status++ ;
}
}

private Landmine top ;
private Landmine topLeft ;
private Landmine topRight ;
private Landmine bottom ;
private Landmine bottomLeft ;
private Landmine bottomRight ;
private Landmine left ;
private Landmine right ;
private int status ;

}


和地雷地圖對象

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package landmine;

import java.util.Random;

/**
*
* @author Administrator
*/
public class LandmineMap {

public static void main(String args[]) {
System.out.println("aaaaaaaaaaaa");
LandmineMap lm = new LandmineMap(10, 10, 20);
lm.makeMap();
}
public static Landmine[] getMap(int x , int y , int lmNums){
LandmineMap lm = new LandmineMap(x, x, lmNums);
return lm.makeMap() ;
}
private int x;
private int y;
private int lmNums;
private Random random = null;

public LandmineMap(int x, int y, int lmNums) {
this.x = x;
this.y = y;
this.lmNums = lmNums;
}

public Landmine[] makeMap() {
random = new Random();
Landmine[] landmines = new Landmine[x * y];
int location = 0;
for (int i = 0; i < lmNums; i++) {
location = getRandomNum();
if (landmines[location] == null) {
landmines[location] = new Landmine();
landmines[location].setStatus(-1);
} else {
i--;
}
}
for (int i = 0; i < x * y; i++) {
if (landmines[i] == null) {
landmines[i] = new Landmine();
}
}
int[] ints = null;
for (int i = 0; i < x * y; i++) {
ints = this.getLocation(i);
if (ints[0] != -1) {
landmines[i].setTopLeft(landmines[ints[0]]);
}
if (ints[1] != -1) {
landmines[i].setTop(landmines[ints[1]]);
}
if (ints[2] != -1) {
landmines[i].setTopRight(landmines[ints[2]]);
}
if (ints[3] != -1) {
landmines[i].setLeft(landmines[ints[3]]);
}
if (ints[4] != -1) {
landmines[i].setRight(landmines[ints[4]]);
}
if (ints[5] != -1) {
landmines[i].setBottomLeft(landmines[ints[5]]);
}
if (ints[6] != -1) {
landmines[i].setBottom(landmines[ints[6]]);
}
if (ints[7] != -1) {
landmines[i].setBottomRight(landmines[ints[7]]);
}
}
for (int i = 0; i < x * y; i++) {
if (landmines[i].getStatus() == -1) {
landmines[i].updateStatus();
}
}
return landmines ;
}
private int tempX = 0;
private int tempY = 0;

public int[] getLocation(int location) {
int[] ints = new int[8];
tempX = location % x;
tempY = location / y;
if ((tempX - 1) >= 0 && (tempY - 1) >= 0) {
ints[0] = location - x - 1;
} else {
ints[0] = -1;
}
if ((tempY - 1) >= 0) {
ints[1] = location - x;
} else {
ints[1] = -1;
}
if ((tempX + 1) < x && (tempY - 1) >= 0) {
ints[2] = location - x + 1;
} else {
ints[2] = -1;
}
if ((tempX - 1) >= 0) {
ints[3] = location - 1;
} else {
ints[3] = -1;
}
if ((tempX + 1) < x) {
ints[4] = location + 1;
} else {
ints[4] = -1;
}
if ((tempX - 1) >= 0 && (tempY + 1) < y) {
ints[5] = location + x - 1;
} else {
ints[5] = -1;
}
if ((tempY + 1) < y) {
ints[6] = location + x;
} else {
ints[6] = -1;
}
if ((tempX + 1) < x && (tempY + 1) < y) {
ints[7] = location + x + 1;
} else {
ints[7] = -1;
}
return ints;
}

public int getRandomNum() {
return random.nextInt(x * y);
}
}



這個代碼就不解釋了沒什麼好解釋的..

下麵是fx的代碼

/*
* Main.fx
*
* Created on 2009-8-15, 17:42:50
*/

package landmine;

import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.text.Text;
import javafx.scene.text.Font;
import javafx.scene.CustomNode;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.shape.Rectangle;
import javafx.scene.paint.Color;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.MouseButton;

import javafx.scene.layout.VBox;

import javafx.scene.text.FontWeight;
import javafx.scene.text.TextOrigin;
import javafx.scene.control.TextBox;
import javafx.scene.control.Button;


/**
* @author Administrator
*/
var x = 10 ;
var y = 10 ;

var lmNums = 20 ;

var landmines :Landmine[] = LandmineMap.getMap(x, y, lmNums) ;

var lmFxs:LmFx[] = [] ;

static var lmClose = Color.WHITE;

var stage:Stage = null ;


class MyCustomNode extends CustomNode {

public override function create(): Node {
return Group {
content: [
for(j in [0 .. y-1]){
for(i in [0 .. x-1]){
lmFxs[j*x+i] = LmFx {
isLm : (landmines[j*x+i].getStatus()==-1);
img : Rectangle {
x: i*26+8, y: j*26+8
width: 24, height: 24
fill: lmClose ;
onMouseReleased: function( e: MouseEvent ):Void {
if(e.button==MouseButton.PRIMARY){
lmFxs[j*x+i].onLeftClick() ;
}
if(e.button==MouseButton.SECONDARY){
lmFxs[j*x+i].onRightClick() ;
}
}
}
status : Text {
x: i*26+8+8, y: j*26+8+16
font : Font {
size: 12
}
visible : false ;
content : "{landmines[j*x+i].getStatus()}" ;
fill: Color.RED
}
}
}
}
]
};
}
}


class LmFx extends CustomNode {
override function create():Node {
return Group {
content:[img,status]
};
}
var flag = false ;
var img:Rectangle = null ;
var status:Text = null ;
var isLm = false ;
function onLeftClick(){
if(not flag){
if(isLm){
setBoard.visible = true;

}else{
img.visible = false ;
status.visible = true ;
}
}
}
function onRightClick(){
if(flag){
img.fill = lmClose;
flag = false ;
}else{
img.fill = Color.RED;
flag = true ;
}
}

}

var width = bind x*24+(x-1)*2+16 ;
var height = bind y*24+(y-1)*2+16 ;

var t1:Text = null ;
var widthField : TextBox = null ;
var heightField : TextBox = null ;
var setBoard = Group {
visible : false ;
blocksMouse: true;
translateX: bind width / 6
translateY: bind height / 4
content: [
Rectangle {
stroke: Color.WHITE
strokeWidth: 3
width: bind width*2/3 ;
height: bind height/2 ;
fill : Color.BLUE;
opacity: 0.5
arcHeight: 10
arcWidth: 10
},
VBox {
translateX: bind width / 8
translateY: bind height / 12
content: [
Text {
content: "宽度:"
textOrigin: TextOrigin.TOP
fill: Color.YELLOW
font: Font.font ( null, FontWeight.BOLD, 15);
},
widthField = TextBox {
text : "10"
columns: 7
selectOnFocus: true
}

Text {

content: "高度:"
textOrigin: TextOrigin.TOP
fill: Color.YELLOW
font: Font.font ( null, FontWeight.BOLD, 15);
},
heightField = TextBox {
text: "10"
columns: 7
selectOnFocus: true
},
Button {
text: "reSet"
action: function() {

}
}



]

}
]
}



function run(){
stage = Stage {
title: "挖地雷"
scene: Scene {
fill : Color.BLACK ;
width: x*24+(x-1)*2+16 ;
height: y*24+(y-1)*2+16 ;
content: [
MyCustomNode{},
setBoard
]
}
}
}
基于51单片机,实现对直流电机的调速、测速以及正反转控制。项目包含完整的仿真文件、源程序、原理图和PCB设计文件,适合学习和实践51单片机在电机控制方面的应用。 功能特点 调速控制:通过按键调整PWM占空比,实现电机的速度调节。 测速功能:采用霍尔传感器非接触式测速,实时显示电机转速。 正反转控制:通过按键切换电机的正转和反转状态。 LCD显示:使用LCD1602液晶显示屏,显示当前的转速和PWM占空比。 硬件组成 主控制器:STC89C51/52单片机(与AT89S51/52、AT89C51/52通用)。 测速传感器:霍尔传感器,用于非接触式测速。 显示模块:LCD1602液晶显示屏,显示转速和占空比。 电机驱动:采用双H桥电路,控制电机的正反转和调速。 软件设计 编程语言:C语言。 开发环境:Keil uVision。 仿真工具:Proteus。 使用说明 液晶屏显示: 第一行显示电机转速(单位:转/分)。 第二行显示PWM占空比(0~100%)。 按键功能: 1键:加速键,短按占空比加1,长按连续加。 2键:减速键,短按占空比减1,长按连续减。 3键:反转切换键,按下后电机反转。 4键:正转切换键,按下后电机正转。 5键:开始暂停键,按一下开始,再按一下暂停。 注意事项 磁铁和霍尔元件的距离应保持在2mm左右,过近可能会在电机转动时碰到霍尔元件,过远则可能导致霍尔元件无法检测到磁铁。 资源文件 仿真文件:Proteus仿真文件,用于模拟电机控制系统的运行。 源程序:Keil uVision项目文件,包含完整的C语言源代码。 原理图:电路设计原理图,详细展示了各模块的连接方式。 PCB设计:PCB布局文件,可用于实际电路板的制作。
【四旋翼无人机】具备螺旋桨倾斜机构的全驱动四旋翼无人机:建模与控制研究(Matlab代码、Simulink仿真实现)内容概要:本文围绕具备螺旋桨倾斜机构的全驱动四旋翼无人机展开研究,重点进行了系统建模与控制策略的设计与仿真验证。通过引入螺旋桨倾斜机构,该无人机能够实现全向力矢量控制,从而具备更强的姿态调节能力和六自由度全驱动特性,克服传统四旋翼欠驱动限制。研究内容涵盖动力学建模、控制系统设计(如PID、MPC等)、Matlab/Simulink环境下的仿真验证,并可能涉及轨迹跟踪、抗干扰能力及稳定性分析,旨在提升无人机在复杂环境下的机动性与控制精度。; 适合人群:具备一定控制理论基础和Matlab/Simulink仿真能力的研究生、科研人员及从事无人机系统开发的工程师,尤其适合研究先进无人机控制算法的技术人员。; 使用场景及目标:①深入理解全驱动四旋翼无人机的动力学建模方法;②掌握基于Matlab/Simulink的无人机控制系统设计与仿真流程;③复现硕士论文级别的研究成果,为科研项目或学术论文提供技术支持与参考。; 阅读建议:建议结合提供的Matlab代码与Simulink模型进行实践操作,重点关注建模推导过程与控制器参数调优,同时可扩展研究不同控制算法的性能对比,以深化对全驱动系统控制机制的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值