摘要:題目來源于面試公司先看看題目吧假設(shè)我們現(xiàn)在有一個的井字棋游戲,我們用一個二維數(shù)組代表棋盤,代表玩家下的棋子,代表玩家下的棋子,代表該格沒有棋子。
題目來源于面試公司,先看看題目吧
假設(shè)我們現(xiàn)在有一個 3 x 3 的井字棋游戲,我們用一個二維數(shù)組代表棋盤,’x’ 代表玩家 X 下的棋子,’o’ 代表玩家 O 下的棋子,’e’ 代表該格沒有棋子。例如:一個空白的棋盤以下面的二維數(shù)組表示:
[[‘e’, ‘e’, ‘e’], [‘e’, ‘e’, ‘e’], [‘e’, ‘e’, ‘e’] ]
如果玩家 X 在第一行第一列下了一步棋,玩家 O 在第二行第二列下了一步棋,則表示如下:
[[‘x’, ‘e’, ‘e’], [‘e’, ‘o’, ‘e’], [‘e’, ‘e’, ‘e’]]
現(xiàn)在需要一個 function,接受一個已有任意棋子的棋盤(和上面二維數(shù)組一樣的格式),和玩家的標(biāo)志(’x’ 或 ‘o"),返回該玩家下一步有幾種可能的獲勝方式(獲勝方式以數(shù)組表示,[0, 0] 代表在第一行第一列下一步棋即可獲勝,[2, 2] 代表在第三行第三列下一步棋即可獲勝)。例如:
someFunction( ‘x’, [[‘o’, ‘e’, ‘e’], [‘o’, ‘x’, ‘o’], [‘x’, ‘x’, ‘e’]]) // return [ [2, 2], [0, 1], [0, 2] ] someFunction( ‘x’, [[‘x’, ‘o’, ‘o’], [‘x’, ‘x’, ‘e’], [‘e’, ‘o’, ‘e’]]) // return [[2, 2], [1, 2], [2, 0]] someFunction( ‘x’, [[‘x’, ‘x’, ‘o’], [‘e’, ‘e’, ‘e’], [‘e’, ‘e’, ‘e’]]) // return [ ] someFunction( ‘o’, [[‘o’, ‘o’, ‘o’], [‘e’, ‘e’, ‘e’], [‘e’, ‘e’, ‘e’]]) // return [ ]
最后是加分項:
代碼可讀性高
代碼量少
性能高
有可運行的單元測試
使用 ES6 語法實現(xiàn)
使用 functional programming
下面是自己的代碼實現(xiàn).
var getSuccess; +function(){ //假設(shè)3個相連即可獲勝. const linkLen = 3; //實際上, 我們可以理解為, 圍繞某個沒有棋子的點,在 X 和 十 字這4個方向上的比較 //因此這里提供獲取該4個方向上獲取棋盤點的簡易計算公式. const _getTraverlConfig = function(distance){ return [{ cStartRow : -1 * linkLen + 1, cStartLine : -1 * linkLen + 1, rowAdd : 1, lineAdd : 1, }, { cStartRow : -1 * linkLen + 1, cStartLine : linkLen - 1, rowAdd : 1, lineAdd : -1, }, { cStartRow : -1 * linkLen + 1, cStartLine : 0, rowAdd : 1, lineAdd : 0, }, { cStartRow : 0, cStartLine : -1 * linkLen + 1, rowAdd : 0, lineAdd : 1, }]; } //提供一個target字符串重復(fù)n次自己的方法 const _strRepeat = function (target, n){ var s = target, total = ""; while( n > 0 ) { if(n % 2 == 1) total += s; if(n == 1) break; s += s; n = n >>1 ; } return total; } //最終對外暴露的方法, 第一個參數(shù)是下棋的人, 第二個是棋盤的點數(shù)組. getSuccess = function( piece, chessboard ){ var availablePosition = [], distance = chessboard.length, traversalConfig, maxLen, compareStr, chessStr; //根據(jù)幾個點連成線獲取4個方向上的計算公式; traversalConfig = _getTraverlConfig(linkLen); //計算方向上的點數(shù)量. maxLen = 2 * (linkLen - 1) + 1; //如果傳入的piece為x,那么這里的值就為xxx compareStr = _strRepeat(piece, linkLen); //這一步很重要, 將棋盤轉(zhuǎn)為一個字符串,為的就是更快. chessStr = chessboard.reduce( (x,y) => x + y.join("") , "") //檢查每一個字符串, 如果是空的話就判斷能否獲勝. for( let i = 0, len = chessStr.length; i < len; i++) if( "e" == chessStr.charAt(i) ) _checkAvailable(i); function _checkAvailable( sqnm ){ //計算點在棋盤上的行和列. let curRow = Math.floor(sqnm / distance), curLine = sqnm % distance; //以傳入的參數(shù)填在該空點上,得到一個新的棋盤字符串. let tempChessStr = chessStr.substring(0, sqnm) + piece + chessStr.substring(sqnm + 1, chessStr.length); //4個方向上的檢查 for( let i = 0, len = traversalConfig.length; i < len; i++) { let { cStartRow, cStartLine, rowAdd, lineAdd } = traversalConfig[i]; let tempStr = ""; let j = 0; let row = curRow + cStartRow; let line = curLine + cStartLine; while( j < maxLen ) { //超出邊界視為空字符串. if(row < 0 || row > distance || line > distance || line < 0){ tempStr += ""; } else { //方向上棋盤的實際棋子的集合字符串. tempStr += tempChessStr.charAt(row * distance + line); } row += rowAdd; line += lineAdd; j++; } //如果在該字符串中含有需要比較的重復(fù)字符串即可認(rèn)為該點可以獲勝. if( -1 != tempStr.indexOf(compareStr) ) { availablePosition.push([curRow, curLine]); return; } } } console.log(availablePosition); } }();
寫的不好, 請多指教.
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/108026.html
摘要:文章目錄前言正文一,游戲?qū)崿F(xiàn)基本流程二游戲?qū)崿F(xiàn)步驟創(chuàng)建工程及分配功能給頭文件上內(nèi)容當(dāng)當(dāng)當(dāng),主函數(shù)出場游戲函數(shù)里面打印游戲菜單棋盤初始化打印棋盤玩家下棋電腦下棋判斷結(jié)果三游戲結(jié)果演示恭喜友友獲勝啦電腦獲勝,很遺憾,再接再厲 ...
摘要:三子棋目錄一問題介紹三子棋,在民間又叫井字棋。因為人們在游玩時常常不畫棋盤的邊框,正如漢字中的井字,多稱為井字棋。 三子棋 目錄 一、問題介紹 ? ? ? ? 三子棋,在民間又叫井字棋。因為人們在游玩時常常不畫棋盤的邊框,正如漢字中的井字,多稱為井字棋。 三子棋的游戲規(guī)則十分的簡單: ...
摘要:說起井字游戲,真是滿滿的童年味道,還記得最瘋狂的時候是小時候跟同桌拿著一張草稿紙就能玩一節(jié)課,回到家跟弟弟也能繼續(xù)玩,對于沒有太多娛樂節(jié)目的童年來說,真是一款玩不厭的小游戲。 99% of information we read, we forget anyway. The best way to remember is to DO. 體驗地址:http://www.hoohack.m...
摘要:我們在前文中考慮的那張圖就來自這篇文章,之后我們會用剪枝算法來改進之前的解決方案。剪枝算法的實現(xiàn)接下來討論如何修改前面實現(xiàn)的算法,使其變?yōu)榧糁λ惴ā,F(xiàn)在我們已經(jīng)有了現(xiàn)成的和剪枝算法,只要加上一點兒細節(jié)就能完成這個游戲了。 前段時間用 React 寫了個2048 游戲來練練手,準(zhǔn)備用來回顧下 React 相關(guān)的各種技術(shù),以及試驗一下新技術(shù)。在寫這個2048的過程中,我考慮是否可以在其中加...
摘要:我們在前文中考慮的那張圖就來自這篇文章,之后我們會用剪枝算法來改進之前的解決方案。剪枝算法的實現(xiàn)接下來討論如何修改前面實現(xiàn)的算法,使其變?yōu)榧糁λ惴ā,F(xiàn)在我們已經(jīng)有了現(xiàn)成的和剪枝算法,只要加上一點兒細節(jié)就能完成這個游戲了。 前段時間用 React 寫了個2048 游戲來練練手,準(zhǔn)備用來回顧下 React 相關(guān)的各種技術(shù),以及試驗一下新技術(shù)。在寫這個2048的過程中,我考慮是否可以在其中加...
閱讀 2821·2021-10-26 09:48
閱讀 1692·2021-09-22 15:22
閱讀 4071·2021-09-22 15:05
閱讀 626·2021-09-06 15:02
閱讀 2618·2019-08-30 15:52
閱讀 2121·2019-08-29 18:38
閱讀 2769·2019-08-28 18:05
閱讀 2339·2019-08-26 13:55