react 加粗_React入门的家庭作业(7?)【番外篇】

2023-11-06

回顾

在上一篇里完成了一个有以下功能的xxoo棋

  1. 三连棋游戏的所有功能
  2. 能够判定玩家何时获胜
  3. 能够记录游戏进程
  4. 允许玩家查看游戏的历史记录,也可以查看任意一个历史版本的游戏棋盘状态
  5. 在游戏历史记录列表显示每一步棋的坐标
  6. 在历史记录列表中加粗显示当前选择的项目
  7. 棋盘的大小易于改变(仅需在代码中修改一个常量)
  8. 历史记录可以升序或降序显示
  9. 每当有人获胜时,高亮显示连成一线的 3 颗棋子
  10. 当无人获胜时,显示一个平局的消息

现在以此为基础,把他做成一个【五子棋】游戏!

修改设计

五子棋和xxoo棋有很多相似的地方,比如说双方轮流落子,在横竖斜方向有若干棋子连成一线的一方取胜,无人能够取胜则平局等,相同的部分不需要做改动,需要修改的部分包括

  • 棋盘,需要将3×3的棋盘扩展成标准的15×15的棋盘,由于上述第7点,其实很容易做到
  • 获胜条件,看似只是从3颗棋子变成了5颗棋子,但由于之前的算法采用的是枚举,在3×3的棋盘上获胜情况不超过10种(横3竖3斜2共8种),因此枚举是个不错的办法,但在15×15的棋盘则有成百上千种可能,枚举就不切实际了,所以需要重新设计算法,重新实现判胜方法

算法

五子棋的获胜条件是五子相连,而获胜那一步一定是那5颗棋子之一,不然这一步之前就已经获胜,所以我们的办法是以落子的格子为中心,朝上下左右左上左下右上右下八个方向向外寻找相连的棋子,如果有任一对角的方向相连棋子数超过4(算上落子本身的话就是5),就达成获胜条件

实现

所以我们不仅需要知道此时棋盘布局的信息,还需要知道此时落子的信息,好在在上述第5点那里我们已经去到了每步落子的坐标,拿来用就可以了,因此给calculateWinner()方法新增坐标参数x, y

function calculateWinner(squares, x, y) {
  //在这里重写方法
}

squares传来的是一个一维数组,为了之后的计算,我们把它转化成一个二维数组board

//1D -> 2D
 var board = [];
 var n = 0;
 for(var i=0; i<M; i++) {
   board[i] = [];
   for(var j=0; j<M; j++, n++) {
     board[i][j] = squares[n];
   }
 }

坐标值也转换成程序员熟悉的0起始的,并确定落子是X还是O

x = x-1;
y = y-1;
let mark = board[x][y];

【注意】初始状态下(无人落子时),坐标值为null,在这里会报错,所以需要实现判断,如果是初始状态则直接返回无人胜利的结果

if(!x || !y) {
 return {winner : null, lines : null}; 
}

接着我们还需要准备2个数组

  • lines[8],用来保存每个方向上上与落子相连的相同棋子的序号(非二维坐标)
  • goOn[8],用来记录每个方向上是否还有必要继续向下探索
var lines = [[], [], [], [], [], [], [], []];
var goOn= Array(8).fill(true);

准备工作就绪,开始计算,因为五子相连就算胜利,每个方向最多只需要向前探索4步,对于每一步探索,先确认是否有必要探索(goOn为真)以及是否超过边界,如果没有问题再判断该格子是否是相同棋子,如果是就计入lines内,不是就让goOn为假,以后都不会再继续探索该方向了

for(var step=1; step<=4; step++) {
  //↑0
  if(goOn[0] && x-step >= 0) {
    if(board[x-step][y] === mark) {
      lines[0].push((x-step)*M + y);
    } else {
      goOn[0] = false;
    }
  }
  //↗ 1
  if(goOn[1] && x-step >= 0 && y+step < M) {
    if(board[x-step][y+step] === mark) {
      lines[1].push((x-step)*M + y+step);
    } else {
      goOn[1] = false;
    }
  }
  //→ 2
  if(goOn[2] && y+step < M) {
    if(board[x][y+step] === mark) {
      lines[2].push(x*M + y+step);
    } else {
      goOn[2] = false;
    }
  }
  //↘ 3
  if(goOn[3] && x+step < M && y+step < M) {
    if(board[x+step][y+step] === mark) {
      lines[3].push((x+step)*M + y+step);
    } else {
      goOn[3] = false;
    }
  }
  //↓ 4
  if(goOn[4] && x+step < M) {
    if(board[x+step][y] === mark) {
      lines[4].push((x+step)*M + y);
    } else {
      goOn[4] = false;
    }
  }
  //↙ 5
  if(goOn[5] && x+step < M && y-step >= 0) {
    if(board[x+step][y-step] === mark) {
      lines[5].push((x+step)*M + y-step);
    } else {
      goOn[5] = false;
    }
  }
  //← 6
  if(goOn[6] && y-step >= 0) {
    if(board[x][y-step] === mark) {
      lines[6].push(x*M + y-step);
    } else {
      goOn[6] = false;
    }
  }
  //↖ 7
  if(goOn[7] && x-step >= 0 && y-step >= 0) {
    if(board[x-step][y-step] === mark) {
      lines[7].push((x-step)*M + y-step);
    } else {
      goOn[7] = false;
    }
  }
}

八个方向向前四步都探索完后,进行判断,输出结果

if(lines[0].length+lines[4].length >= 4) {
  return {winner : mark, lines : [x*M+y].concat(lines[0]).concat(lines[4])};
} else if(lines[1].length+lines[5].length >= 4) {
  return {winner : mark, lines : [x*M+y].concat(lines[1]).concat(lines[5])};
} else if(lines[2].length+lines[6].length >= 4) {
  return {winner : mark, lines : [x*M+y].concat(lines[2]).concat(lines[6])};
} else if(lines[3].length+lines[7].length >= 4) {
  return {winner : mark, lines : [x*M+y].concat(lines[3]).concat(lines[7])};
} else {
  return {winner : null, lines : null};
}

这里的返回值格式和之前一样,winner内记入X或O或null(没有人获胜),lines内记入连成线的棋子编号(一维),没人获胜则是null

最后,因为参数个数发生变化,引用的地方需要适当改写,点击按钮时

if(calculateWinner(squares, current.row, current.col).winner || squares[i]) {
  return;
}

还有game渲染时

render() {
  const history = this.state.history;
  const current = history[this.state.stepNumber];
  const result = calculateWinner(current.squares, current.row, current.col);
//之后都一样。。。

最终效果

总结

因为之前的代码比较干净,从xxoo棋到五子棋,我们只在两个地方做了修改,棋盘大小(M),获胜判断方法的实现及调用,其他的功能也一切正常,所以你又得到了一个有以下功能的五子棋!

  1. 五子棋游戏的所有功能
  2. 能够判定玩家何时获胜
  3. 能够记录游戏进程
  4. 允许玩家查看游戏的历史记录,也可以查看任意一个历史版本的游戏棋盘状态
  5. 在游戏历史记录列表显示每一步棋的坐标
  6. 在历史记录列表中加粗显示当前选择的项目
  7. 棋盘的大小易于改变(仅需在代码中修改一个常量)
  8. 历史记录可以升序或降序显示
  9. 每当有人获胜时,高亮显示连成一线的 5 颗棋子
  10. 当无人获胜时,显示一个平局的消息

参考资料

React 入门实例教程 - 阮一峰的网络日志​www.ruanyifeng.com

最终版完整代码暂时贴在下方,之后可能会放进GitHub更便于查看。。先酱

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';

//size of board
const M = 15;

 function Square(props) {
 return (
 <button className="square" onClick={ props.onClick }>
 {/* add a font color */}
 <font color={props.color}>{props.value}</font>
 </button>
      );
  }
 
 class Board extends React.Component {
 // add a props of font color
 renderSquare(i) {
 let color;
 if(this.props.line && this.props.line.includes(i)) {
 color = "red";
      } else {
 color = "black";
      }

 return (
 <Square 
 key={i}
 value={this.props.squares[i]}
 color={color}
 onClick={ () => this.props.onClick(i) }
 />
      );
    }
 
 //rerender by loop
 render() {
 var n = 0;
 let board = [];
 for(var i=0; i<M; i++) {
 var boardRow = [];
 for(var j=0; j<M; j++, n++) {
 boardRow.push(this.renderSquare(n));
        }
 board.push(<div className="board-row" key={i}>{boardRow}</div>);
      }
 return (
 <div>{board}</div>
      );
    }
  }
 
 class Game extends React.Component {
 constructor(props) {
 super(props);
 this.state = {
 history: [{
 //3 -> M
 squares: Array(M*M).fill(null),
 //row and column
 row: null,
 col: null,
        }],
 stepNumber: 0,
 xIsNext: true,
 //order
 startToEnd : true,
      }
    }

 handleClick(i) {
 const history = this.state.history.slice(0, this.state.stepNumber + 1);
 const current = history[history.length - 1];
 const squares = current.squares.slice();
 //changed caused by calculateWinner
 if(calculateWinner(squares, current.row, current.col).winner || squares[i]) {
 return;
      }
 squares[i] = this.state.xIsNext ? 'X' : 'O';
 this.setState({
 history : history.concat([{
 squares : squares,
 //row and column
 row: parseInt(i/M)+1,
 col: i%M+1,
        }]),
 stepNumber : history.length,
 xIsNext : !this.state.xIsNext,
      });
    }

 jumpTo(step) {
 this.setState({
 stepNumber : step,
 xIsNext : (step % 2) === 0,
      })
    }

 //add a function for changing order
 changeOrder() {
 this.setState({
 startToEnd : !this.state.startToEnd,
      })
    }

 render() {
 const history = this.state.history;
 const current = history[this.state.stepNumber];
 //changed caused by calculateWinner
 const result = calculateWinner(current.squares, current.row, current.col);
 const winner = result.winner;
 const lines = result.lines;
 
 const moves = history.map((step, move) => {
 const desc = move ? 
 'Go to move #' + move + ' (' + step.row + ',' + step.col + ')'://row and column
 'Go to game start';
 //point current move
 if(step === current) {
 return (
 <li key={move}>
 <button onClick={() => this.jumpTo(move)}><strong>{desc}</strong></button>
 </li>
          );
        } else {
 return (
 <li key={move}>
 <button onClick={() => this.jumpTo(move)}>{desc}</button>
 </li>
          );
        }
      });

 //reverse moves
 let orderableMoves;
 if(this.state.startToEnd) {
 orderableMoves = moves;
      } else {
 orderableMoves = moves.reverse();
      }

 //isMatch?
 let status;
 if(winner) {
 status = 'Winner: ' + winner;
      } else if(!winner && this.state.stepNumber === M*M) {
 status = 'MATCH!';
      } else {
 status = 'Next player: ' + (this.state.xIsNext ? 'X' : 'O');
      }

 return (
 <div className="game">
 <div className="game-board">
 {/* add a line */}
 <Board 
 squares={current.squares}
 line={lines}
 onClick={(i) => this.handleClick(i)}
 />
 </div>
 <div className="game-info">
 <div>{status}</div>
 {/* add a button */}
 <button onClick={() => {this.changeOrder()}}>↑↓</button>
 <ol>{orderableMoves}</ol>
 </div>
 </div>
      );
    }
  }
 
 // ========================================
 
 ReactDOM.render(
 <Game />,
 document.getElementById('root')
  );

 // function calculateWinnerWith3(squares) {
 //   const lines = [
 //     [0, 1, 2],
 //     [3, 4, 5],
 //     [6, 7, 8],
 //     [0, 3, 6],
 //     [1, 4, 7],
 //     [2, 5, 8],
 //     [0, 4, 8],
 //     [2, 4, 6],
 //   ];
 //   for (let i = 0; i < lines.length; i++) {
 //     const [a, b, c] = lines[i];
 //     if (squares[a] && squares[a] === squares[b] && squares[a] === squares[c]) {
 //       //return an object with all info
 //       return {winner : squares[a], lines : lines[i]};
 //     }
 //   }
 //   return {winner : null, lines : null};
 // }

 function calculateWinner(squares, x, y) {
 //before start
 if(!x || !y) {
 return {winner : null, lines : null}; 
    }
 
 //1D -> 2D
 var board = [];
 var n = 0;
 for(var i=0; i<M; i++) {
 board[i] = [];
 for(var j=0; j<M; j++, n++) {
 board[i][j] = squares[n];
      }
    }
 
 //as array starts from zero
 x = x-1;
 y = y-1;
 let mark = board[x][y];

 var lines = [[], [], [], [], [], [], [], []];
 var goOn = Array(8).fill(true);

 for(var step=1; step<=4; step++) {
 //↑0
 if(goOn[0] && x-step >= 0) {
 if(board[x-step][y] === mark) {
 lines[0].push((x-step)*M + y);
        } else {
 goOn[0] = false;
        }
      }
 //↗ 1
 if(goOn[1] && x-step >= 0 && y+step < M) {
 if(board[x-step][y+step] === mark) {
 lines[1].push((x-step)*M + y+step);
        } else {
 goOn[1] = false;
        }
      }
 //→ 2
 if(goOn[2] && y+step < M) {
 if(board[x][y+step] === mark) {
 lines[2].push(x*M + y+step);
        } else {
 goOn[2] = false;
        }
      }
 //↘ 3
 if(goOn[3] && x+step < M && y+step < M) {
 if(board[x+step][y+step] === mark) {
 lines[3].push((x+step)*M + y+step);
        } else {
 goOn[3] = false;
        }
      }
 //↓ 4
 if(goOn[4] && x+step < M) {
 if(board[x+step][y] === mark) {
 lines[4].push((x+step)*M + y);
        } else {
 goOn[4] = false;
        }
      }
 //↙ 5
 if(goOn[5] && x+step < M && y-step >= 0) {
 if(board[x+step][y-step] === mark) {
 lines[5].push((x+step)*M + y-step);
        } else {
 goOn[5] = false;
        }
      }
 //← 6
 if(goOn[6] && y-step >= 0) {
 if(board[x][y-step] === mark) {
 lines[6].push(x*M + y-step);
        } else {
 goOn[6] = false;
        }
      }
 //↖ 7
 if(goOn[7] && x-step >= 0 && y-step >= 0) {
 if(board[x-step][y-step] === mark) {
 lines[7].push((x-step)*M + y-step);
        } else {
 goOn[7] = false;
        }
      }
    }

 if(lines[0].length+lines[4].length >= 4) {
 return {winner : mark, lines : [x*M+y].concat(lines[0]).concat(lines[4])};
    } else if(lines[1].length+lines[5].length >= 4) {
 return {winner : mark, lines : [x*M+y].concat(lines[1]).concat(lines[5])};
    } else if(lines[2].length+lines[6].length >= 4) {
 return {winner : mark, lines : [x*M+y].concat(lines[2]).concat(lines[6])};
    } else if(lines[3].length+lines[7].length >= 4) {
 return {winner : mark, lines : [x*M+y].concat(lines[3]).concat(lines[7])};
    } else {
 return {winner : null, lines : null};
    }
  }
 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react 加粗_React入门的家庭作业(7?)【番外篇】 的相关文章

  • 怎么使用计算机开机关机,笔记本电脑怎么开关机_笔记本电脑正确的开关机步骤-win7之家...

    我们在使用笔记本电脑之后 都会进行开关机 看似简单的开关机 如果方法不正确的话 就会对电脑使用寿命有影响 所以正确的开关机可以帮助我们延长电脑使用寿命 那么笔记本电脑怎么开关机呢 针对这个问题 本文给大家讲述一下笔记本电脑正确的开关机步骤吧
  • 银行家舍入法(四舍六入)

    文章目录 银行家舍入法 银行家舍入法 生活中常见的计算方法就是四舍五入 但是银行家舍入法是四舍六入 五后面有非0的数字将直接向前进位 没有数字的情况下还要看前一位是偶数还是奇数 偶数舍去 奇数进位 总结为一句话就是 四舍六入五考虑 五后非零
  • 无需做任何配置!持安零信任可自动防御Web应用勒索攻击

    01 Attention 中毒终端已超2000个 近日 一则大型企业的勒索病毒事件在网络上传播 引起了广泛关注 某互联网企业财务管理软件 T 被爆出存在任意文件上传 远程代码执行的未授权访问漏洞 未授权访问漏洞 在企业内部一直以来都是非常常
  • 领域驱动模型(DDD)在美团外卖活动管理业务的应用

    什么是领域驱动模型 2004年Eric Evans 发表 领域驱动设计 软件核心复杂性应对之道 Domain Driven Design Tackling Complexity in the Heart of Software 简称Evan
  • 模仿mnist数据集制作自己的数据集

    模仿mnist数据集制作自己的数据集 最近看深度学习 用TensorFlow跑教程里的模型 发现教程里大多都是用mnist和cifar这两个数据集来演示的 想测试自己的数据集看看初步效果 于是就想套用现有的模型 将自己的数据集做成和mnis
  • 解决nginx负载均衡的session共享问题

    查了一些资料 看了一些别人写的文档 总结如下 实现nginx session的共享 PHP服务器有多台 用nginx做负载均衡 这样同一个IP访问同一个页面会被分配到不同的服务器上 如果session不同步的话 就会出现很多问题 比如说最常
  • fireFox post请求插件,火狐浏览器插件

    在开发过程中 为了测试数据 提交表单等 经常会用到post请求 在这里向大家介绍一款比较好用的浏览器插件 它可以很好的模拟post get put等常用的请求 大大便利了我们的开发 它就是fire fox中的RESTClient 安装方法如
  • Linux服务器内存消耗过高

    Linux服务器内存消耗过高 问题描述 Linux服务器的内存持续消耗过高 重启后可以恢复正常 但业务运行后问题依旧存在 而且没有明显高消耗内存进程存在 问题原因 slab消耗内存过多 解决方案 登录问题Linux服务器 执行free和to
  • 部署Oracle 19C RAC

    https www toutiao com i6879691817663595019 tt from weixin utm campaign client share wxshare count 1 timestamp 1602718612
  • 集成springSecurity遇到的跨域问题

    引言 该项目主要使用技术 sprinboot springSecurity vue 其它的技术就不介绍了 其中springSecurity是我参考网上的案例去进行的集成 虽然集成成功了 但是还不是太懂 下面就开始介绍一下我遇到的问题 问题重
  • Android开源框架之Fresco

    简介 Fresco是Facebook最新推出的一款用于Android应用中展示图片的强大图片库 可以从网络 本地存储和本地资源中加载图片 相对于ImageLoader 拥有更快的图片下载速度以及可以加载和显示gif图等诸多优势 是个很好的图
  • 医学生可以跨专业考计算机的专业,可以跨考医学研究生:2016跨专业考研需谨慎的专业解读:临床医学...

    每年的跨专业考研人群有很大一批 或是因为本专业就业不景气 或是因为不感兴趣等等 诸多原因导致跨专业考研的人很多 跨专业考研的难度比一般要大 主要因为起点不同 往往此类考生专业课的基础都很低 从头开始 压力很大 因此在选专业的时候一定要谨慎
  • python怎么输出图片_Python怎么输出图片且不保存

    Python怎么输出图片且不保存 一 输出本地图片 使用open 函数来打开图片 使用show 函数来显示图片 from PIL import Image img Image open d dog png img show 这种图片显示方式
  • 基于BP神经网络的2014世界杯比分预测

    写在前头 科学的方法 娱乐的心态 研究背景 众所周知 今年的世界杯比赛各种坑爹 看了那么多砖家点评就没人说准过 当然足球比赛中有太多的未知变量 如何选择这些变量就成为了预测比赛比分的关键 本文作者另辟蹊径 选用足彩比分赔率作为影响比赛走势的
  • Java DAO代码重构(连接池方式)

    DAO设计简化思路 首先初始化数据库连接池 使用Alibaba的Druid连接池 需先下载druid 1 x x jar包 public class JDBCUtil private static DataSource ds null 初始
  • SQLServer数据库漏洞

    一 SQLServer数据库提权前提条件 1 以管理员身份运行数据库服务 2 已经获得SQL数据库的sysadmin权限 3 可以连接数据库 二 通过存储过程进行提权 hydra工具介绍 L 指定用户名字典 P 指定密码字典 vV 输出破解
  • 与孩子一起学编程python_与的解释

    子集上 一 与 康熙筆画 4 部外筆画 3 廣韻 集韻 正韻 同與 說文 賜予也 一勺爲与 六書正譌 寡則均 故从一勺 與 古文 廣韻 弋諸切 正韻 弋渚切 集韻 韻會 演女切 音予 說文 黨與也 戰國策 是君以合齊與强楚 註 與 黨與也
  • 《算法导论》笔记(18) 最大流 含部分习题

    流网络 容量值 源结点 汇点 容量限制 流量守恒 反平行 超级源结点 超级汇点 Ford Fulkerson方法 残存网络 增广路径 最小切割定理 f是最大流 残存网络不包含增广路径 f 等于最小切割容量三者等价 基本的Ford Fulke

随机推荐

  • Vijava 学习笔记之(获取用户自定义规范相关信息)

    源代码 package com vmware customzation import com vmware util Session import com vmware vim25 CustomizationSpecInfo import
  • [CVPR2020]Attention-Guided Hierarchical Structure Aggregation for Image Matting

    论文 Attention Guided Hierarchical Structure Aggregation for Image Matting 代码 wukaoliu CVPR2020 HAttMatting 基于注意力引导的层次结构聚集
  • mycat分库分表

    一 拆分原理 数据节点 分片 主机 ip port 数据库组合起来就是一个数据节点 分库 垂直拆分 不同的表分到不同的数据节点 分表 水平拆分 同一张表按照一定的规则拆分到不同的数据节点 二 mycat逻辑图 应用连接mycat mycat
  • 【编程之路】面试必刷TOP101:堆、栈、队列(42-49,Python实现)

    面试必刷TOP101 堆 栈 队列 42 49 Python实现 42 用两个栈实现队列 小试牛刀 step 1 push操作就正常push到第一个栈末尾 step 2 pop操作时 优先将第一个栈的元素弹出 并依次进入第二个栈中 step
  • 梦幻西游两个不同服务器的名字出现在跨服华山,系统会怎么处理,梦幻西游跨服决战华山玩法介绍...

    梦幻西游跨服决战华山新玩法已经出来了 很多的玩家还不知道该如何玩 下面我们一起来看详细的内容介绍 活动时间 没有帮派竞赛的周五 周日 进入活动场地时间 19 00 比赛时间 19 30 22 00 等级限制 等级 55级 分组机制 根据玩家
  • DLL,SDK,API专业技术术语

    SDK software development kit 中文可译为 软件开发工具包 一般都是一些被软件工程师用于为特定的软件包 软件架构 硬件平台 操作系统等建立应用软件的开发工具的集合 通俗点是指由第三方服务商提供的实现软件产品某项功能
  • 腾讯toB“联合舰队”的秘密

    14 天高强度谈判 每天都从早 8 点持续到凌晨 3 点 郭浩哲和他的同事们敲定了一笔融资 投资方是腾讯 投资金额达到了 12 66 亿元人民币 即使在腾讯的投资历史上 这都不是一个小数额 但实际流程仅用时一个多月 多少让郭浩哲对巨头的速度
  • Eclipse 安装C++环境

    安装CDT插件 方法一 选择 help 安装新的软件 然后点击Add 给定名称为 CDT 添加地址 http download eclipse org tools cdt releases juno 点击FInish 等待安装完成 提示重启
  • 第一课:初识Java语言

    第一课 初识Java语言 一 了解Java的历史由来 1 为什么学习Java编程语言 1 首先要了解编程语言的流行趋势 Tiobe PYPL排行榜 2 在这些排行榜上 Java语言的流行程度都名列前茅 在Tiobe排行榜上 甚至常年 排名第
  • 854. 相似度为 K 的字符串

    对于某些非负整数 k 如果交换 s1 中两个字母的位置恰好 k 次 能够使结果字符串等于 s2 则认为字符串 s1 和 s2 的 相似度为 k 给你两个字母异位词 s1 和 s2 返回 s1 和 s2 的相似度 k 的最小值 示例 1 输入
  • flea-jersey使用之文件上传接入

    文件上传 引言 1 客户端依赖 2 服务端依赖 3 文件上传接入讲解 3 1 服务端上传资源定义 3 2 服务端文件上传服务定义 3 3 客户端文件上传配置 3 4 客户端文件上传调用 引言 本文将要介绍 flea jersey 提供的文件
  • c++回调函数

    关于应用 1 创建struct结构体 typedef struct tag PixelCallBack AsynCall PixelCallBack 2 在 h 文件类中定义private 结构体变量 typedef void func c
  • pytorch——实现自编码器和变分自编码器

    文章目录 数据降维 主成分分析 PCA 自编码器 AE 变分自编码器 VAE pytorch实现 AE 实现自编码器网络结构 实现AE对MNIST数据集的处理 VAE 实现变分自编码器网络结构 实现VAE对MNIST数据集的处理 本文只设计
  • flutter video_player pageView 视频分页播放自适应视频宽高

    1 新建播放组件 预览图和文案可以删除也可以重新自定义 主要是视频地址 import dart async import package flutter material dart import package midou ee car v
  • 一個简洁的 antd-react-admin 应用 -- React + Antd 通用后台管理系统

    React Antd Admin 简介 React Antd Admin 一个 JavaScript 应用 项目由业界最优秀的 React 应用开发工具 create react app 初始化创建 搭配 Antd 开箱即用的高质量 Rea
  • Cannot resolve plugin org.apache.maven.plugins:maven-surefire-plugin:2.12.4_idea创建maven项目时异常

    Cannot resolve plugin org apache maven plugins maven surefire plugin 2 12 4 idea创建maven项目时异常 Git上拉下一个maven项目 在更新和build时
  • springboot 之 在Controller如何接收参数呢?

    转自 springboot 之 在Controller如何接收参数呢 下文笔者将讲述Controller中接收url路径中的参数 表单 问号后面参数 body中的JSON信息 使用 PathVariable 直接使用String定义变量 使
  • 神经网络结构--前

    目前神经网络基本是业内无人不知了 在正式了解神经网络之前 有兴趣的爱好者可以了解一下神经网络出现前的一些发展历史 实际上呢 每个聊神经网络的人 都会先放一张神经元的图片 我就偷懒算了吧 怕大家看吐了 1943年 心理学家W Mcculloc
  • [论文阅读] (27) AAAI20 Order Matters: 基于图神经网络的二进制代码相似性检测(腾讯科恩实验室)

    娜璋带你读论文 系列主要是督促自己阅读优秀论文及听取学术讲座 并分享给大家 希望您喜欢 由于作者的英文水平和学术能力不高 需要不断提升 所以还请大家批评指正 非常欢迎大家给我留言评论 学术路上期待与您前行 加油 前一篇文章介绍Excel论文
  • react 加粗_React入门的家庭作业(7?)【番外篇】

    回顾 在上一篇里完成了一个有以下功能的xxoo棋 三连棋游戏的所有功能 能够判定玩家何时获胜 能够记录游戏进程 允许玩家查看游戏的历史记录 也可以查看任意一个历史版本的游戏棋盘状态 在游戏历史记录列表显示每一步棋的坐标 在历史记录列表中加粗