h5實現五子棋遊戲 js原生實現
<html>
<head>
<meta charset="utf-8" />
<title>郭勝學習項目-五子棋遊戲-小小AI</title>
<style>
canvas {
display: block;
margin: 50px auto;
box-shadow: -2px -2px 2px #efefef, 5px 5px 5px #b9b9b9;
}
</style>
</head>
<body>
<canvas id="guoshengcanvas" width="450px" height="450px"></canvas>
</body>
</html>
<script>
var chessBoard = [],
me = true,
over = false,
wins = [],
mywin = [],
computerwin = [];
/*
* 初始化贏法數組
* 郭勝
* 三維數組
*/
for(var i = 0; i < 15; i++) {
wins[i] = [];
for(var j = 0; j < 15; j++) {
wins[i][j] = [];
}
}
/*
* 贏法種類:x軸向左,y軸向下,所有的贏法,即"|"放下
* 郭勝
*/
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[i][j + k][count] = true;
}
count++;
}
}
/*
* 贏法種類:x軸向下,y軸向左,所有的贏法,即"——"方向
* 郭勝
*/
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 < 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++;
}
}
/*
* 初始化畫板
* 郭勝
*/
for(var i = 0; i < 15; i++) {
chessBoard[i] = [];
for(var j = 0; j < 15; j++) {
chessBoard[i][j] = 0;
}
}
/*
* 初始化我方和計算機方
* 郭勝
*/
for(var i = 0; i < count; i++) {
mywin[i] = 0;
computerwin[i] = 0;
}
var guoshengcanvas = document.getElementById("guoshengcanvas");
var context = guoshengcanvas.getContext("2d");
//設置或返回用於筆觸的顏色、漸變或模式
context.strokeStyle = "#bfbfbf";
/*
* 畫棋盤
* 郭勝
*/
window.onload = function() {
for(var i = 0; i < 15; i++) {
//把路徑移動到畫布中的指定點,不創建線條
context.moveTo(15 + i * 30, 15);
//添加一個新點,然後在畫布中創建從該點到最後指定點的線條
context.lineTo(15 + i * 30, 435);
context.moveTo(15, 15 + i * 30);
context.lineTo(435, 15 + i * 30);
// 繪製已定義的路徑
context.stroke();
}
}
/*
* 走琪
* 郭勝
*/
var onestep = function(i, j, me) {
context.beginPath();
//畫圓
context.arc(15 + i * 30, 15 + j * 30, 13, 0, 2 * Math.PI);
context.closePath();
//創建放射狀/環形的漸變(用在畫布內容上)
var grandient = context.createRadialGradient(15 + i * 30 + 2, 15 + j * 30 - 2, 13, 15 + i * 30 + 2, 15 + j * 30 - 2, 0);
if(me) {//判斷是我走琪還是計算機,true是我,false是計算機
grandient.addColorStop(0, "#0A0A0A");
grandient.addColorStop(1, "#636766");
} else {
grandient.addColorStop(0, "#D1D1D1");
grandient.addColorStop(1, "#f9f9f9");
}
context.fillStyle = grandient;
context.fill();
}
guoshengcanvas.onclick = function(e) {
if(over) {//如果已經結束,停止
return;
}
if(!me) {//如果不是我走琪,停止
return;
}
var x = e.offsetX;//畫布的x軸像素
var y = e.offsetY;//畫布的y軸像素
var i = Math.floor(x / 30);//遊戲的x軸座標
var j = Math.floor(y / 30);//遊戲的y軸座標
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]++;//我在count這個贏法中已經佔了幾個子了。
computerwin[k] = 8;//我已經佔了,計算機在這個贏法上就沒有了,給設置爲8
if(mywin[k] == 5) {//如果這個贏法中我已經佔了五個,那麼我就贏了。
window.alert("臭小子,你贏了……");
over = true;
}
}
}
}
if(!over) {//遊戲尚未結束
me = !me;//換計算機走琪
computerai();//計算機走琪
}
}
var computerai = function() {
var myscore = [],
computerscore = [];
var max = 0,
uu = 0,
vv = 0;
//初始化二維數組
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;
}
}
for(var i = 0; i < 15; i++) {//從0,0到14,14遍歷,選擇最合適的位置
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] += 2100;
} else if(computerwin[k] == 4) {
computerscore[i][j] += 20000;
}
}
}
/*
* 比較出我的權重值和計算機的權重值,哪一個最大的位置
*/
if(myscore[i][j]>max){
max = myscore[i][j];
uu = i;
vv = j;
}else if(myscore[i][j]==max){
if(computerscore[i][j]>computerscore[uu][vv]){
uu = i;
vv = j;
}
}
if(computerscore[i][j] > max){
max = computerscore[i][j];
uu = i;
vv = j;
}else if(computerscore[i][j] == max){
if(myscore[i][j] > myscore[uu][vv]){
uu = i;
vv = j;
}
}
}
}
}
onestep(uu,vv,false);
chessBoard[uu][vv] = 2;
for(var k=0;k<count;k++){
if(wins[uu][vv][k]){
computerwin[k] ++;
mywin[k] = 8;//在這個贏法上,我已經不可能贏了
if(computerwin[k] == 5){
window.alert("小崽子,一點用都沒有,計算機都玩不過!");
over = true;
}
}
}
if(!over){
me = !me;
}
}
</script>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.