前端实现五子棋小游戏

这段代码是一个基于 HTML、CSS 和 JavaScript 实现的简单五子棋游戏。以下是对代码的详细介绍:

整体结构

  • HTML:构建了游戏的页面结构,包含标题、画布和重新开始按钮。
  • CSS:为页面元素添加样式,如标题居中、画布样式和按钮样式等。
  • JavaScript:实现了游戏的核心逻辑,包括棋盘绘制、落子、判断胜负和计算机 AI 等功能。

完整代码展示

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>五子棋</title>
		<style>
			.title{
				text-align:center;
			}
			
			.chess{
				display: block;/*块级元素*/
				margin: 50px auto;
				box-shadow:5px 5px 5px #B9B9B9,-2px -2px 2px #EFEFEF;
				cursor: pointer;
			}
			div{
				text-align: center;
			}
			
			.restart{
				padding: 10px 20px;
				background-color: #EE82EE;
				border-radius: 5px;
				color: white;
				cursor: pointer;
			}
			
		</style>
	</head>
	<body>
		<h3 class="title">--五子棋--</h3>
		<canvas class="chess" width="450px" height="450px"></canvas>
		<div>
			<a class="restart" onclick="rst()">重新开始</a>
		</div>	
	</body>
	
	<script>
		var chess = document.getElementsByClassName("chess")[0];
		var title = document.getElementsByClassName("title")[0];
		var context = chess.getContext("2d");
		context.strokeStyle="#B9B9B9"
		
		window.onload=function(){
			drawChessBoard();
		}
		
		
		function drawChessBoard(){
			
			for(var i=0;i<15;i++){
				//设置横线起始点的坐标
				context.moveTo(15,15+i*30);
				//设置横线结束点的坐标
				context.lineTo(435,15+i*30);
				//连接2点
				context.stroke();
				
				//设置竖线的起始点坐标
				context.moveTo(15+i*30,15);
				//设置竖线的结束点坐标
				context.lineTo(15+i*30,435);
				//连接2点
				context.stroke();
				
			}
			
		}
		
		
		//设置赢法数组
		
		/**
		 * 0,0,0
		 * 1,0,0
		 * 2,0,0
		 * 3,0,0
		 * 4,0,0
		 * 
		 * 0,0,1
		 * 1,1,1
		 * 2,2,1
		 * 3,3,1
		 * 4,4,1
		 * 
		 * 1,0,1
		 * 2,0,1
		 * 3,0,1
		 * 4,0,1
		 * 5,0,1
		 */
		
		var wins=[];
		for(var i=0;i<15;i++){
			wins[i]=[];
			for(var j=0;j<15;j++){
				wins[i][j]=[]
			}		
		}
		
		//赢法的编号
		var count=0;
		//统计横线赢法
		for(var i=0;i<15;i++){
			for(var j=0;j<11;j++){
				for(var k=0;k<5;k++){
					wins[j+k][i][count]=true;
				}
				
				count++;
			}
			
		}
		
		//统计竖线赢法		
		for(var i=0;i<15;i++){
			for(var j=0;j<11;j++){
				for(var k=0;k<5;k++){
					wins[i][j+k][count]=true;		
				}				
				count++;
			}			
		}
		
		//统计正斜线
		for(var i=0;i<11;i++){
			for(var j=0;j<11;j++){
				for(var k=0;k<5;k++){
					wins[i+k][j+k][count]=true;
				}
				count++;
			}
		}
				
		//统计反斜线	
		for(var i=0;i<11;i++){
			for(var j=14;j>3;j--){
				for(var k=0;k<5;k++){
					wins[i+k][j-k][count]=true;
				}
				count++;
			}
		}
		
		//定义二维数组标记棋盘上的每个坐标是否已经下了棋子
		var chessboard=[];
		for(var i=0;i<15;i++){
			chessboard[i]=[];
			for(var j=0;j<15;j++){
				chessboard[i][j]=0;
			}
		}
		
		//下棋
		var me=true;//标记人是否可以下棋
		var over=false;//标记游戏是否结束
		
		var myWin=[];//记录用户在赢法上的分值
		var computerWin=[];//记录计算机在赢法上的分值
		for(var i=0;i<count;i++){
			myWin[i]=0;
			computerWin[i]=0;
		}
		
		chess.onclick=function(e){
			//如果游戏结束不可以下棋
			if(over){
				return;
			}

			//判断人是否可以下棋
			if(!me){
				return;	
			}
			
			//获取x轴坐标
			var x=e.offsetX;
			
			//获取Y轴坐标
			var y=e.offsetY;
			
			var i = Math.floor(x/30);
			var j = Math.floor(y/30);
			
			if(chessboard[i][j]==0){
				
				//下一个子
				oneStep(i,j,me);
				//标记已经落子
				chessboard[i][j]=1;
				
				for(var k=0;k<count;k++){
					if(wins[i][j][k]){
						
						myWin[k]++;

						if(myWin[k]==5){
							title.innerHTML="恭喜你获胜了!!!~~~"
							over=true;
						}
					}
					
				}
				
			}
			
			if(!over){
				me=!me;
				//计算机落子
				computerAI()
			}
			
		}
		
		function computerAI(){
			
			//空白子在用户所占用赢法上的分值
			var myScore=[];
			//空白子在计算机所占用赢法上的分值
			var computerScore=[];
			
			for(var i=0;i<15;i++){
				
				myScore[i]=[];
				computerScore[i]=[];
				
				for(var j=0;j<15;j++){
					myScore[i][j]=0
					computerScore[i][j]=0;
				}
				
			}
			
			//空白字的最大分值
			var max=0;
			//最大分值空白字所在的坐标
			var x=0,y=0;
			
			for(var i=0;i<15;i++){
				for(var j=0;j<15;j++){
					//判断是否是空白子				
					if(chessboard[i][j]==0){
						
						for(var k=0;k<count;k++){
							if(wins[i][j][k]){
								
								if(myWin[k]==1){
									myScore[i][j]+=200;
								}else if(myWin[k]==2){
									myScore[i][j]+=400;
								}else if(myWin[k]==3){
									myScore[i][j]+=2000;
								}else if(myWin[k]==4){
									myScore[i][j]+=10000;
								}
								
								if(computerWin[k]==1){
									computerScore[i][j]+=220;
								}else if(computerWin[k]==2){
									computerScore[i][j]+=420;
								}else if(computerWin[k]==3){
									computerScore[i][j]+=2200;
								}else if(computerWin[k]==4){
									computerScore[i][j]+=20000;
								}
								
							}
							
						}
						
						if(myScore[i][j]>max){
							max=myScore[i][j];
							x=i;
							y=j;
						}else if(myScore[i][j]==max){
							if(computerScore[i][j]>max){
								max=computerScore[i][j];
								x=i;
								y=j;
							}						
						}
						
						if(computerScore[i][j]>max){
							max=computerScore[i][j];
							x=i;
							y=j;
						}else if(computerScore[i][j]==max){
							if(myScore[i][j]>max){
								max=myScore[i][j];
								x=i;
								y=j;
							}
						}
						
						
					}
					
				}
				
			}
			
			
			oneStep(x,y,me);
			chessboard[x][y]=1;
			
			for(var k=0;k<count;k++){
				if(wins[x][y][k]){
					computerWin[k]+=1;
					if(computerWin[k]==5){
						title.innerHTML="o(╯□╰)o抱歉计算机获胜了!!~~~"
						over=true;
					}
				}
			}
			
			if(!over){
				me=!me;
			}
			
			
			
		}
		
		
		
		//落子的方法
		function oneStep(i,j,me){
			
			context.beginPath();
			
			context.arc(15+i*30,15+j*30,13,0,2*Math.PI);//画圆
			
			context.closePath();
			
			var color;
			if(me){
				color="#000000";
			}else{
				color="red";
			}
			context.fillStyle=color;
			context.fill();
			
		}
		
		function rst(){
			window.location.reload();
		}
		
		
	</script>
</html>

 效果如图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值