日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

react入门教程案例井字棋(包含改进代码)

發(fā)布時間:2023/12/14 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 react入门教程案例井字棋(包含改进代码) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

react入門教程案例井字棋(包含改進(jìn)代碼)

    • 1、index.js
    • 2、index.css
    • 3、index.html

1、index.js

import React from 'react'; import ReactDOM from 'react-dom'; import './index.css' function Square (props){if(props.winBtn){/*每當(dāng)有人獲勝時,高亮顯示連成一線的 3 顆棋子。*/return (<button style={{backgroundColor:"MediumSpringGreen"}} className="square" onClick={props.onClick}>{props.value}</button>);}else {return (<button className="square" onClick={props.onClick}>{props.value}</button>);} }class Board extends React.Component {render() {return (<div>{/*<div className="board-row">{this.renderSquare(0)}{this.renderSquare(1)}{this.renderSquare(2)}</div><div className="board-row">{this.renderSquare(3)}{this.renderSquare(4)}{this.renderSquare(5)}</div><div className="board-row">{this.renderSquare(6)}{this.renderSquare(7)}{this.renderSquare(8)}</div>*//*使用兩個循環(huán)來渲染出棋盤的格子,而不是在代碼里寫死(hardcode)*/Array(3).fill(null).map((rowitem,index)=><div key={'row'+index} className="board-row">{Array(3).fill(null).map((columitem,j) =>{return <Squarekey = {j}/*索引規(guī)律index j 棋盤數(shù)組索引0 0 00 1 10 2 21 0 31 1 41 2 52 0 62 1 72 2 83*index+j = 棋盤數(shù)組索引*/winBtn = {this.props.winBtn[3*index+j]}value={this.props.squares[3*index+j]}onClick={()=> this.props.onClick(3*index+j)}/>})}</div>)}</div>);} }class Game extends React.Component {constructor(props) {super(props);this.state = {history: [{squares: Array(9).fill(null),}],xys:[],//坐標(biāo)stepNumber: 0,xIsNext: true,isDesc:true,};}handleClick(i) {const history = this.state.history.slice(0, this.state.stepNumber + 1);const xys = this.state.xys.slice(0, this.state.stepNumber + 1);const current = history[history.length - 1];const squares = current.squares.slice();if (calculateWinner(squares,this) || squares[i]) {return;}squares[i] = this.state.xIsNext ? 'X' : 'O';this.setState({history: history.concat([{squares: squares,}]),xys:xys.concat(this.getXYByIndex(i)),stepNumber: history.length,xIsNext: !this.state.xIsNext});}jumpTo(step) {this.setState({stepNumber: step,xIsNext: (step % 2) === 0,});}/*** 根據(jù)數(shù)據(jù)做引獲取坐標(biāo)*/getXYByIndex(index){let xy = "";switch (index) {case 0:xy="1,1";break;case 1:xy="2,1";break;case 2:xy="3,1";break;case 3:xy="1,2";break;case 4:xy="2,2";break;case 5:xy="3,2";break;case 6:xy="1,3";break;case 7:xy="2,3";break;case 8:xy="3,3";break;default:break;}return xy;}/*** 歷史記錄排序*/order (){const isDesc = this.state.isDesc;this.setState({isDesc: !isDesc,});}render() {const history = this.state.history;const current = history[this.state.stepNumber];let winMap = calculateWinner(current.squares,this);let winner;if(winMap == null){winner = null;winMap = {};winMap['winBtn'] = Array(9).fill(null);}else {winner = winMap.winner;}const moves = history.map((step, move) => {const discrib = move ?'Go to move #' + move + '('+this.state.xys[move-1]+')':/*在游戲歷史記錄列表顯示每一步棋的坐標(biāo),格式為 (列號, 行號)。*/'Go to game start';let history_btn = "";if(move === this.state.stepNumber){//在歷史記錄列表中加粗顯示當(dāng)前選擇的項目。history_btn = <button style={{fontWeight:600}} onClick={() => this.jumpTo(move)}>{discrib}</button>}else {history_btn = <button onClick={() => this.jumpTo(move)}>{discrib}</button>;}return (<li key={move}>{history_btn}</li>);});let status;//操作提示if (winner) {status = 'Winner: ' + winner ;} else {status = 'Next player: ' + (this.state.xIsNext ? 'X' : 'O');}let buttonName;//歷史記錄順序按鈕名稱let finalMoves;//歷史記錄數(shù)據(jù)if(this.state.isDesc){buttonName = '升序';finalMoves = moves;}else {buttonName = '降序';finalMoves = moves.reverse();}return (<div className="game"><div className="game-board"><BoardwinBtn={winMap == null ? null : winMap.winBtn}squares={current.squares}onClick={(i) => this.handleClick(i)}/></div><div className="game-info"><div>{status}&nbsp;&nbsp;&nbsp;&nbsp;/*添加一個可以升序或降序顯示歷史記錄的按鈕。*/<button onClick={() =>this.order()}>{buttonName}</button></div><ol>{finalMoves}</ol></div></div>);} }// ========================================ReactDOM.render(<Game />,document.getElementById('root') );function calculateWinner(squares,obj) {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]) {let winBtn = Array(9).fill(null);if(winBtn.indexOf(true) < 0){winBtn[a] = true;winBtn[b] = true;winBtn[c] = true;}const result = {"winner":squares[a],"winBtn":winBtn};return result;}else {/*當(dāng)無人獲勝時,顯示一個平局的消息。*/let endFlag = true;for(let j in squares){if(squares[j] == null){endFlag = false;}}if(endFlag){const result = {"winner":'平局',"winBtn":Array(9).fill(null)};return result;}}}return null; }

2、index.css

body {font: 14px "Century Gothic", Futura, sans-serif;margin: 20px; }ol, ul {padding-left: 30px; }.board-row:after {clear: both;content: "";display: table; }.status {margin-bottom: 10px; }.square {background: #fff;border: 1px solid #999;float: left;font-size: 24px;font-weight: bold;line-height: 34px;height: 34px;margin-right: -1px;margin-top: -1px;padding: 0;text-align: center;width: 34px; }.square:focus {outline: none; }.kbd-navigation .square:focus {background: #ddd; }.game {display: flex;flex-direction: row; }.game-info {margin-left: 20px; }

3、index.html

<div id="errors" style=" background: #c00; color: #fff; display: none; margin: -20px -20px 20px; padding: 20px; white-space: pre-wrap; "></div> <div id="root"></div> <script>window.addEventListener('mousedown', function(e) {document.body.classList.add('mouse-navigation');document.body.classList.remove('kbd-navigation');});window.addEventListener('keydown', function(e) {if (e.keyCode === 9) {document.body.classList.add('kbd-navigation');document.body.classList.remove('mouse-navigation');}});window.addEventListener('click', function(e) {if (e.target.tagName === 'A' && e.target.getAttribute('href') === '#') {e.preventDefault();}});window.onerror = function(message, source, line, col, error) {var text = error ? error.stack || error : message + ' (at ' + source + ':' + line + ':' + col + ')';errors.textContent += text + '\n';errors.style.display = '';};console.error = (function(old) {return function error() {errors.textContent += Array.prototype.slice.call(arguments).join(' ') + '\n';errors.style.display = '';old.apply(this, arguments);}})(console.error); </script>

小白學(xué)習(xí)記錄,有建議或不明白的小伙伴歡迎評論!

總結(jié)

以上是生活随笔為你收集整理的react入门教程案例井字棋(包含改进代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 丁香啪啪综合成人亚洲 | 大陆女明星乱淫合集 | 嫩草伊人久久精品少妇av | bt天堂av| 中文一区二区 | 青青草视频在线观看 | 99久久99久久精品国产片桃花 | 性视频久久 | 久艹视频在线观看 | 99riAv国产精品无码鲁大师 | 丰满少妇大力进入 | 99激情视频 | 日本免费黄色小视频 | 国产中文字幕久久 | www.色视频| 日韩电影在线观看一区二区 | 超碰成人97| 久久成人在线 | 一级做a爱| 右手影院亚洲欧美 | 久久久一区二区三区四区 | a天堂亚洲| 中国精品一区二区 | 欧美爱爱网 | 国产精品无码人妻一区二区在线 | 国产精品免费视频一区二区 | 黄在线观看免费 | 风流还珠之乱淫h文 | 亚洲欧美一区二区三区在线观看 | 中文在线a√在线8 | 中文字幕乱码人妻无码久久95 | 韩国伦理片在线播放 | 九九精品热 | 插吧插吧综合网 | 日韩av一二三区 | 手机在线成人av | 国产精品久久久精品三级 | www.爱爱| 成人免费黄色av | 国产婷婷色一区二区三区在线 | 五月婷婷六月激情 | 懂色av蜜臀av粉嫩av分享吧 | jizz黑人| 午夜精品久久久久久久第一页按摩 | 俄罗斯黄色大片 | 成人av资源站 | 国产一区二区在线电影 | 1区2区视频 | 久久96 | 国产传媒中文字幕 | 亚洲成人免费看 | 国产免费无遮挡吸奶头视频 | 福利国产片 | 扒开伸进免费视频 | 亚洲剧情在线 | 国产精品19乱码一区二区三区 | 免费一级黄色大片 | 欧美色视 | 麻豆三级在线观看 | 在线视频精品 | 在线免费黄色 | 亚洲精品中文字幕在线观看 | 精品综合久久久 | 亚洲一区电影在线观看 | 国产污污在线观看 | 丰满岳妇乱一区二区三区 | 久久嗨 | 深夜福利麻豆 | 三级视频久久 | 中国国产bdsm紧缚捆绑 | 免费成人深夜夜 | 欧美在线性爱视频 | 97se.com | 少妇29p| 很黄很污的视频 | 日韩精品――中文字幕 | 亚洲精品福利 | 91在线观看免费高清 | 国产盗摄精品一区二区酒店 | 91丨porny丨露出 | 双性人bbww欧美双性 | 亚洲综合视频在线 | 国产伦精品免费视频 | 免费看黄色片网站 | 亚洲国产一二三区 | 欧美黄色小说 | 精品午夜一区二区三区在线观看 | 中文字幕在线看高清电影 | 国产精品一卡 | 国产suv精品一区二区60 | 丰满少妇被猛烈进入无码 | 欧美啪啪一区二区 | 日本中文字幕在线 | www.jizzjizz| 4388成人网 | 日产精品久久久 | 99思思 | 欧美日韩一级在线观看 | 欧美黄色性 |