使用纯js的小游戏,五子棋
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>五子棋</title>
<style type="text/css">
*{
padding:0;
margin:0;
}
canvas{
margin:10px;
border:2px solid #CCCCCC; }
#box{
display:inline-block;
position:absolute;
margin-top: 200px;
margin-left: 100px;
}
span{
font :24px "微软雅黑";
display: inline-block;
height:50px;
}
input{
margin-top:30px;
display:block;
width:100px;
height: 50px;
font:16px "微软雅黑";
color:#fff;
background-color: #0099cc;
} </style> </head>
<body>
<canvas width="640" height="640" id="cas"></canvas>
<div id = "box">
<span id= "txt"></span>
<input type = "button" id = "btn" value="重新开始" />
</div> <script type="text/javascript"> var flag = true;//true代表白棋下的棋子,false 代表黑棋子
var isWin = false;
var step = 40; //设置每个棋子的高度是40
var txt = document.getElementById("txt"); var btn = document.getElementById("btn"); var cas = document.getElementById("cas");//画布 var ctx = cas.getContext("2d");
cas.style.backgroundImage = "url(img/an.jpg)";
var img_b = new Image();
img_b.src = "img/red.png";
var img_w = new Image();
img_w.src = "img/bg.png";
//用二维数组来保存棋盘,0代表没有走过,1代表白棋走过。2代表黑气走过
var arr = new Array(16);//声明一个一维数组;
for(var i= 0;i<=15;i++){
arr[i] = new Array(16);
for(var j= 0;j<=15;j++){
arr[i][j] = 0; }
} //绘制棋盘
function drawLine(){ for(var i= 0;i<cas.width/step;i++){
//画竖线
ctx.moveTo((i+1)*step,0);
ctx.lineTo((i+1)*step,cas.height);
//画横线
ctx.moveTo(0,(i+1)*step);
ctx.lineTo(cas.width,(i+1)*step);
ctx.stroke(); }
}
//获取鼠标点击的位置。
cas.onclick = function(e){
//先判断游戏是否结束
if(isWin){
alert("游戏已经结束,请重新开始");
return 0;
}
//判断棋子显示的地方,四条边上不显示棋子。
//鼠标点击的位置减去边框距离页面的上和左的距离(10),减去一个格子宽高的一半(20)
// var x = (e.clientX-10-20)/40 +1;
// var y = (e.clientY-10-20)/40 +1;
var x = (e.pageX-10-20)/40 +1;
var y = (e.pageY-10-20)/40 +1; //进行取整来确定棋子最终显示的位置。
x = parseInt(x); y = parseInt(y);
//如果超出棋盘或者在棋盘的边界直接返回,边界上不能画棋子。
if(x<=0||x>15||y<=0||y>15){
alert("不可以在边界下棋子!");
return;
} //判断这个位置是否已经显示过棋子
if(arr[x][y]!=0){
alert("这个地方已经有棋子了,不可以重复棋子");
return;
}
//判断显示黑棋还是白棋
if(flag){
flag= false;//将标志设置为false,表示下次为黑子。
drawChess(1,x,y);//调用函数画棋子
}else{
flag = true;//将标志改为true,表示下次为白棋。
drawChess(2,x,y);
}
} //画棋子
function drawChess(num,x,y){
//根据x和y确定图片显示的位置,让图片显示在十字线的中间。
//一个格子为40,图片大小为30,所以40-30/2等于25,所以加上25
var x0 = x*step ;
var y0 = y*step ;
if(num ==1 ){ ctx.beginPath();
ctx.arc(x0,y0,15,0,2*Math.PI);
ctx.fillStyle ="#ff2233";
//ctx.fillStyle.backgroundImage = "url(img/red.png)";
ctx.fill();
ctx.closePath();
ctx.stroke(); //ctx.drawImage(img_w,x0,y0);
arr[x][y] = 1;//白子
}else if(num==2){
ctx.beginPath();
ctx.arc(x0,y0,15,0,2*Math.PI);
ctx.fillStyle ="#008000";
//ctx.fillStyle.backgroundImage ="url(img/f.png)";
ctx.fill();
ctx.closePath();
ctx.stroke();
//ctx.drawImage(img_b,x0,y0);
arr[x][y] = 2;//黑子
} //调用函数判断输赢
judge(num,x,y);
} function judge(num,x,y){
//左右方向,上下方向,左上右下,左下右上
var n1=0 , n2 = 0, n3= 0, n4 = 0;
//左右方向
for(var i=x ;i>0;i--){
if(arr[i][y]!=num){
break;
}
n1++;
}
for(var i= x+1;i<=15;i++){
if(arr[i][y]!=num){
break;
}
n1++;
}
//上下方向。
for(var j=y ;j>0;j--){
if(arr[x][j]==num){
n2++;
}else{
break;
}
}
for(var j= y+1;j<=15;j++){ if(arr[x][j]==num){
n2++;
}else{
break;
}
}
//左上到右下
for(var i= x,j= y;i>=0,j>=0;i--,j--){
if(i<0||j<0||arr[i][j]!=num){
break;
}
n3++;
}
for(var i= x+1,j=y+1;i<=15,j<=15;i++,j++){
if(i>15||j>15||arr[i][j]!=num){
break;
}
n3++;
}
//左下到右上
for(var i= x,j= y;i>0,j<=15;i--,j++){
if(i<0||j>=15||arr[i][j]!=num){
break;
}
n4++;
}
for(var i= x+1,j=y-1;i<=15,j>=0;i++,j--){
if(i>=15||j<0||arr[i][j]!=num){
break;
}
n4++;
}
//用一个定时器来延时,否则会显示对话框,然后才显示棋子。
//alert(n1+"--"+n2+"--"+n3+"--"+n4);
var str ;
if(n1>=5||n2>=5||n3>=5||n4>=5){
if(num==1){
alert("恭喜白棋夺冠!");
str = "白棋赢了,游戏结束";
}else if(num ==2){
alert("恭喜黑棋夺冠!");
str = "黑棋赢了,游戏结束";
}
txt.innerHTML = str;
isWin = true;
}
} //重新开始
btn.onclick = function(){
falg = true;
isWin = false; for(var i= 0 ;i<=15;i++){
for(var j= 0;j<=15;j++){
arr[i][j] =0;
}
}
ctx.clearRect(0,0,640,640);
txt.innerHTML = "";
drawLine();
}
drawLine();
</script>
</body>
</html>
现在可以开始玩喽!