純JS實(shí)現(xiàn)五子棋

棋盤界面十分簡單慕嚷,不怎么美觀监嗜,主要實(shí)現(xiàn)一下功能。


五子棋界面

首先畫20*20的棋盤(橫豎都可以放20個(gè)棋子)惩歉,全部可放400顆棋子等脂,每個(gè)棋子都對應(yīng)一個(gè)位置(x,y),可以命名一個(gè)二維數(shù)組俏蛮,需注意x為列,y為行上遥;每個(gè)位置是一個(gè)小盒子搏屑,盒子有橫豎兩條線,可以用before和after偽類添加粉楚;

var arr=[];
var isBlackFirst=true;
var isGameOver=false;
  //畫棋盤
 var element=document.getElementById("content"); 
  //找到id為content的盒子辣恋,現(xiàn)在是個(gè)空盒子
 for(var n=0;n<400;n++){   //這個(gè)棋盤可以下400個(gè)棋子
     var y=Math.floor(n/20),x=n%20;  
   //每個(gè)棋子都對應(yīng)一個(gè)位置(x,y),可以命名一個(gè)二維數(shù)組
     //需注意x為行,y為列模软;
     arr[x]=[];
     arr[x][y]=0;
    //畫棋盤網(wǎng)格
     var child=document.createElement("div"); //每個(gè)棋子位置是一個(gè)小盒子伟骨,
       //給小盒子添加樣式,用偽元素before和after添加橫豎線
         child.className="small";  
         element.appendChild(child);    //為大盒子添加小盒子
偽類添加網(wǎng)格線

棋盤
(function(child,n){
    child.onclick=function(){  
        var y=Math.floor(n/20),x=n%20;  
      /判斷游戲是否結(jié)束                 
      if(isGameOver)return;//如果游戲結(jié)束就直接返回燃异;
     //判斷點(diǎn)擊位置是否已落子
         //沒有落子:arr[x][y]=0;落黑子:arr[x][y]=1;落白子:arr[x][y]=2; 
        if(arr[x][y]==1||arr[x][y]==2){   
               alert("不能重復(fù)落子");
        return; //已落子直接返回底靠;
     }
     //判斷是否是黑子下,是加黑子特铝,不是就加白子
    if(isBlackFirst){
        arr[x][y]=1;
        child.className=child.className+" small-black";
    }else{
        arr[x][y]=2;
        child.className=child.className+" small-white";
    }
    //用函數(shù)checkSuccess(x,y)判斷是否贏了
    if(checkSuccess(x,y)){
          var str=isBlackFirst?"黑子贏":"白子贏";   
             //是黑子贏就彈窗黑子贏暑中,不是就彈白子贏
         alert(str);
         isGameOver=true;
    }
    isBlackFirst=!isBlackFirst;//取反;如果是真就變成假鲫剿;
  }
})(child,n);

落子時(shí)需要考慮的幾個(gè)問題:
1鳄逾、游戲是否已經(jīng)結(jié)束,如果游戲結(jié)束就直接返回灵莲;
2雕凹、點(diǎn)擊位置是否已落子:沒有落子:arr[x][y]=0;落黑子:arr[x][y]=1;落白子:arr[x][y]=2; 已落子直接返回;政冻;
3枚抵、判斷是否是黑子下,是加黑子明场,不是就加白子汽摹;通過增加類名添樣式,需要注意層級的設(shè)置要比橫豎線的層級高苦锨,才可以顯示在最上面逼泣;
4、輸贏判斷:用函數(shù)checkSuccess(x,y)判斷是否贏了舟舒;是黑子贏就彈窗黑子贏拉庶,不是就彈白子贏;若還沒有贏秃励,下一次落子的顏色與當(dāng)前的相反氏仗,即 isBlackFirst=!isBlackFirst;取反;如果是真就變成假夺鲜。

落子位置

不能重復(fù)落子

輸贏的判斷
共有四種情況: 橫皆尔、豎帚稠、左斜、右斜
每落一次子都要判斷當(dāng)前顏色的棋子是否贏了(舉個(gè)橫向判斷的例子):
1床佳、橫向判斷的時(shí)候滋早,當(dāng)前落的子記作左1右0,向左找沒有找到邊界砌们,并且向左找到的顏色與自己相同杆麸,左邊的棋子數(shù)加1;
2浪感、找到邊界或不是相同顏色就向右找昔头,向右找沒到邊界,并且顏色一樣影兽,右邊的棋子數(shù)加1揭斧,如果向右沒有找到,則跳出循環(huán)峻堰;
3讹开、如果向左找到的同顏色的棋子數(shù)加上向右找到的同顏色棋子數(shù)等于5,說明該顏色的棋子游戲贏了捐名,直接返回游戲結(jié)果旦万,后面的情況不用再判斷 ;否則繼續(xù)判斷其他三種情況镶蹋,原理相同成艘。

 function checkSuccess(x,y){
      var isSuccess=false;
      var  cur_play=isBlackFirst?1:2;
      //四種情況  橫、豎贺归、左斜淆两、右斜
      //一:判橫;
      var  leftNum=1;
      var  rightNum=0;
      var  isLeft=true;  
      for(var n=1;n<=5;n++){
         if(isLeft){    //向左找
            if(x-n>=0&&arr[x-n][y]==cur_play){ 
               //向左找沒有找到邊界拂酣,并且向左找到的顏色與自己相同秋冰;
                leftNum++;   //左邊的棋子數(shù)加1
            }else{    //否則向右找
                    isLeft=false;
                 }
        }else{   //如果isLeft=false,就向右找
              if(x+(n-leftNum)<=19&&arr[x+(n-leftNum)][y]==cur_play){ 
                //向右找沒到邊界,并且顏色一樣踱葛;
             rightNum++;   //右邊的棋子數(shù)加1
              }else{    //如果向右沒有找到丹莲,跳出循環(huán)
                     break;
              }
         }
        if(leftNum+rightNum==5){  
          //如果向左找到的棋子數(shù)加上向右找到的棋子數(shù)等于5,說明該顏色游戲贏了
         isSuccess=true;
         return isSuccess; //直接返回游戲結(jié)果尸诽,后面的情況不用再判斷          
        }
  }
      //二:判豎(判斷方法同上);
      var  topNum=1;
      var  bottomNum=0;
      var isTop=true;
      for(var n=1;n<=5;n++){ 
            if(isTop){
                 if(y-n>=0&&arr[x][y-n]==cur_play){
                     topNum++;
                 }else{
                    isTop=false;
                 }
             }else{
                 if(y+(n-topNum)<=19&&arr[x][y+(n-topNum)]==cur_play){
                         bottomNum++;
                     }else{
                          break;
                     }
             }
            if(topNum+bottomNum==5){
               isSuccess=true;
               return isSuccess;
            }
      }
      //三:判左斜(判斷方法同上)盯另;
      var  lTopNum=1;
      var  rBottomNum=0; 
      var islTop=true;
      for(var n=1;n<=5;n++){
             if(islTop){
                 if(x-n>=0&&y-n>=0&&arr[x-n][y-n]==cur_play){
                     lTopNum++;
                 }else{
                    islTop=false;
                 }
             }else{
                 if(x+(n-lTopNum)<=19&&y+(n-lTopNum)<=19
                 &&arr[x+(n-lTopNum)][y+(n-lTopNum)]==cur_play){
                         rBottomNum++;
                     }else{
                          break;
                     }
             }
            if(lTopNum+rBottomNum==5){
               isSuccess=true;
               return isSuccess; 
            }
      }
      //四:判右斜(判斷方法同上)性含;
      var  rTopNum=1;
      var  lBottomNum=0;
      var isrTop=true;
      for(var n=1;n<=5;n++){
             if(isrTop){
                 if(x+n<=19&&y-n>=0&&arr[x+n][y-n]==cur_play){
                     rTopNum++;
                 }else{
                    isrTop=false;
                 }
             }else{
                 if(x-(n-rTopNum)>=0&&y+(n-rTopNum)<=19
                 &&arr[x-(n-rTopNum)][y+(n-rTopNum)]==cur_play){
                         lBottomNum++;
                     }else{
                          break;
                     }
             }
            if(rTopNum+lBottomNum==5){
               isSuccess=true;
               return isSuccess;
            }
      }
}

外部css樣式

body {
    margin:50px;    
    text-align:center;
    background-color:#92CEA4;
    }
h1{
    color: rgba(23, 22, 22, 0.57);
    font-weight:bold;
    line-height:30px;
    font-size:20px;
    font-family:Arial,times;
    }
#content{
    width:800px;
    height:800px;
    border:1px solid #000;
    margin:10px auto;
    padding:0;
    text-align:left;    
    overflow: hidden;
    }   

.small{
     width:40px;
     height:40px;
     border:0px solid #000;
     float:left;
     position:relative;
     display:inline-block;
     }
.small:before{
     left:0;
     position: absolute;    
     top:20px;      
     width:40px;    
     height:1px;    
     background:#000;       
     content:"";    
     z-index:-1;
     }  
.small:after{
     position: absolute;    
     top:0px;   
     left:20px;         
     width:1px;     
     height:40px;   
     background:#000;           
     content:"";
     z-index:-1;
     }  
.small:hover:after, .small:hover:before {
     background-color: yellow;
     }
.small-white{
     border-radius:20px;
     background:radial-gradient(10px 10px at 10px 10px,#fff,#e2e2e2);
     box-shadow:2px 2px 4px rgba(0,0,0,0.3);
    }
.small-black{
     border-radius:20px;
     background:radial-gradient(10px 10px at 10px 10px,#fff,#333);
     box-shadow:2px 2px 4px rgba(0,0,0,0.4);
    }     

好了,可以開始游戲了鸳惯。商蕴。叠萍。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市绪商,隨后出現(xiàn)的幾起案子苛谷,更是在濱河造成了極大的恐慌,老刑警劉巖格郁,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腹殿,死亡現(xiàn)場離奇詭異,居然都是意外死亡例书,警方通過查閱死者的電腦和手機(jī)锣尉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來决采,“玉大人自沧,你說我怎么就攤上這事∈鞑t!?“怎么了拇厢?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長晒喷。 經(jīng)常有香客問我旺嬉,道長,這世上最難降的妖魔是什么厨埋? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任邪媳,我火速辦了婚禮,結(jié)果婚禮上荡陷,老公的妹妹穿的比我還像新娘雨效。我一直安慰自己,他們只是感情好废赞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布徽龟。 她就那樣靜靜地躺著,像睡著了一般唉地。 火紅的嫁衣襯著肌膚如雪据悔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天耘沼,我揣著相機(jī)與錄音极颓,去河邊找鬼。 笑死群嗤,一個(gè)胖子當(dāng)著我的面吹牛菠隆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼骇径,長吁一口氣:“原來是場噩夢啊……” “哼躯肌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起破衔,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤清女,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后晰筛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嫡丙,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年传惠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了迄沫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卦方,死狀恐怖羊瘩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盼砍,我是刑警寧澤尘吗,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站浇坐,受9級特大地震影響睬捶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜近刘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一擒贸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧觉渴,春花似錦介劫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至踢京,卻和暖如春誉碴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瓣距。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工黔帕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人旨涝。 一個(gè)月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓蹬屹,卻偏偏與公主長得像侣背,于是被迫代替她去往敵國和親白华。 傳聞我的和親對象是個(gè)殘疾皇子慨默,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容