js小游戏:五子棋
使用纯js的小游戏,五子棋
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>五子棋</title> 6 <style type="text/css"> 7 *{ 8 padding:0; 9 margin:0; 10 } 11 canvas{ 12 margin:10px; 13 border:2px solid #CCCCCC; 14 15 } 16 #box{ 17 display:inline-block; 18 position:absolute; 19 margin-top: 200px; 20 margin-left: 100px; 21 } 22 span{ 23 font :24px "微软雅黑"; 24 display: inline-block; 25 height:50px; 26 } 27 input{ 28 margin-top:30px; 29 display:block; 30 width:100px; 31 height: 50px; 32 font:16px "微软雅黑"; 33 color:#fff; 34 background-color: #0099cc; 35 } 36 37 </style> 38 39 </head> 40 <body> 41 <canvas width="640" height="640" id="cas"></canvas> 42 <div id = "box"> 43 <span id= "txt"></span> 44 <input type = "button" id = "btn" value="重新开始" /> 45 </div> 46 47 48 <script type="text/javascript"> 49 50 var flag = true;//true代表白棋下的棋子,false 代表黑棋子 51 var isWin = false; 52 var step = 40; //设置每个棋子的高度是40 53 var txt = document.getElementById("txt"); 54 55 var btn = document.getElementById("btn"); 56 57 var cas = document.getElementById("cas");//画布 58 59 var ctx = cas.getContext("2d"); 60 cas.style.backgroundImage = "url(img/an.jpg)"; 61 var img_b = new Image(); 62 img_b.src = "img/red.png"; 63 var img_w = new Image(); 64 img_w.src = "img/bg.png"; 65 //用二维数组来保存棋盘,0代表没有走过,1代表白棋走过。2代表黑气走过 66 var arr = new Array(16);//声明一个一维数组; 67 for(var i= 0;i<=15;i++){ 68 arr[i] = new Array(16); 69 for(var j= 0;j<=15;j++){ 70 arr[i][j] = 0; 71 72 } 73 } 74 75 76 //绘制棋盘 77 function drawLine(){ 78 79 for(var i= 0;i<cas.width/step;i++){ 80 //画竖线 81 ctx.moveTo((i+1)*step,0); 82 ctx.lineTo((i+1)*step,cas.height); 83 //画横线 84 ctx.moveTo(0,(i+1)*step); 85 ctx.lineTo(cas.width,(i+1)*step); 86 ctx.stroke(); 87 88 } 89 } 90 //获取鼠标点击的位置。 91 cas.onclick = function(e){ 92 //先判断游戏是否结束 93 if(isWin){ 94 alert("游戏已经结束,请重新开始"); 95 return 0; 96 } 97 //判断棋子显示的地方,四条边上不显示棋子。 98 //鼠标点击的位置减去边框距离页面的上和左的距离(10),减去一个格子宽高的一半(20) 99 // var x = (e.clientX-10-20)/40 +1; 100 // var y = (e.clientY-10-20)/40 +1; 101 var x = (e.pageX-10-20)/40 +1; 102 var y = (e.pageY-10-20)/40 +1; 103 104 //进行取整来确定棋子最终显示的位置。 105 x = parseInt(x); 106 107 y = parseInt(y); 108 //如果超出棋盘或者在棋盘的边界直接返回,边界上不能画棋子。 109 if(x<=0||x>15||y<=0||y>15){ 110 alert("不可以在边界下棋子!"); 111 return; 112 } 113 114 //判断这个位置是否已经显示过棋子 115 if(arr[x][y]!=0){ 116 alert("这个地方已经有棋子了,不可以重复棋子"); 117 return; 118 } 119 //判断显示黑棋还是白棋 120 if(flag){ 121 flag= false;//将标志设置为false,表示下次为黑子。 122 drawChess(1,x,y);//调用函数画棋子 123 }else{ 124 flag = true;//将标志改为true,表示下次为白棋。 125 drawChess(2,x,y); 126 } 127 } 128 129 //画棋子 130 function drawChess(num,x,y){ 131 //根据x和y确定图片显示的位置,让图片显示在十字线的中间。 132 //一个格子为40,图片大小为30,所以40-30/2等于25,所以加上25 133 var x0 = x*step ; 134 var y0 = y*step ; 135 if(num ==1 ){ 136 137 ctx.beginPath(); 138 ctx.arc(x0,y0,15,0,2*Math.PI); 139 ctx.fillStyle ="#ff2233"; 140 //ctx.fillStyle.backgroundImage = "url(img/red.png)"; 141 ctx.fill(); 142 ctx.closePath(); 143 ctx.stroke(); 144 145 //ctx.drawImage(img_w,x0,y0); 146 arr[x][y] = 1;//白子 147 }else if(num==2){ 148 ctx.beginPath(); 149 ctx.arc(x0,y0,15,0,2*Math.PI); 150 ctx.fillStyle ="#008000"; 151 //ctx.fillStyle.backgroundImage ="url(img/f.png)"; 152 ctx.fill(); 153 ctx.closePath(); 154 ctx.stroke(); 155 //ctx.drawImage(img_b,x0,y0); 156 arr[x][y] = 2;//黑子 157 } 158 159 //调用函数判断输赢 160 judge(num,x,y); 161 } 162 163 function judge(num,x,y){ 164 //左右方向,上下方向,左上右下,左下右上 165 var n1=0 , n2 = 0, n3= 0, n4 = 0; 166 //左右方向 167 for(var i=x ;i>0;i--){ 168 if(arr[i][y]!=num){ 169 break; 170 } 171 n1++; 172 } 173 for(var i= x+1;i<=15;i++){ 174 if(arr[i][y]!=num){ 175 break; 176 } 177 n1++; 178 } 179 //上下方向。 180 for(var j=y ;j>0;j--){ 181 if(arr[x][j]==num){ 182 n2++; 183 }else{ 184 break; 185 } 186 } 187 for(var j= y+1;j<=15;j++){ 188 189 if(arr[x][j]==num){ 190 n2++; 191 }else{ 192 break; 193 } 194 } 195 //左上到右下 196 for(var i= x,j= y;i>=0,j>=0;i--,j--){ 197 if(i<0||j<0||arr[i][j]!=num){ 198 break; 199 } 200 n3++; 201 } 202 for(var i= x+1,j=y+1;i<=15,j<=15;i++,j++){ 203 if(i>15||j>15||arr[i][j]!=num){ 204 break; 205 } 206 n3++; 207 } 208 //左下到右上 209 for(var i= x,j= y;i>0,j<=15;i--,j++){ 210 if(i<0||j>=15||arr[i][j]!=num){ 211 break; 212 } 213 n4++; 214 } 215 for(var i= x+1,j=y-1;i<=15,j>=0;i++,j--){ 216 if(i>=15||j<0||arr[i][j]!=num){ 217 break; 218 } 219 n4++; 220 } 221 //用一个定时器来延时,否则会显示对话框,然后才显示棋子。 222 //alert(n1+"--"+n2+"--"+n3+"--"+n4); 223 var str ; 224 if(n1>=5||n2>=5||n3>=5||n4>=5){ 225 if(num==1){ 226 alert("恭喜白棋夺冠!"); 227 str = "白棋赢了,游戏结束"; 228 }else if(num ==2){ 229 alert("恭喜黑棋夺冠!"); 230 str = "黑棋赢了,游戏结束"; 231 } 232 txt.innerHTML = str; 233 isWin = true; 234 } 235 } 236 237 //重新开始 238 btn.onclick = function(){ 239 falg = true; 240 isWin = false; 241 242 for(var i= 0 ;i<=15;i++){ 243 for(var j= 0;j<=15;j++){ 244 arr[i][j] =0; 245 } 246 } 247 ctx.clearRect(0,0,640,640); 248 txt.innerHTML = ""; 249 drawLine(); 250 } 251 drawLine(); 252 </script> 253 </body> 254 </html>
现在可以开始玩喽!
每一个不曾起舞的日子,都是对生命的辜负。