React学习之围棋记谱本制作(二)棋盘、棋子、交替落子

2023-10-31

  与儿子一起学围棋,上网上找,发现好用的记谱本软件特别少,打算自己做一个。不知能不能克服惰性,完成这个目标。
  千里之行,始于足下,今天完成了基础工作:棋盘、棋子组件,并完成了交替落子功能。是React基本功能的很好示范,代码贴一下。下一步就是多组件的状态管理、共享了。
  这里刚开始使用的是全局变量来管理状态,后来发现这是一个不太对路的方法,后来改用了全局的一个状态管理类来统一管理状态、处理状态变化、订阅监听、激活事件,后面的文章会介绍。

[b]一、组件go.js[/b]
  想出了一个简单的、避免反复修改DOM的办法,将所有棋子组件在初始化都生成,通过状态控制其是否显示、响应点击事件。

var React = require('react');
var ReactDOM = require('react-dom');
require('../../../css/go.css');

//全局变量
window.gGoConfig = new GoConfig();

class GoConfig{
constructor(){
this.index=0;
this.black=true;
}

inc(){
this.index++;
this.black=!this.black;
console.log(this);
}
}

//围棋桌面
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 color={i % 2==0 ? 'white':'black'} id={'go'+(i+1)} key={'go'+(i+1)}/>
);
}
return <div className="go-desk">
<div className="go-opr">
<GoBtn title="黑走"/>
<GoBtn title="白走"/>
<GoBtn title="黑子"/>
<GoBtn title="白子"/>
</div>
<div className="go-board">
{pieces}
</div>
</div>;
}
}

//可以控制单个按钮的状态
class GoBtn extends React.Component{
constructor(props){
super(props);
this.state={
active:false,
}
this.clickHandle=this.clickHandle.bind(this);
}

clickHandle(event){
this.setState({active:!this.state.active});
console.log(this.state);
}
//<img src=img/{this.state.png} />
render(){
var className = "btn btn-default btn-sm";
if(this.state.active==true)className = className+" active";
return <button className={className} onClick={this.clickHandle}>{this.props.title}</button>;
}
}

//使用bootstap的按钮组,可以不用控制按钮的状态,较为方便,还没有完全走通
class GoBtns extends React.Component{
constructor(props){
super(props);
this.state={};
this.clickHandle=this.clickHandle.bind(this);
}

clickHandle(idx){
this.setState({index:idx});
}
render(){
return <div class="btn-group" data-toggle="buttons">
<label class="btn btn-primary active"><input type="checkbox" autocomplete="off" checked />黑走(pre-checked)</label>
<label class="btn btn-primary"><input type="checkbox" autocomplete="off" />白走</label>
<label class="btn btn-primary"><input type="checkbox" autocomplete="off" />黑子</label>
<label class="btn btn-primary"><input type="checkbox" autocomplete="off" />白子</label>
</div>;
}
}

//棋子
class GoPiece extends React.Component{
constructor(props){
super(props);
this.state={
showNum:false,
num:0,
color:props.color,//or w
current:false,
visibility:'hidden',
}

//设置this,很重要
this.handleClick=this.handleClick.bind(this);
}

handleClick(event){
this.setState({
visibility:this.state.visibility=='hidden'?'visible':'hidden',
color:window.gGoConfig.black==true?'black':'white',
});
//console.log('click, visibility='+this.state.visibility);
window.gGoConfig.inc();
}

render(){
var className="go-piece go-piece-"+this.state.color;
if (this.state.visibility=='hidden') className = className+" go-piece-hidden";
//console.log(className);
return <div className={className} id={this.props.id} onClick={this.handleClick}>
<span style={{visibility:this.state.visibility}}>{this.state.num=window.gGoConfig.index}</span>
</div>;// style={{visibility:this.state.visibility}}
}
}

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


[b]二、样式文件go.css[/b]

.go-desk{
background-image:url(../img/go/bk.png);
width:100%;
height:100%;
padding:20px;
}

.go-opr{
height:30px;
text-align:center;
margin-bottom:10px;
}

.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;

}


[b]三、效果[/b]
[align=center]
[img]http://dl2.iteye.com/upload/attachment/0121/7222/f547fb9c-7b4b-33bb-8dde-fb1aad90df2b.png[/img]
[/align]

[b]四、全部代码[/b]
  全部代码下载,请看系列文章第一部分,或点击:http://dl.iteye.com/topics/download/536961c7-38a6-38af-b034-c48034f2aa91
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React学习之围棋记谱本制作(二)棋盘、棋子、交替落子 的相关文章

随机推荐

  • 前端学习之原生JS实现addClass及removeClass方法的封装

    addclass方法封装 HTML代码 div class two div div class two three div JS代码 var o1 document querySelector b1 var o2 document quer
  • python 选择结构

    选择 用于判断 注意符号 单分支 If 条件 条件成立就执行if缩进的代码 双分支 If 条件 条件成立就执行if缩进的代码 Else 条件 条件不成立就执行else缩进的代码
  • 调整计算机硬盘大小,详细教您怎么调整硬盘分区

    新买的电脑很多磁盘只有一两个 很多时候需要对资料分区管理 甚至有些磁盘容量的分配不是很合理的 这时候怎么解决呢 就要我们对硬盘重新分区大小了 下面由小编给你带来硬盘分区的详细操作步骤 新买的笔记本 有时候会发现整个硬盘只有一个分区 如果将所
  • SpringCloud之服务发现

    1 服务提供者接口 以获取一个订单接口为例 order服务对user服务进行远程调用获取user基本信息 user服务提供的接口如下 package com acx controller import com acx pojo vo Act
  • 白盒测试——代码检查法

    代码检查法是静态的 不用生成测试用例并驱动被测程序运行来发现错误 代码检查法分为三种 一 代码审查 代码审查被认为是软件业最佳的实践 人们可以审查任何一种软件工作产品 包括需求和设计文档 源代码 测试文档及项目计划等 1 代码审查角色 主持
  • unity AR 教程

    start Frist 去Vuforia 官网注册新号 获取 LicenseKey链接地址 https developer vuforia com 如果unity是2017 2以上会在unity安装的时候自带AR组件 如果是老版本 就下载下
  • 华硕主板如何设置开机自启_华硕主板每次开机都进bios 华硕主板开机总是自动进入了BIOS设置界面怎么办?...

    华硕主板开机总是自动进入了BIOS设置界面怎么办 华硕笔记本若电脑一开机自动进入bios设置 可按以下操作更改BIOS设置 1 开机的时候长按F2键进入BIOS界面 通过方向键进 Secure 菜单 通过方向键选择 Secure Boot
  • Android疑难解决-Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8.

    编译项目报错 版本错误 Build file xxx build gradle line 2 An exception occurred applying plugin request id com android application
  • flutter 手势控制

    flutter 手势控制 事件监听 1 指针事件Point 2 手势识别Gesture 3 跨组件事件 在大前端的开发中 必然存在着各种各样和用户交互的情况 比如手指点击 手指滑动 双击 长按等 在Flutter中 手势有两个不同的层次 第
  • QT 的 QSS 的基本概念

    https www cnblogs com davesla archive 2011 01 30 1947928 html 借用css 的灵感 Qt也支持Qt自己的css 简称qss 同css 相似 qss的主要功能与最终目的都是能使界面的
  • C - Check The Text(string)

    C Check The Texthttps vjudge csgrandeur cn problem Gym 102263C Roze有一个特殊的键盘 只有29个键 26个字母a z键 打印26个小写拉丁字母 空格 键 打印一个空格 Cap
  • 机器学习比较好的视频资源

    吴恩达 经典入门课程 中英字幕 吴恩达机器学习系列课程 哔哩哔哩 bilibili www bilibili com video BV164411b7dx spm id from 333 999 0 0正在上传 重新上传取消 双语字幕 吴恩
  • JavaScript中window.print()打印

    JavaScript中使用window print 打印方法时 打印的是当前页的所有内容 所以如果直接在当前页使用此打印方法应先保存当前页面再把打印部分替换当前页面执行完之后再替换回来 或者新打开一个页面 把所打印的部分都写到新打开的页面上
  • Windows10中CUDA cundnn pytorch环境搭建记录

    关于在win10中安装cuda cudnn及pytorch全家桶 torch torchvision torchaudio 的详细安装步骤 可以参考这个帖子 说的非常详细 win10下pytorch gpu安装以及CUDA详细安装过程 仅在
  • ArchLinux安装slock锁屏(suckless)

    简介 一款suckless团队开发的锁屏小工具 下载 git clone https git suckless org slock 或者点击该链接下载 https dl suckless org tools slock 1 4 tar gz
  • JS高级(2)函数高级 — 原型与原型链

    原型与原型链 1 原型prototype 每个函数都有一个prototype属性 它默认指向一个Object空对象 即原型对象 里面没有我们的属性 原型中有一个属性constructor 它指向函数对象 构造函数和原型对象相互引用 func
  • 从零开发区块链应用(六)--gin框架使用

    文章目录 一 Gin 框架介绍 二 Gin安装 三 Gin使用 3 1 设置gin模式 3 2 创建新路由 3 3 创建多路由分组 3 4 创建路由 3 5 编写接口执行函数 3 6 启动服务 参考文档 Gin框架介绍及使用 https w
  • bread是可数还是不可数_在英语语法里,为什么bread是不可数名词?

    学英语 我们要分清楚名词的类型 可数名词 不可数名词 可数名词就是能够用 1 2 3 4 5 这样数的人或事物 比如苹果 茶杯 汽车 都可以这样数 但是 当我们打算去 数 water 水的时候 就水本身而言 它是液体 没有固定的形状和结构
  • SingleThreaded是如何进入cull_draw()的?

    正如以前所说 单线程模式是通过cull draw 进行剔除绘制的 如何进入的呢 其实很简单 逆推下 最后 回到梦开始的地方
  • React学习之围棋记谱本制作(二)棋盘、棋子、交替落子

    与儿子一起学围棋 上网上找 发现好用的记谱本软件特别少 打算自己做一个 不知能不能克服惰性 完成这个目标 千里之行 始于足下 今天完成了基础工作 棋盘 棋子组件 并完成了交替落子功能 是React基本功能的很好示范 代码贴一下 下一步就是多