|
@@ -1,89 +1,218 @@
|
|
|
import { useState } from 'react'
|
|
|
import './Checkerboard.css'
|
|
|
import tableData from './CheckerboardData'
|
|
|
+import Navigation from '../component/Navigation'
|
|
|
const bgline = [
|
|
|
- ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14"],
|
|
|
["x", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n"],
|
|
|
+ ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14"]
|
|
|
];
|
|
|
+const constant = {a:1, b:2, c:3, d:4, e:5, f:6, g:7, h:8, i:9, j:10, k:11, l:12, m:13, n:14}
|
|
|
const Checkerboard = function () {
|
|
|
const [table, updateTable] = useState(tableData)
|
|
|
- const [userFlag, setUserFlag] = useState(0)
|
|
|
+ const [userStatus, setGameStatus] = useState(0)
|
|
|
const goBangTouchEvent = function (x, y, value) {
|
|
|
+ if ( userStatus === 0 ) {
|
|
|
+ console.log( "棋盘未开始呢!!" )
|
|
|
+ return
|
|
|
+ }
|
|
|
if (value === 0) {
|
|
|
- table[x][y] = userFlag
|
|
|
+ table[x][y] = userStatus
|
|
|
updateTable({ ...table })
|
|
|
- switch (userFlag) {
|
|
|
- case 1: setUserFlag(2); break;
|
|
|
- case 2: setUserFlag(1); break;
|
|
|
- default: setUserFlag(0)
|
|
|
+ switch (userStatus) {
|
|
|
+ case 1: setGameStatus(2); break;
|
|
|
+ case 2: setGameStatus(1); break;
|
|
|
+ default: setGameStatus(0)
|
|
|
+ }
|
|
|
+ if ( userStatus !== 0 ) {
|
|
|
+ win(x, y, table)
|
|
|
}
|
|
|
} else {
|
|
|
console.log("此处已经落子了")
|
|
|
}
|
|
|
}
|
|
|
+ const win = function(x, y, table){
|
|
|
+ //横向
|
|
|
+ if( getXValue(x, y, table) ) {
|
|
|
+ console.log( userStatus === 1 ? "黑方赢了" : "白方赢了" )
|
|
|
+ setGameStatus(0)
|
|
|
+ }
|
|
|
+ //纵向
|
|
|
+ if( getYValue(x, y, table) ) {
|
|
|
+ console.log( userStatus === 1 ? "黑方赢了" : "白方赢了" )
|
|
|
+ setGameStatus(0)
|
|
|
+ }
|
|
|
+ //斜向
|
|
|
+ if ( getXyValue(x, y, table) ) {
|
|
|
+ console.log( userStatus === 1 ? "黑方赢了" : "白方赢了" )
|
|
|
+ setGameStatus(0)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ const getXValue = function(x, y, table){
|
|
|
+ //向左遍历
|
|
|
+ let n = 0
|
|
|
+ for (let i = y; i < table[x].length; i++) {
|
|
|
+ if (table[x][i] === userStatus) {
|
|
|
+ n++;
|
|
|
+ } else if (table[x][i] === 0){
|
|
|
+ break
|
|
|
+ } else {
|
|
|
+ n=0
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if ( n >= 5 ) return true
|
|
|
+ //向右遍历
|
|
|
+ n = 0
|
|
|
+ for (let i = y; i > 0; i--) {
|
|
|
+ if (table[x][i] === userStatus) {
|
|
|
+ n++;
|
|
|
+ } else if (table[x][i] === 0){
|
|
|
+ break
|
|
|
+ } else {
|
|
|
+ n=0
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if ( n >= 5 ) return true
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ const getYValue = function(x, y, table){
|
|
|
+ //从点击点向上遍历
|
|
|
+ let n = 0
|
|
|
+ const rTable = Object.keys(table).reverse();
|
|
|
+ for (const key in rTable) {
|
|
|
+ if ( constant[rTable[key]] <= constant[x] ) {
|
|
|
+ if ( table[rTable[key]][y] === userStatus ) {
|
|
|
+ n++
|
|
|
+ } else if ( table[rTable[key]][y] === 0 ) {
|
|
|
+ break
|
|
|
+ } else {
|
|
|
+ n=0
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if ( n >= 5 ) return true
|
|
|
+ //从点击点向下遍历
|
|
|
+ n=0
|
|
|
+ for (const key in table) {
|
|
|
+ if (Object.hasOwnProperty.call(table, key)) {
|
|
|
+ if ( constant[key] >= constant[x] ) {
|
|
|
+ if ( table[key][y] === userStatus ) {
|
|
|
+ n++
|
|
|
+ } else if ( table[key][y] === 0 ) {
|
|
|
+ break
|
|
|
+ } else {
|
|
|
+ n=0
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if ( n >= 5 ) return true
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ const getXyValue = function(x, y, table){
|
|
|
+ //向左上角遍历
|
|
|
+ let n = 0 , flag = false, k = y+1
|
|
|
+ const tableKey = Object.keys(table).reverse();
|
|
|
+ for (let i = 0; i < 14; i++) {
|
|
|
+ if ( tableKey[i] === x ) {
|
|
|
+ flag = true
|
|
|
+ }
|
|
|
+ if ( flag === false ) continue
|
|
|
+ k--
|
|
|
+ if ( table[tableKey[i]][k] === userStatus ) {
|
|
|
+ n++
|
|
|
+ } else if (table[tableKey[i]][k] === 0) {
|
|
|
+ break;
|
|
|
+ } else {
|
|
|
+ n=0
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if ( n >= 5 ) return true
|
|
|
+
|
|
|
+ //向左下角遍历
|
|
|
+ n = 0 ; k = y-1; flag = false;
|
|
|
+ const rTableKey = Object.keys(table)
|
|
|
+ for (let i = 0; i < table[x].length; i++ ) {
|
|
|
+ if ( rTableKey[i] === x ) {
|
|
|
+ flag = true
|
|
|
+ }
|
|
|
+ if ( flag === false ) continue
|
|
|
+ k++
|
|
|
+ if ( table[rTableKey[i]][k] === userStatus ) {
|
|
|
+ n++
|
|
|
+ } else if (table[rTableKey[i]][k] === 0) {
|
|
|
+ break;
|
|
|
+ } else {
|
|
|
+ n=0
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if ( n >= 5 ) return true
|
|
|
+ return false
|
|
|
+ }
|
|
|
return (
|
|
|
- <div className='center'>
|
|
|
- <div className='checkerboard'>
|
|
|
- <div className='board' >
|
|
|
- {Object.keys(table).map((x) => {
|
|
|
- return (
|
|
|
- <div key={x} className='board-grid'>
|
|
|
- {table[x].map((value, y) => {
|
|
|
- return (
|
|
|
- <div
|
|
|
- onClick={() => {
|
|
|
- goBangTouchEvent(x, y, value)
|
|
|
- }}
|
|
|
- onTouchEnd={()=>{
|
|
|
- goBangTouchEvent(x, y, value)
|
|
|
- }}
|
|
|
- className={(() => {
|
|
|
- switch (value) {
|
|
|
- case 0: return 'board-item'
|
|
|
- case 1: return 'black board-item'
|
|
|
- case 2: return 'white board-item'
|
|
|
- default: return 'board-item'
|
|
|
- }
|
|
|
- })()}
|
|
|
- key={y}
|
|
|
- //style={{border:'1px solid red'}}
|
|
|
- >
|
|
|
- </div>
|
|
|
- )
|
|
|
- })}
|
|
|
- </div>
|
|
|
- )
|
|
|
- })}
|
|
|
- </div>
|
|
|
- <div className='bj' >
|
|
|
- {(() => {
|
|
|
- const ret = bgline[0].map((x) => {
|
|
|
+ <div className='body'>
|
|
|
+ <Navigation updateTable={updateTable} gameStatus={setGameStatus} status={userStatus} />
|
|
|
+ <div className='center'>
|
|
|
+ <div className='checkerboard'>
|
|
|
+ <div className='board' >
|
|
|
+ {Object.keys(table).map((x) => {
|
|
|
return (
|
|
|
- <div key={x} className='bj-grid'>
|
|
|
- {
|
|
|
- bgline[1].map((y) => {
|
|
|
- return (
|
|
|
- <div key={y} className={(() => {
|
|
|
- let ret = 'bj-item'
|
|
|
- if (x === '14') {
|
|
|
- ret += ' bj-bottom'
|
|
|
- }
|
|
|
- if (y === 'n') {
|
|
|
- ret += ' bj-right'
|
|
|
+ <div key={x} className='board-grid'>
|
|
|
+ {table[x].map((value, y) => {
|
|
|
+ return (
|
|
|
+ <div
|
|
|
+ onClick={() => {
|
|
|
+ goBangTouchEvent(x, y, value)
|
|
|
+ }}
|
|
|
+ onTouchEnd={() => {
|
|
|
+ goBangTouchEvent(x, y, value)
|
|
|
+ }}
|
|
|
+ className={(() => {
|
|
|
+ switch (value) {
|
|
|
+ case 0: return 'board-item'
|
|
|
+ case 1: return 'black board-item'
|
|
|
+ case 2: return 'white board-item'
|
|
|
+ default: return 'board-item'
|
|
|
}
|
|
|
- return ret
|
|
|
- })()}>
|
|
|
- {x === '0' && y !== 'x' ? <span className='xline'>{y}</span> : ''}
|
|
|
- {y === 'x' && x !== '0' ? <span className='yline'>{x}</span> : ''}
|
|
|
- </div>
|
|
|
- )
|
|
|
- })
|
|
|
- }
|
|
|
+ })()}
|
|
|
+ key={y}
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ })}
|
|
|
</div>
|
|
|
)
|
|
|
- })
|
|
|
- return ret
|
|
|
- })()}
|
|
|
+ })}
|
|
|
+ </div>
|
|
|
+ <div className='bj' >
|
|
|
+ {(() => {
|
|
|
+ const ret = bgline[0].map((x) => {
|
|
|
+ return (
|
|
|
+ <div key={x} className='bj-grid'>
|
|
|
+ {
|
|
|
+ bgline[1].map((y) => {
|
|
|
+ return (
|
|
|
+ <div key={y} className={(() => {
|
|
|
+ let ret = 'bj-item'
|
|
|
+ if (x === 'n') {
|
|
|
+ ret += ' bj-bottom'
|
|
|
+ }
|
|
|
+ if (y === '14') {
|
|
|
+ ret += ' bj-right'
|
|
|
+ }
|
|
|
+ return ret
|
|
|
+ })()}>
|
|
|
+ {x === 'x' && y !== '0' ? <span className='xline'>{y}</span> : ''}
|
|
|
+ {y === '0' && x !== 'x' ? <span className='yline'>{x}</span> : ''}
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ })
|
|
|
+ }
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ })
|
|
|
+ return ret
|
|
|
+ })()}
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|