`

React学习之围棋记谱本制作(四)前端开发初步完成

阅读更多
  今天初始完成了页面端的开发工作。把遇到的问题说一说。
  (1)开始时,对javascript的对象或数组拷贝、赋值理解不是很透,折磨了我好长时间。 理解了对象或数组的赋值,实际上相当于C语言中的指针地址赋值,就知道了保存每一步的棋盘状态,要把对象拷贝一个副本,避免后继的变化,影响保存的状态。
  (2)JQuery提供了对象拷贝的方法,extend。这个方法有深拷贝、浅拷贝之分,如果浅拷贝,不复制对象中的对象。还有个问题,就是数组拷贝后,会变成一个伪数组,能用下标取值,但不支持length属性。调这个错也用了很长时间。还好chrome支持断点调试。

  目前支持功能:交替落子、布局摆子、撤销、重做、新建布局。界面如下图所示:




  整个工程涉及四个文件。组件文件、状态管理文件、样式文件、网页文件。下面提供的是源码,依赖bootstrap、jquery。

一、状态管理文件GoStateManager.js
/**
 * 用于GO的状态管理。管理所有组件的状态,所有组件订阅事件,同步状态
 * http://wallimn.iteye.com
 */
"use strict"
var Events = require('events');

class GoStateManager {
    constructor() {
        this.initState();
        this.initList();
        this.eventEmitter = new Events.EventEmitter();
        this.eventEmitter.setMaxListeners(500);

        var t1 = this.getDefaultPieceState();
        var t2 = this.getDefaultPieceState();

    };

    //一个棋子的初始状态
    getDefaultPieceState(){
        return {visibility:'hidden',num:0,black:false};
    }

    //所有棋子的初始状态
    getDefaultPieces(){
        var pieces=[];//所有棋子状态
        for(var i=0 ; i<19*19; i++) pieces.push(this.getDefaultPieceState());
        return pieces;
    }

    initState(){
        //指示当前要下的子的状态,该状态使用后,调用next方法,切换状态
        this.current= {
            index:1,//当前步数
            goBlack:true,//是否是黑子,指行棋时
            placeBlack:true,//是否是黑子,指布局时
            numShow:false,//是否显示数字
            place:false,//是否是布局摆子,如果是,不改变当前步数,布局时摆的棋子上面不显示数字
        };
        //所有棋子的状态
        this.pieces = this.getDefaultPieces();

    }

    //初始化重做、撤销两个队列
    initList(){
        this.undoList = [];//后进先出队列
        this.redoList = [];//后进先出队列
    }

    //将状态压栈,保存,保存的是对象的副本。
    pushUndoList(current,pieces){
        this.undoList.push({
            current:this.cloneObject(current),
            pieces:this.cloneObject(pieces)
        });

    }

    //清空RedoList,当执行下一步时执行此方法
    clearRedoList(){
        var len=this.redoList.length;
        if(len>0)
            this.redoList.splice(0,len);
    }

    //将状态压栈,保存,保存的是对象的副本。
    pushRedoList(current,pieces){
        this.redoList.push({
            current:this.cloneObject(current),
            pieces:this.cloneObject(pieces)
        });
    }

    //弹出队列中的元素,复制一个副本
    popList(list) {
        var record = list.pop();
        return {
            current: this.cloneObject(record.current),
            pieces: this.cloneObject(record.pieces)
        }
    }

    //输出链表内容,用于调试
    printList(list){
        for(var i=0; i<list.length; i++){
            console.log("第%d步:%s",i,this.getVisiblePieces(list[i].pieces));
        }

    }

    getVisiblePieces(pieces){
        var info = "";
        for(var j=0; j<19*19; j++){
            if(pieces[j].visibility=='visible'){
                info = info+pieces[j].num+',';
            }
        }
        //console.log("可见棋子序号:"+info);
        return info;
    }

    //撤销
    undo(){
        if (this.undoList.length==0){
            console.log("不能撤销了!");
            return;
        }

        //当前状态压入RedoList
        this.pushRedoList(this.current,this.pieces);

        var record = this.popList(this.undoList)
        this.current = record.current;
        this.pieces = record.pieces;

        this.pubCurrentChange();
        this.pubPieceChange();
    }

    //前进一步
    redo(){
        if (this.redoList.length==0){
            console.log("不能前进了!");
            return;
        }

        this.pushUndoList(this.current,this.pieces);

        var record = this.popList(this.redoList)
        this.current = record.current;
        this.pieces = record.pieces;

        //this.printList(this.undoList);
        //this.printList(this.redoList);

        this.pubCurrentChange();
        this.pubPieceChange();

    }

    //订阅当前状态变化事件
    subCurrentChange(listener) {
        //console.log("订阅状态事件!");
        this.eventEmitter.addListener('currentChange',listener);
    }

    //状态当前变化事件发生,通知监听器
    pubCurrentChange(){
        //console.log("发布状态事件");
        this.eventEmitter.emit("currentChange",this.current);
    }

    //订阅棋子状态变化事件
    subPieceChange(listener) {
        //console.log("订阅棋子事件!");
        this.eventEmitter.addListener('pieceChange',listener);
    }

    //状态棋子变化事件发生,通知监听器
    pubPieceChange(){
        //console.log("发布棋子事件");
        //传递数据,对解耦有一点儿帮助
        this.eventEmitter.emit("pieceChange",this.pieces);
    }

    //推进当前状态到下一步
    //这个函数内部调用
    next(){
        this.printList(this.undoList);

        if(this.current.place==true){
            //如果是布局状态,不改变编号、颜色
        }
        else{
            this.current.index++;
            this.current.goBlack=!this.current.goBlack;
        }
        this.pubCurrentChange();

    }

    //克隆对象
    //数组被jquery复制后,变成了类数组(伪数组),不带有length方法,这个也比较坑
    cloneObject(object){
        return $.extend(true,{},object);//深层次复制。这个比较坑
    }

    //是否处于布局状态
    isPlace(){
        return this.current.place==true;
    }

    //设置布局状态
    setPlace(bBlack){
        this.current.place=true;
        this.current.placeBlack=(bBlack==true);
        this.pubCurrentChange();
    }

    //重新开始
    restart(){
        this.initState();
        this.initList();
        this.pubCurrentChange();
        this.pubPieceChange();
    }

    //返回当前的步数
    getCurrentIndex(){
        return this.current.index;
    }

    //返回当前状态
    getCurrent(){
        return this.current;
    }

    //返回所有棋子状态
    getPieces(){
        return this.pieces;
    }

    //设置先行方
    setFirst(bBlack) {
        this.current.place = false;
        //仅处于第一步时,可以改变行棋的黑白颜色
        if( this.current.index==1){
            this.current.goBlack=(bBlack==true);
        }
        this.pubCurrentChange();

    }

    //在棋上点击
    //如果棋子状态变化,则返回为true,否则返回false
    clickPiece(index){
        //每次下一步之前的状态都记下来,以便能够回退
        this.pushUndoList(this.current,this.pieces);
        this.clearRedoList();

        var state=this.pieces[index];//应该传递的是指针,相当于起了个别名,实际对应同一块内存地址

        if (state.visibility=='visible' && this.isPlace()==false){//棋子可见、非布局状态
            console.log("棋子可见、非布局状态,退出!");
            return false;
        }
        if (state.visibility=='visible' && this.isPlace()==true && state.num!=0){//棋子可见、布局状态,且非布局棋子
            console.log("棋子可见、布局状态,且非布局棋子,退出!");
            return false;
        }

        //console.log('可以修改棋子状态');
        if (this.isPlace()==false){//行棋中
            state.num = this.current.index;
            state.black = this.current.goBlack;
            state.visibility = 'visible';
        }
        else{//布局
            state.num=0;//布局状态下,放的棋子,其数字设置为0
            //如果原来棋子已经显示,且颜色相同,用是布局摆的棋子,设置其隐藏
            if(state.visibility=='visible' && this.current.placeBlack==state.black && state.num==0){
                state.visibility = 'hidden';
                //棋子颜色不重要,下次再显示时,会设置颜色
            }
            else{
                state.black = this.current.placeBlack;
                state.visibility = 'visible';
            }
        }

        this.pubPieceChange();
        //StateManager.setPieceState(this.state.pieceId,state);//这里有点儿乱
        //这个放最后,完成大大压栈工作
        this.next();
        //this.setState(state);
        return true;
    }

}

module.exports = new GoStateManager();


二、组件文件Go.js
//http://wallimn.iteye.com
var React = require('react');
var ReactDOM = require('react-dom');
require('../../../css/go.css');
var StateManager = require('../../store/main/GoStateManager');
"user strick"
//当前步状态指示器,可以指标当前步数、落子方、是否处理布局状态等信息
class CurrentLabel extends React.Component{
	constructor(props){
		super(props);
		//使用全局的状态作为初始状态
		var current = StateManager.getCurrent();
		this.state={
			index:current.index,
			goBlack:current.goBlack,
			placeBlack:current.placeBlack,
			place:current.place,
		};
		//设置currentChange函数的this
		this.currentChange=this.currentChange.bind(this);
		//注册事件监听器
		StateManager.subCurrentChange(this.currentChange);
	}

	//状态改变事件监听器,调整组件的状态
	currentChange(current){
		this.setState({
			index:current.index,
			goBlack:current.goBlack,
			placeBlack:current.placeBlack,
			place:current.place,
		});
	}

	render(){
		return <span className="bg-success">
            <strong>当前步数:</strong>{this.state.index}
			<strong> 落子方:</strong>{this.state.goBlack==true?'黑方':'白方'}
			<strong> 布局子:</strong>{this.state.placeBlack==true?'黑子':'白子'}
			<strong> 状态:</strong>{this.state.place==true?'布局':'行棋'}
        </span>;
	}
}

//围棋桌面
class GoDesk extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            refresh: false
        };
    }

    render() {
        var self = this;
        this.state.refresh=false;
        var pieces = [];
		//每个交叉点上都放一个子,只是未点击时不显示,棋子黑白、编号都不重要,用户点击时会修改
        for (var i=0; i<19*19; i++){
        	pieces.push(
        		<GoPiece black={i % 2==0 ?true:false} key={'go'+(i+1)} pieceId={i}/>
        	);
        }
        return <div className="go-desk">
			<div className="go-opr">
				<GoBtns />
			</div>
        	<div className="go-board">
				{pieces}		        		
        	</div>
			<div className="text-center">
				<CurrentLabel />
			</div>
        </div>;
    }
}

//使用bootstap的按钮组,可以不用控制按钮的状态,较为方便,还没有完全走通
//使用radio按钮组实现几个控制行棋的按钮,因为只能处于其中一个状态
class GoBtns extends React.Component{
	constructor(props){
		super(props);
		this.state={index:1};//指标按钮的激活状态,没有完成
		this.setFirstClickHandle=this.setFirstClickHandle.bind(this);
		this.setPlaceClickHandle=this.setPlaceClickHandle.bind(this);
		this.newClickHandle=this.newClickHandle.bind(this);
		this.saveClickHandle=this.saveClickHandle.bind(this);
		this.loadClickHandle=this.loadClickHandle.bind(this);

		this.redoClickHandle=this.redoClickHandle.bind(this);
		this.undoClickHandle=this.undoClickHandle.bind(this);
	}

	//这个还没有验证
	getActiveBtnIndex(){
		if (StateManager.current.place==false) return 1;//黑先、白先差别不大,似乎没有影响
		else if (StateManager.current.placeBlack)return 2;
		else return 3;
	}
	//设置黑先
	setFirstClickHandle(bBlack){
		console.log("设置落子方颜色:"+bBlack);
		StateManager.setFirst(bBlack);
	}

	setPlaceClickHandle(bBlack){
		console.log("设置布局子颜色:"+bBlack);
		StateManager.setPlace(bBlack);
	}

	newClickHandle(){
		if (confirm('您确定要新建布局吗?')==true){
			StateManager.restart();
		}
	}

	saveClickHandle(){
		alert("暂示实现");
	}

	loadClickHandle(){
		alert("暂示实现");
	}
	redoClickHandle(){
		StateManager.redo();
	}

	undoClickHandle(){
		StateManager.undo();
	}
	render(){
		return <div>
					<span>
						<div className="btn-group" data-toggle="buttons">
						  <label className="btn btn-sm btn-default active" onClick={this.setFirstClickHandle.bind(this,true)}><input type="radio" autoComplete="off" defaultChecked title="黑方先走" />黑先</label>
						  <label className="btn btn-sm btn-default" onClick={this.setFirstClickHandle.bind(this,false)}><input type="radio" autoComplete="off" />白先</label>
						  <label className="btn btn-sm btn-default" onClick={this.setPlaceClickHandle.bind(this,true)}><input type="radio" autoComplete="off" />黑子</label>
						  <label className="btn btn-sm btn-default" onClick={this.setPlaceClickHandle.bind(this,false)}><input type="radio" autoComplete="off" />白子</label>
						</div>
					</span>

					<span>
						<button className="btn btn-sm btn-default" onClick={this.newClickHandle}>新建</button>
						<button className="btn btn-sm btn-default" onClick={this.saveClickHandle}>保存</button>
						<button className="btn btn-sm btn-default" onClick={this.loadClickHandle}>打开</button>
					</span>

					<span>
						<button className="btn btn-sm btn-default" onClick={this.undoClickHandle}>撤销</button>
						<button className="btn btn-sm btn-default" onClick={this.redoClickHandle}>重做</button>
					</span>
				</div>;
	}
}

//棋子
class GoPiece extends React.Component{
	constructor(props){
		super(props);
		var pieceId = props.pieceId;
		var pieceState = StateManager.getPieces()[pieceId];
		this.state={
			showNum:true,//是否显示数字,这个应该是个全局参数
			num:pieceState.num,//子上显示的数字,如果为零,表示布局时摆的子,不显示数字
			black:pieceState.black,//true表示为黑
			last:false,//是否是最后一个子
			pieceId:pieceId,//棋子的ID,左上为0,从左到右、从上到下,赋值后不发生变化
			visibility:pieceState.visibility,//不可见时,为未放子或者被吃掉,从全局变量中取,
		}
		
		//设置this,很重要
		this.handleClick=this.handleClick.bind(this);
		this.pieceChange=this.pieceChange.bind(this);
		StateManager.subPieceChange(this.pieceChange);
	}

	pieceChange(piecesArray){
		//React会判断UI要不要更新,全部更新,不要紧
		this.setState({
				visibility:piecesArray[this.state.pieceId].visibility,
				black:piecesArray[this.state.pieceId].black,
				num:piecesArray[this.state.pieceId].num,
				showNum:StateManager.current.numShow,
				last:piecesArray[this.state.pieceId].num==StateManager.current.index,//没有想好如何判断
		});
	}

	//这个函数不直接改变自己组件的状态
	handleClick(){
		StateManager.clickPiece(this.state.pieceId);
	}
	
	render(){
		var className="go-piece go-piece-"+(this.state.black==true?'black':'white');
		//console.log(this.state);
		if (this.state.visibility=='hidden') className = className+" go-piece-hidden";

		var pieceNum = this.state.num==0?'':this.state.num;
		return <div className={className} onClick={this.handleClick} id={'piece_'+this.state.pieceId}>
			<span style={{visibility:this.state.visibility}}>{pieceNum}</span>
		</div>;
	}
}

ReactDOM.render(
  <GoDesk />,
  document.getElementById('go-container')
);


三、样式文件go.css
html,body{
	height:100%;
}
.go-desk{
	background-image:url(../img/go/bk.png);
	width:100%;
	height:100%;
	padding:20px;
}

.go-opr{
	height:30px;
	text-align:center;
	margin-bottom:1em;
}
.go-opr span{
	margin:0 0.5em;
}
.go-opr span button{
	margin:0 0.05em;
}

.go-board{
	width:800px;
	height:800px;
	margin:0 auto;
	background-image:url(../img/go/board.png);
	background-repeat:no-repeat;
	padding:20px;
}

.go-piece{
	width:40px;
	height:40px;
	float:left;
	background-image:url(../img/go/piece.png);
	text-align:center;
	line-height:40px;
	vertical-align:middle;
	font-size:20px;
}
.go-piece span{
}
.go-piece-white{
	background-position:-40px 0;
	color:black;
}
.go-piece-black{
	background-position:0 0;
	color:white;
}
.go-piece-hidden{
	background-image:none;

}


四、网页文件go.html
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8"/>
    <title><%= htmlWebpackPlugin.options.title%></title>
</head>
<body>
    <div id="go-container"></div>
</body>
</html>


  编译好的文件,请点击附件下载,可以单机基于浏览器运行。所有源码已经托管到码云,访问地址:https://git.oschina.net/wallimn/rwne.git。把插件也传上去了,有点儿大。
  • 大小: 445.6 KB
分享到:
评论

相关推荐

    基于ssm的网络教学平台(有报告)。Javaee项目,ssm项目。

    重点:所有项目均附赠详尽的SQL文件,这一细节的处理,让我们的项目相比其他博主的作品,严谨性提升了不止一个量级!更重要的是,所有项目源码均经过我亲自的严格测试与验证,确保能够无障碍地正常运行。 1.项目适用场景:本项目特别适用于计算机领域的毕业设计课题、课程作业等场合。对于计算机科学与技术等相关专业的学生而言,这些项目无疑是一个绝佳的选择,既能满足学术要求,又能锻炼实际操作能力。 2.超值福利:所有定价为9.9元的项目,均包含完整的SQL文件。如需远程部署可随时联系我,我将竭诚为您提供满意的服务。在此,也想对一直以来支持我的朋友们表示由衷的感谢,你们的支持是我不断前行的动力! 3.求关注:如果觉得我的项目对你有帮助,请别忘了点个关注哦!你的支持对我意义重大,也是我持续分享优质资源的动力源泉。再次感谢大家的支持与厚爱! 4.资源详情:https://blog.csdn.net/2301_78888169/article/details/144929660 更多关于项目的详细信息与精彩内容,请访问我的CSDN博客!

    2024年AI代码平台及产品发展简报-V11.pdf

    2024年AI代码平台及产品发展简报-V11

    蓝桥杯JAVA代码.zip

    蓝桥杯算法学习冲刺(主要以题目为主)

    QPSK调制解调技术研究与FPGA实现:详细实验文档的探索与实践,基于FPGA实现的QPSK调制解调技术:实验文档详细解读与验证,QPSK调制解调 FPGA设计,有详细实验文档 ,QPSK调制解调;

    QPSK调制解调技术研究与FPGA实现:详细实验文档的探索与实践,基于FPGA实现的QPSK调制解调技术:实验文档详细解读与验证,QPSK调制解调 FPGA设计,有详细实验文档 ,QPSK调制解调; FPGA设计; 详细实验文档,基于QPSK调制的FPGA设计与实验文档

    PID、ADRC和MPC轨迹跟踪控制器在Matlab 2018与Carsim 8中的Simulink仿真研究,PID、ADRC与MPC轨迹跟踪控制器在Matlab 2018与Carsim 8中的仿真研

    PID、ADRC和MPC轨迹跟踪控制器在Matlab 2018与Carsim 8中的Simulink仿真研究,PID、ADRC与MPC轨迹跟踪控制器在Matlab 2018与Carsim 8中的仿真研究,PID, ADRC和MPC轨迹跟踪控制器Simulink仿真模型。 MPC用于跟踪轨迹 ADRC用于跟踪理想横摆角 PID用于跟踪轨迹 轨迹工况有双移线,避障轨迹,正弦轨迹多种 matlab版本为2018,carsim版本为8 ,PID; ADRC; MPC; 轨迹跟踪控制器; Simulink仿真模型; 双移线; 避障轨迹; 正弦轨迹; MATLAB 2018; CarSim 8,基于Simulink的PID、ADRC与MPC轨迹跟踪控制器仿真模型研究

    基于Springboot的个性化图书推荐系统。Javaee项目,springboot项目。

    重点:所有项目均附赠详尽的SQL文件,这一细节的处理,让我们的项目相比其他博主的作品,严谨性提升了不止一个量级!更重要的是,所有项目源码均经过我亲自的严格测试与验证,确保能够无障碍地正常运行。 1.项目适用场景:本项目特别适用于计算机领域的毕业设计课题、课程作业等场合。对于计算机科学与技术等相关专业的学生而言,这些项目无疑是一个绝佳的选择,既能满足学术要求,又能锻炼实际操作能力。 2.超值福利:所有定价为9.9元的项目,均包含完整的SQL文件。如需远程部署可随时联系我,我将竭诚为您提供满意的服务。在此,也想对一直以来支持我的朋友们表示由衷的感谢,你们的支持是我不断前行的动力! 3.求关注:如果觉得我的项目对你有帮助,请别忘了点个关注哦!你的支持对我意义重大,也是我持续分享优质资源的动力源泉。再次感谢大家的支持与厚爱! 4.资源详情:https://blog.csdn.net/2301_78888169/article/details/144486173 更多关于项目的详细信息与精彩内容,请访问我的CSDN博客!

    Matlab实现Transformer-Adaboost时间序列预测的详细项目实例(含完整的程序,GUI设计和代码详解)

    内容概要:本文档详细介绍了一个利用Matlab实现Transformer-Adaboost结合的时间序列预测项目实例。项目涵盖Transformer架构的时间序列特征提取与建模,Adaboost集成方法用于增强预测性能,以及详细的模型设计思路、训练、评估过程和最终的GUI可视化。整个项目强调数据预处理、窗口化操作、模型训练及其优化(包括正则化、早停等手段)、模型融合策略和技术部署,如GPU加速等,并展示了通过多个评估指标衡量预测效果。此外,还提出了未来的改进建议和发展方向,涵盖了多层次集成学习、智能决策支持、自动化超参数调整等多个方面。最后部分阐述了在金融预测、销售数据预测等领域中的广泛应用可能性。 适合人群:具有一定编程经验的研发人员,尤其对时间序列预测感兴趣的研究者和技术从业者。 使用场景及目标:该项目适用于需要进行高质量时间序列预测的企业或机构,比如金融机构、能源供应商和服务商、电子商务公司。目标包括但不限于金融市场的波动性预测、电力负荷预估和库存管理。该系统可以部署到各类平台,如Linux服务器集群或云计算环境,为用户提供实时准确的预测服务,并支持扩展以满足更高频率的数据吞吐量需求。 其他说明:此文档不仅包含了丰富的理论分析,还有大量实用的操作指南,从项目构思到具体的代码片段都有详细记录,使用户能够轻松复制并改进这一时间序列预测方案。文中提供的完整代码和详细的注释有助于加速学习进程,并激发更多创新想法。

    液滴穿越障碍:从文献到案例的复现研究,液滴破裂与障碍物穿越:文献复现案例研究,液滴生成并通过障碍物破裂 该案例是文献复现,文献与案例一起 ,液滴生成; 障碍物破裂; 文献复现; 案例研究,液滴破

    液滴穿越障碍:从文献到案例的复现研究,液滴破裂与障碍物穿越:文献复现案例研究,液滴生成并通过障碍物破裂。 该案例是文献复现,文献与案例一起。 ,液滴生成; 障碍物破裂; 文献复现; 案例研究,液滴破裂:障碍挑战的文献复现案例

    蓝桥杯练习题_2.zip

    蓝桥杯算法学习冲刺(主要以题目为主)

    蓝桥杯笔记,用于个人学习进步.zip

    蓝桥杯算法学习冲刺(主要以题目为主)

    基于最小递归二乘法的MPC自适应轨迹跟踪控制优化 针对轮胎刚度时变特性提升模型精度与鲁棒性,仿真验证满足车辆低速高精度跟踪与高速稳定性提升 ,基于变预测时域MPC自适应轨迹跟踪控制与轮胎侧偏刚度优化提

    基于最小递归二乘法的MPC自适应轨迹跟踪控制优化 针对轮胎刚度时变特性提升模型精度与鲁棒性,仿真验证满足车辆低速高精度跟踪与高速稳定性提升。,基于变预测时域MPC自适应轨迹跟踪控制与轮胎侧偏刚度优化提升模型精度和鲁棒性,基于变预测时域的MPC自适应轨迹跟踪控制,针对轮胎刚度时变的特点造成控制模型精度降低,基于最小递归二乘法(RLS)估算的轮胎侧偏刚度,提升了模型的控制精度和鲁棒性,通过carsim与simulink联合仿真结果发现,改进后的轨迹跟踪控制器既满足了车辆低速行驶下的轨 迹跟踪精度,也一定程度上克服了高速下车辆容易失去稳定性的问题。 有详细的lunwen分析说明和资料,以及本人的,仿真包运行。 ,基于变预测时域的MPC; 自适应轨迹跟踪控制; 轮胎刚度时变; 控制模型精度降低; 最小递归二乘法(RLS)估算; 模型控制精度和鲁棒性提升; carsim与simulink联合仿真; 轨迹跟踪控制器; 车辆稳定性。,基于变预测时域MPC的轮胎刚度自适应轨迹跟踪控制策略研究

    GMSK调制解调技术研究:基于FPGA设计与实验详解,GMSK调制解调技术详解:基于FPGA设计的实验文档与实践应用,GMSK调制解调 FPGA设计,有详细实验文档 ,GMSK调制解调; FPGA设计

    GMSK调制解调技术研究:基于FPGA设计与实验详解,GMSK调制解调技术详解:基于FPGA设计的实验文档与实践应用,GMSK调制解调 FPGA设计,有详细实验文档 ,GMSK调制解调; FPGA设计; 详细实验文档; 实验结果分析,GMSK调制解调技术:FPGA设计与实验详解

    (源码)基于Arduino和Python的Cansat卫星系统.zip

    # 基于Arduino和Python的Cansat卫星系统 ## 项目简介 本项目是一个Cansat卫星系统,旨在设计和实现一个小型卫星模型,通过火箭发射至1公里高空,并使用地面站接收其传输的数据。项目涉及Arduino编程、Python数据处理和可视化。 ## 主要特性和功能 1. 硬件组件 使用Arduino Nano作为Cansat的微控制器。 搭载BMP 280温度和压力传感器、ATGM336H GPS模块、LoRa通信模块等。 地面站使用Arduino Uno和LoRa通信模块接收数据。 2. 数据处理 使用Python进行数据处理和可视化,包括数据清洗、计算风速、绘制温度、压力、风速和海拔随时间变化的图表等。 3. 通信与控制 通过LoRa模块实现Cansat与地面站之间的数据传输。 提供实时监视和记录数据的脚本。 ## 安装和使用步骤 ### 1. 硬件准备

    LongSung-USB-Drivers-V2.0-for-Windows

    U9300C 龙尚4G模块安装后模块才能正常使用,win7 win10驱动程序,支持USB转接板。

    (源码)基于Arduino平台的物联网温湿度监控系统.zip

    # 基于Arduino平台的物联网温湿度监控系统 ## 项目简介 这是一个基于Arduino平台的物联网温湿度监控项目,旨在通过简单的硬件设备实现环境数据的实时监测与远程管理。该项目适用于智能家居、农业种植等领域。 ## 项目的主要特性和功能 1. 温湿度数据采集通过Arduino板连接温湿度传感器,实时采集环境数据。 2. 数据传输将采集到的数据通过无线网络模块发送到服务器或远程终端。 3. 数据可视化可在电脑或移动设备端展示实时的温湿度数据。 4. 报警功能当温湿度数据超过预设阈值时,自动触发报警通知。 ## 安装使用步骤 前提假设用户已经下载了本项目的源码文件。以下是简单明了的安装使用步骤 1. 环境准备安装Arduino开发环境,配置必要的硬件接口。 2. 硬件连接将Arduino板与温湿度传感器、无线网络模块连接。 3. 代码上传将本项目提供的Arduino代码上传至Arduino板。

    基于需求响应与清洁能源接入的配电网重构优化:综合成本与混合整数凸规划模型分析(matlab实现),基于需求响应与清洁能源接入的配电网重构算法研究:网损与成本优化的仿真分析,高比例清洁能源接入下计及需求

    基于需求响应与清洁能源接入的配电网重构优化:综合成本与混合整数凸规划模型分析(matlab实现),基于需求响应与清洁能源接入的配电网重构算法研究:网损与成本优化的仿真分析,高比例清洁能源接入下计及需求响应的配电网重构(matlab代码) 该程序复现《高比例清洁能源接入下计及需求响应的配电网重构》,以考虑网损成本、弃风弃光成本和开关操作惩罚成本的综合成本最小为目标,针对配电网重构模型的非凸性,引入中间变量并对其进行二阶锥松弛,构建混合整数凸规划模型,采用改进的 IEEE33 节点配电网进行算例仿真,分析了需求响应措施和清洁能源渗透率对配电网重构结果的影响。 该程序复现效果和出图较好(详见程序结果部分),注释清楚,方便学习 ,高比例清洁能源; 需求响应; 配电网重构; 二阶锥松弛; 综合成本最小化; MATLAB代码; IEEE33节点配电网; 复现效果; 出图; 注释清楚。,Matlab代码复现:高比例清洁能源接入下的配电网重构模型与需求响应分析

    (源码)基于C++的RapidJSON库测试项目.zip

    # 基于C++的RapidJSON库测试项目 ## 项目简介 本项目是一个基于C++的RapidJSON库测试项目,主要用于测试RapidJSON库的功能正确性、性能以及稳定性。RapidJSON是一个高效的C++ JSON解析生成库,广泛应用于各种场景。本项目通过编写一系列的单元测试,覆盖了RapidJSON库的主要功能点,包括JSON解析、生成、内存管理、编码转换等,以确保RapidJSON库在各种情况下都能正确、稳定地工作。 ## 项目的主要特性和功能 1. 单元测试框架使用Google Test测试框架进行单元测试,确保测试的可靠性和可扩展性。 2. 全面测试覆盖覆盖了RapidJSON库的主要功能点,包括JSON解析、生成、内存管理、编码转换等,以及针对各种输入数据的测试。 3. 性能测试通过性能基准测试,评估RapidJSON库在处理不同规模和类型的JSON数据时的性能表现。

    蓝桥杯单片机十一届试题.zip

    蓝桥杯算法学习冲刺(主要以题目为主)

    vmware虚拟机安装教程.docx

    内容概要:本文详细介绍如何安装和初步使用 VMware 虚拟机,从下载安装 VMware 到创建和配置新的虚拟机。主要内容包括:软件选择和安装步骤、虚拟机的新建配置、操作系统安装及初始化设置、安装 VMware Tools 提升性能以及一些常用的 VMWare 功能,如虚拟网络的不同连接方式及其应用场景。同时介绍了 VMware 软件在网络连接管理和服务配置方面的一些要点,确保虚拟机正常运行。 适用人群:计算机操作较为熟练、有意搭建不同操作系统测试环境的技术人员,以及想要了解虚拟机基本概念及应用的学生。 使用场景及目标:适合于个人用户进行系统兼容性和安全性的验证;适用于企业或开发者做软件测试、模拟复杂环境下作业,确保不影响宿主机正常工作的前提下完成多种任务;适用于教学培训环境中部署实验平台。此外,还可以用来隔离特定业务流程(比如银行工具)、探索不同类型操作系统的特点。 其他说明:需要注意的是,为了避免安装过程中出现问题,建议暂时关闭杀毒软件和防火墙。安装 VMware 需要接受许可协议,同时可以选择安装路径和安装类型(典型/自定义)。最后,对于网络设置,默认提供的三种模式——桥接模式、仅主机模式和 NAT 模式,可以帮助用户根据不同需求灵活调整网络连接方式。

    java毕业设计之网上校友录设计源码.zip

    java毕业设计源码

Global site tag (gtag.js) - Google Analytics