Checkerboard.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. import { useContext, useEffect, useState } from 'react'
  2. import './Checkerboard.css'
  3. import { POINT } from '../Constant';
  4. import tableData from './CheckerboardData'
  5. import Navigation from '../component/Navigation'
  6. import RevRoomContext from '../provider/RevRoomContext';
  7. import GlobalSocketContext from '../provider/GlobalSocketContext';
  8. const bgline = [
  9. ["x", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n"],
  10. ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14"]
  11. ];
  12. 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}
  13. const Checkerboard = function () {
  14. const { room, data } = useContext(RevRoomContext)
  15. const socket = useContext(GlobalSocketContext)
  16. const [table, updateTable] = useState(tableData)
  17. const [userStatus, setGameStatus] = useState(0)
  18. useEffect(()=>{
  19. updateTable(data)
  20. }, [data])
  21. const goBangTouchEvent = function (x, y, value) {
  22. if ( room.status === 0 ) {
  23. console.log( "棋盘未开始呢!!" )
  24. return
  25. }
  26. if (value === 0) {
  27. data[x][y] = room.status
  28. socket.send(JSON.stringify({
  29. instruct: POINT,
  30. data:data
  31. }))
  32. if ( userStatus !== 0 ) {
  33. win(x, y, table)
  34. }
  35. } else {
  36. console.log("此处已经落子了")
  37. }
  38. }
  39. const win = function(x, y, table){
  40. //横向
  41. if( getXValue(x, y, table) ) {
  42. console.log( userStatus === 1 ? "黑方赢了" : "白方赢了" )
  43. setGameStatus(0)
  44. }
  45. //纵向
  46. if( getYValue(x, y, table) ) {
  47. console.log( userStatus === 1 ? "黑方赢了" : "白方赢了" )
  48. setGameStatus(0)
  49. }
  50. //斜向
  51. if ( getXyValue(x, y, table) ) {
  52. console.log( userStatus === 1 ? "黑方赢了" : "白方赢了" )
  53. setGameStatus(0)
  54. }
  55. }
  56. const getXValue = function(x, y, table){
  57. //向左遍历
  58. let n = 0
  59. for (let i = y; i < table[x].length; i++) {
  60. if (table[x][i] === userStatus) {
  61. n++;
  62. } else if (table[x][i] === 0){
  63. break
  64. } else {
  65. n=0
  66. }
  67. }
  68. if ( n >= 5 ) return true
  69. //向右遍历
  70. n = 0
  71. for (let i = y; i > 0; i--) {
  72. if (table[x][i] === userStatus) {
  73. n++;
  74. } else if (table[x][i] === 0){
  75. break
  76. } else {
  77. n=0
  78. }
  79. }
  80. if ( n >= 5 ) return true
  81. return false
  82. }
  83. const getYValue = function(x, y, table){
  84. //从点击点向上遍历
  85. let n = 0
  86. const rTable = Object.keys(table).reverse();
  87. for (const key in rTable) {
  88. if ( constant[rTable[key]] <= constant[x] ) {
  89. if ( table[rTable[key]][y] === userStatus ) {
  90. n++
  91. } else if ( table[rTable[key]][y] === 0 ) {
  92. break
  93. } else {
  94. n=0
  95. }
  96. }
  97. }
  98. if ( n >= 5 ) return true
  99. //从点击点向下遍历
  100. n=0
  101. for (const key in table) {
  102. if (Object.hasOwnProperty.call(table, key)) {
  103. if ( constant[key] >= constant[x] ) {
  104. if ( table[key][y] === userStatus ) {
  105. n++
  106. } else if ( table[key][y] === 0 ) {
  107. break
  108. } else {
  109. n=0
  110. }
  111. }
  112. }
  113. }
  114. if ( n >= 5 ) return true
  115. return false
  116. }
  117. const getXyValue = function(x, y, table){
  118. //向左上角遍历
  119. let n = 0 , flag = false, k = y+1
  120. const tableKey = Object.keys(table).reverse();
  121. for (let i = 0; i < 14; i++) {
  122. if ( tableKey[i] === x ) {
  123. flag = true
  124. }
  125. if ( flag === false ) continue
  126. k--
  127. if ( table[tableKey[i]][k] === userStatus ) {
  128. n++
  129. } else if (table[tableKey[i]][k] === 0) {
  130. break;
  131. } else {
  132. n=0
  133. }
  134. }
  135. if ( n >= 5 ) return true
  136. //向左下角遍历
  137. n = 0 ; k = y-1; flag = false;
  138. const rTableKey = Object.keys(table)
  139. for (let i = 0; i < table[x].length; i++ ) {
  140. if ( rTableKey[i] === x ) {
  141. flag = true
  142. }
  143. if ( flag === false ) continue
  144. k++
  145. if ( table[rTableKey[i]][k] === userStatus ) {
  146. n++
  147. } else if (table[rTableKey[i]][k] === 0) {
  148. break;
  149. } else {
  150. n=0
  151. }
  152. }
  153. if ( n >= 5 ) return true
  154. return false
  155. }
  156. return (
  157. <div className='body'>
  158. <Navigation updateTable={updateTable} gameStatus={setGameStatus} status={userStatus} />
  159. <div className='center'>
  160. <div className='checkerboard'>
  161. <div className='board' >
  162. {Object.keys(table).map((x) => {
  163. return (
  164. <div key={x} className='board-grid'>
  165. {table[x].map((value, y) => {
  166. return (
  167. <div
  168. onClick={() => {
  169. goBangTouchEvent(x, y, value)
  170. }}
  171. onTouchEnd={() => {
  172. goBangTouchEvent(x, y, value)
  173. }}
  174. className={(() => {
  175. switch (value) {
  176. case 0: return 'board-item'
  177. case 1: return 'black board-item'
  178. case 2: return 'white board-item'
  179. default: return 'board-item'
  180. }
  181. })()}
  182. key={y}
  183. >
  184. </div>
  185. )
  186. })}
  187. </div>
  188. )
  189. })}
  190. </div>
  191. <div className='bj' >
  192. {(() => {
  193. const ret = bgline[0].map((x) => {
  194. return (
  195. <div key={x} className='bj-grid'>
  196. {
  197. bgline[1].map((y) => {
  198. return (
  199. <div key={y} className={(() => {
  200. let ret = 'bj-item'
  201. if (x === 'n') {
  202. ret += ' bj-bottom'
  203. }
  204. if (y === '14') {
  205. ret += ' bj-right'
  206. }
  207. return ret
  208. })()}>
  209. {x === 'x' && y !== '0' ? <span className='xline'>{y}</span> : ''}
  210. {y === '0' && x !== 'x' ? <span className='yline'>{x}</span> : ''}
  211. </div>
  212. )
  213. })
  214. }
  215. </div>
  216. )
  217. })
  218. return ret
  219. })()}
  220. </div>
  221. </div>
  222. </div>
  223. </div>
  224. )
  225. }
  226. export default Checkerboard