javascript 五子棋

html:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<link rel="stylesheet"  href="style.css" />
</head>
<body>
<canvas id="canvas" οnclick="getit()">
</canvas>
<input id="btn1" type="button" value="开始" οnclick="play();">
<script language="javascript" src="play.js"></script>
</body>
</html>

play.js:

// JavaScript Document
var black=new Image();
var white=new Image();
black.src='2.gif';
white.src='1.gif';
var timer=null;
var i=0;
var  map=[];
for(var j=0;j<14;j++)
{
	map[j]=[];
}
function init()
{
	for(var j=0;j<14;j++)
	{
		for(var k=0;k<14;k++)
		{
			map[j][k]=0;
		}
	}
 var canvas=document.getElementById("canvas");
 canvas.width=600;
 canvas.height=600;
 canvas.style.backgroundColor='#d7c098';
 var  ctx=canvas.getContext('2d');
 ctx.strokeStyle='#fff';
 for(var i=0;i<15;i++)
 {
	 for(var j=0;j<15;j++)
	 {
		   ctx.strokeRect(j*40,i*40,40,40); 
	  }
 }
}

function check_win( m,  n)
{
    var total = 1; 
    var i;
	//横向
    for(i = m-1; i >= 0; i--)//统计同行左侧连续同样棋子个数。
        if(map[i][n] == map[m][n]) total++;
        else break;
    for(i = m+1; i < 14; i ++)//统计同行右侧连续同样棋子个数。
        if(map[i][n] == map[m][n]) total++;
        else break;
    if(total>=5) 
	return 1;//胜利
	total=1;
	//纵向
	 for(i = n-1; i >= 0; i--)//统计同行左侧连续同样棋子个数。
        if(map[m][i] == map[m][n]) total++;
        else break;
    for(i = n+1; i < 14; i ++)//统计同行右侧连续同样棋子个数。
        if(map[m][i] == map[m][n]) total++;
        else break;
    if(total>=5) 
	return 1;//胜利。
	total=1;
	var j=0;
	for(i = m-1,j=n-1; j>=0 &&i >= 0; i--,j--)//统计同行左侧连续同样棋子个数。
        if(map[i][j] == map[m][n]) total++;
        else break;
    for(i = m+1,j=n+1; i < 14&&j<14; i ++,j++)//统计同行右侧连续同样棋子个数。
        if(map[i][j] == map[m][n]) total++;
        else break;
    if(total>=5) 
	return 1;
	
	total=1;
	for(i = m+1,j=n-1; j>=0&&i < 14; i++,j--)//统计同行左侧连续同样棋子个数。
        if(map[i][j] == map[m][n]) total++;
        else break;
    for(i = m-1,j=n+1; i>=0&&j<14; i --,j++)//统计同行右侧连续同样棋子个数。
        if(map[i][j] == map[m][n]) total++;
        else break;
    if(total>=5) 
	return 1;


    return 0; //没有胜利。
}

function getit(ev)
{
	
	var canvas=document.getElementById("canvas");
	var  ctx=canvas.getContext('2d');
	var e=event||ev;
	var x=Math.round((e.clientX-canvas.offsetLeft)/40);
	var y=Math.round(e.clientY/40);
	if(x==0||y==0)
	return;
	if(i%2==0&&map[x-1][y-1]==0)
	{
	   ctx.drawImage(black,x*40-20,y*40-20);
	   map[x-1][y-1]=1;
	   i++;
	}
	if(i%2==1&&map[x-1][y-1]==0)
	{
		ctx.drawImage(white,x*40-20,y*40-20);
		map[x-1][y-1]=2;
		i++;
	}
	
}
function play()
{
	clearInterval(timer);
	init();
	var timer=setInterval(function(){
	for(var i=0;i<14;i++)
	{
		for(var j=0;j<14;j++)
		{
			if(map[i][j]!=0)
			{
				
				if(check_win(i,j))
				{
					if(map[i][j]==1)
					{
						clearInterval(timer);
						var msg = "黑子赢了,是否继续?"; 
						 if (confirm(msg)==true){ 
						   play();
						 }else{ 
						  return; 
						 } 
					}
					if(map[i][j]==2)
					{
						clearInterval(timer);
						var msg = "白子赢了,是否继续?"; 
						 if (confirm(msg)==true){ 
						   play();
						 }else{ 
						  return; 
						 } 
					}
					
				}
			}
		}
	}
	
	},100);
}
css:
@charset "utf-8";
/* CSS Document */

#canvas
  {
	  display:block;
	  border:1px solid #000;
	  width:600px;
	  height:600px;
	  background:#000;
	  margin:0  auto;
  }
 #btn1
 {
	 display:block;
	 margin:0 auto;
  }


好的,我可以为您提供一些关于 JavaScript 实现五子棋的思路。 首先,我们需要创建一个棋盘,可以使用 HTML 的 table 元素来实现。然后,我们需要编写 JavaScript 代码来处理用户的点击事件,并在棋盘上显示出棋子。接下来,我们需要编写判断胜负的逻辑,以及实现悔棋和重新开始游戏等功能。 以下是一个简单的实现五子棋的示例代码: HTML 代码: ``` <table id="chessboard"> <tbody> <tr> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> </tr> <!-- 共有 15 行 --> </tbody> </table> ``` JavaScript 代码: ``` // 定义棋盘大小 const ROWS = 15; const COLS = 15; // 定义棋子类型 const EMPTY = 0; const BLACK = 1; const WHITE = 2; // 初始化棋盘数组 let board = []; for (let i = 0; i < ROWS; i++) { board[i] = []; for (let j = 0; j < COLS; j++) { board[i][j] = EMPTY; } } // 获取棋盘元素 let chessboard = document.getElementById('chessboard'); // 处理用户点击事件 chessboard.addEventListener('click', function(event) { let cell = event.target; if (cell.tagName === 'TD') { let row = cell.parentNode.rowIndex; let col = cell.cellIndex; if (board[row][col] === EMPTY) { // 在棋盘上显示棋子 let chess = document.createElement('div'); chess.className = 'chess'; chess.classList.add(board.currentPlayer === BLACK ? 'black' : 'white'); cell.appendChild(chess); // 更新棋盘数组 board[row][col] = board.currentPlayer; // 判断胜负 if (checkWin(row, col)) { alert(board.currentPlayer === BLACK ? '黑方胜利!' : '白方胜利!'); reset(); } else { // 切换下棋方 board.currentPlayer = board.currentPlayer === BLACK ? WHITE : BLACK; } } } }); // 判断胜负 function checkWin(row, col) { let player = board[row][col]; // 判断横向是否连成五子 let count = 1; for (let i = col - 1; i >= 0 && board[row][i] === player; i--) { count++; } for (let i = col + 1; i < COLS && board[row][i] === player; i++) { count++; } if (count >= 5) { return true; } // 判断纵向是否连成五子 count = 1; for (let i = row - 1; i >= 0 && board[i][col] === player; i--) { count++; } for (let i = row + 1; i < ROWS && board[i][col] === player; i++) { count++; } if (count >= 5) { return true; } // 判断左上到右下是否连成五子 count = 1; for (let i = row - 1, j = col - 1; i >= 0 && j >= 0 && board[i][j] === player; i--, j--) { count++; } for (let i = row + 1, j = col + 1; i < ROWS && j < COLS && board[i][j] === player; i++, j++) { count++; } if (count >= 5) { return true; } // 判断右上到左下是否连成五子 count = 1; for (let i = row - 1, j = col + 1; i >= 0 && j < COLS && board[i][j] === player; i--, j++) { count++; } for (let i = row + 1, j = col - 1; i < ROWS && j >= 0 && board[i][j] === player; i++, j--) { count++; } if (count >= 5) { return true; } return false; } // 重新开始游戏 function reset() { // 清空棋盘数组 for (let i = 0; i < ROWS; i++) { for (let j = 0; j < COLS; j++) { board[i][j] = EMPTY; } } // 清空棋盘元素 let cells = chessboard.getElementsByTagName('td'); for (let i = 0; i < cells.length; i++) { cells[i].innerHTML = ''; } // 切换下棋方 board.currentPlayer = BLACK; } // 初始化游戏 reset(); ``` CSS 代码: ``` #chessboard { border-collapse: collapse; } #chessboard td { width: 30px; height: 30px; border: 1px solid #ccc; vertical-align: middle; text-align: center; } .chess { width: 20px; height: 20px; border-radius: 50%; box-shadow: 1px 1px 3px rgba(0, 0, 0, .5); } .black { background-color: #000; } .white { background-color: #fff; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值