前言

Canvas API(画布)是在HTML5中新增的标签用于在网页实时生成图像,并且可以操作图像内容。

HTML5的Canvas画布功能真的很强大,与之对应的还有Svg,都是HTML5的核心之一。想了解更多,来看看Canvas和Svg的对比。

HTML主体

简单
中级
高级

黑子先行

JS

注释很详细,不做过多介绍了,注意赢棋算法,和难易程度算法

var num = 0;//连胜次数

var gameMode = false; // 模式,默认人机

var complexity = 1; // 人机时难度级别,默认简单

layer.confirm('请选择模式?', {

btn: ['人机', '人人'],

closeBtn: 0,

}, function(index, layero){

gameMode=false;

$('.choose').animate({

opacity:1

},800)

$('.choose_shade').animate({

opacity:0.6

},800)

layer.close(index);

}, function(index){

gameMode=true;

$('.choose_shade').animate({

opacity:0,

'z-index':-1

},800)

$('.choose').animate({

opacity:0,

'z-index':-1

},800)

});

$('.levl').click(function(){

var index=$(this).index() + 1;

complexity=index;

$('.choose').animate({

opacity:0,

'z-index':-1

})

$('.choose_shade').animate({

opacity:0,

'z-index':-1

})

})

var canWidth = Math.min( 500 , $(window).width()-30);

var canHeight=canWidth;

var chess=document.getElementById('chess');

var context=chess.getContext('2d');

var chess_board=document.getElementById('chess_board');

var context2=chess_board.getContext('2d');

var chess_pointer=document.getElementById('chess_pointer');

var context3=chess_pointer.getContext('2d');

var pointerEnd=[];

// 根据屏幕大小绘制棋盘

$('#chess_pointer').css({

width:canWidth,

height:canHeight

})

$('#chess').css({

width:canWidth,

height:canHeight

})

$('#chess_board').css({

width:canWidth,

height:canHeight

})

$('.checkerboard').css({

width:canWidth,

height:canHeight

})

var utilW=canWidth/15;

var utilH=utilW;

var me;

var chessBoard;

var over;

//赢法数组

var wins=[];

//赢法统计数组

var myWin=[];

var computerWin=[];

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[i][j+k][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[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++;

}

}

var init=function(){

context.clearRect(0,0,450,450);

context3.clearRect(0,0,450,450);

me=true;

chessBoard=[];

over=false;

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

myWin[i]=0;

computerWin[i]=0;

}

}

init()

context2.strokeStyle="#dfdfdf";

var img=new Image();

img.src="data:images/logo.png";

img.=function(){

drawChessBoard();

}

var drawChessBoard=function(){

for(var i=0;i<15;i++){

context2.moveTo(15+i*30,15);

context2.lineTo(15+i*30,435);

context2.stroke();

context2.moveTo(15,15+i*30);

context2.lineTo(435,15+i*30);

context2.stroke();

}

}

var oneStep=function(i,j,me){

context3.clearRect(0,0,450,450);

context.beginPath();

context.arc(15+i*30,15+j*30,13,0, 2*Math.PI);

context.closePath();

var gradient=context.createRadialGradient(15+i*30+2,15+j*30-2,13,15+i*30+2,15+j*30-2,0);

if(me){

gradient.addColorStop(0,"#0a0a0a");

gradient.addColorStop(1,"#636766");

}else{

gradient.addColorStop(0,"#C7C7C7");

gradient.addColorStop(1,"#f9f9f9");

}

context.fillStyle=gradient;

context.fill();

context3.beginPath();

context3.arc(15+i*30,15+j*30,15,0, 2*Math.PI);

context3.closePath();

context3.fillStyle="#FF3366";

context3.fill();

}

chess.=function(e){

e.preventDefault();

var x=e.offsetX;

var y=e.offsetY;

moveLater(x,y);

}

var moveLater=function(x,y){

if(over){

return;

}

var i=Math.floor(x/utilW);

var j=Math.floor(y/utilW);

if(chessBoard[i][j]==0){

oneStep(i,j,me);

if(gameMode){

if (me) {

chessBoard[i][j] = 1;

for (var k = 0; k < count; k++) {

if (wins[i][j][k]) {

myWin[k]++;

computerWin[k] = 6;

if (myWin[k] == 5) {

over = true;

layer.open({

title: '黑子赢了',

content: '亲,再来一局试试!',

btn: ['嗯', '不要'],

yes: function(index){

init();

layer.close(index);

}

});

}

}

}

} else {

chessBoard[i][j] = 2;

for (var k = 0; k < count; k++) {

if (wins[i][j][k]) {

computerWin[k]++;

myWin[k] = 6;

if (computerWin[k] == 5) {

over = true;

layer.open({

title: '白子赢了',

content: '亲,再来一局试试!',

btn: ['嗯', '不要'],

yes: function(index){

// location.reload();

init();

layer.close(index);

}

});

}

}

}

}

me = !me;

}else{

chessBoard[i][j]=1;

for(var k=0;k

if(wins[i][j][k]){

myWin[k]++;

computerWin[k]=6;

if(myWin[k]==5){

over=true;

$('.black').css({'z-index':2})

layer.open({

title: '你赢了',

content: '亲,人家是你的了!',

btn: ['要', '不要'],

yes: function(index){

// location.reload();

num++;

if(num>=3){

$('#tips').html('常胜将军,已连胜'+num+'局');

}else{

$('#tips').html('你已连胜'+num+'局');

}

init();

layer.close(index);

}

});

}

}

}

if(!over){

$('#tips').html('电脑走棋,走着瞧');

me=!me;

computerAI();

}

}

}

}

var computerAI=function(){

var myScore=[];

var computerScore=[];

var max=0;

var u=0,v=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++){

for(var j=0;j<15;j++){

if(chessBoard[i][j]==0){

for(var k=0;k

if(wins[i][j][k]){

if(complexity==1){

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]+=100;

}else if(computerWin[k]==2){

computerScore[i][j]+=300;

}else if(computerWin[k]==3){

computerScore[i][j]+=600;

}else if(computerWin[k]==4){

computerScore[i][j]+=14000;

}

}else if(complexity==2){

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]+=300;

}else if(computerWin[k]==2){

computerScore[i][j]+=500;

}else if(computerWin[k]==3){

computerScore[i][j]+=2100;

}else if(computerWin[k]==4){

computerScore[i][j]+=15000;

}

}else if(complexity==3){

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]+=210;

}else if(computerWin[k]==2){

computerScore[i][j]+=850;

}else if(computerWin[k]==3){

computerScore[i][j]+=3000;

}else if(computerWin[k]==4){

computerScore[i][j]+=80000;

}

}

}

}

if(myScore[i][j]>max){

max=myScore[i][j];

u=i;

v=j;

}else if(myScore[i][j]==max){

if(computerScore[i][j]>computerScore[u][v]){

u=i;

v=j;

}

}

if(computerScore[i][j]>max){

max=computerScore[i][j];

u=i;

v=j;

}else if(computerScore[i][j]==max){

if(myScore[i][j]>myScore[u][v]){

u=i;

v=j;

}

}

}

}

}

oneStep(u,v,false);

chessBoard[u][v]=2;

for(var k=0;k

if(wins[u][v][k]){

computerWin[k]++;

myWin[k]=6;

if(computerWin[k]==5){

over=true;

layer.open({

title: '你输了',

content: '不要放弃,再来一局吧!',

btn: ['嗯', '不要'],

yes: function(index){

// location.reload();

num=0;

init();

layer.close(index);

}

});

}

}

}

if(!over){

me=!me;

if(num==0){

$('#tips').html('该你走棋了,我看好你');

}

}

}

CSS

css都是可有可无的,不影响功能,都是为了美化页面

body,html{

margin:0;

padding:0;

position: relative;

width: 100%;

height: 100%;

}

.chess-content{

padding-top: 48px;

}

canvas{

display: block;

margin:0px auto;

box-shadow: -2px -2px 2px #efefef,5px 5px 5px #b9b9b9;

}

h3{

margin:0;

}

.clear{

clear: both;

}

.checkerboard{

margin:0 auto;

}

#chess{

position: absolute;

z-index: 2;

}

#chess_board{

position: absolute;

z-index: 1;

}

#chess_pointer{

position: absolute;

z-index: 0;

}

.player{

max-width: 500px;

margin:0 auto;

}

.player .baiqi{

float: left;

}

.player .baiqi{

width:15%;

}

.player .tips{

float: left;

width: 70%;

text-align: center;

font-size: 18px;

}

.player .heiqi{

width:15%;

float: right;

}

.player div img{

width: 100%;

}

.choose{

position: absolute;

z-index: 10;

width: 80%;

max-width: 500px;

left: 50%;

border: 1px solid #dfdfdf;

border-radius: 5px;

opacity: 0;

top: 50%;

transform: translateY(-50%);

overflow: hidden;

}

.choose img{

width: 100%;

}

.choose_shade{

width: 100%;

height: 100%;

position: absolute;

z-index: 9;

background: #000;

opacity: 0.6;

margin:0;

}

.choose-lv{

position: absolute;

top: 28%;

width: 100%;

}

.choose-lv div{

margin: 19px 0px 10px 52%;

width: 40%;

text-align: center;

border-radius: 5px;

border: 1px solid #F2F2F2;

color: #fff;

text-shadow: 10px 7px 17px;

font-weight: bold;

line-height: 35px;

z-index: 1;

position: relative;

background: rgba(0, 0, 0, 0.18);

cursor: pointer;

}

.black{

float: right;

position: absolute;

z-index: 1;

width: 40%;

max-width: 400px;

bottom:0;

}

.black img{

width: 100%;

}

.b_img3,.b_img4{

right:0;

}

.tips{

line-height: 75px;

}

演示程序:演示代码

下载源码:下载源码

公告

以后每月5、15、25号更新原创文章,内容不限,喜欢小编的可以点击关注,也可在下方评论留言,你喜欢什么内容,小编根据大家喜欢的内容尝试更新

小游戏3366HTML5小游戏,Canvas小游戏——五子棋相关推荐

  1. 【开源】微信小程序、小游戏以及 Web 通用 Canvas 渲染引擎 - Cax

    Cax 小程序.小游戏以及 Web 通用 Canvas 渲染引擎 Github → github.com/dntzhang/ca- 综合 DEMO | 运动 DEMO 小程序 DEMO 正在审核中敬请 ...

  2. 开发一个Canvas小游戏 实现一个游戏“引擎”

    前言 这个游戏其实在三四年前就写了,中间还重构过好几次,之前都是用简单的面向对象和函数式编程来写,游戏中的元素关系到还是分的挺开,但是游戏的渲染,运算等逻辑分的不够清晰,整个逻辑基本都是自顶向下的流水 ...

  3. HTML5 Canvas小游戏

    知识点 canvas JavaScript 开发准备 代码获取 $ wget https://labfile.oss.aliyuncs.com/courses/361/simple_canvas_ga ...

  4. 见缝插针 一个canvas小游戏

    一个canvas小游戏 https://github.com/Web-ZhangJian/jianfengchazhen JavaScript代码: var canvas=document.query ...

  5. 类打地鼠canvas小游戏

    HTML代码部分: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

  6. 一个类打地鼠的canvas小游戏

    html 部分 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...

  7. html5 2d小游戏,cax: HTML5 Canvas 2D Rendering Engine - 小程序、小游戏以及 Web 通用 Canvas 渲染引擎...

    Cax 小程序.小游戏以及 Web 通用 Canvas 渲染引擎 微信小游戏 特性 Learn Once, Write Anywhere(小程序.小游戏.PC Web.Mobile Web) Writ ...

  8. html集成到小程序1011无标题,GitHub - billee1011/cax: 小程序、小游戏以及 Web 通用 Canvas 渲染引擎...

    Cax 小程序.小游戏以及 Web 通用 Canvas 渲染引擎 小程序 DEMO 正在审核中敬请期待 小游戏 DEMO 正在审核中敬请期待 特性 Learn Once, Write Anywhere ...

  9. 【开源】微信小程序、小游戏以及 Web 通用 Canvas 渲染引擎 - Cax 1

    Cax 小程序.小游戏以及 Web 通用 Canvas 渲染引擎 Github → https://github.com/dntzhang/cax 点我看看 DEMO 小程序 DEMO 正在审核中敬请 ...

  10. 在水果忍者游戏上做改编的中秋切月饼canvas小游戏

    <中秋切月饼游戏>                                                                                     ...

最新文章

  1. 深入浅出linux三剑客之sed必杀技一例
  2. matlab中并行用不了,请教matlab在linux下的并行问题 - 程序语言 - 小木虫 - 学术 科研 互动社区...
  3. Django: jQuery中的function学习(一)
  4. 无法打开数据库‘mysql_MySQL数据库之MYSQL无法启动解决方法
  5. 暖冬福利放送,送3本技术好书
  6. 全国最优秀的计算机学校,2020全国最好的计算机专业学校排名
  7. .net 6简单使用NPOI 读取 Excel 案例+流程
  8. 百度地图开发入门(4):散点图示例
  9. 【知识兔】Excel教程:文本转数值的这些套路,你都会了吗?
  10. 中药材经营需要哪些证件
  11. ArcGIS产品---ArcGIS Enterprise概述
  12. Java使用ObjectInputStream时报错:java.lang.ClassNotFoundException: commen.User
  13. 内网Gitlab如何拉取代码
  14. 12、Storage(存储)(基础知识)
  15. STM32控制ESP8266透传到私有HTTP服务器(Json数据格式)
  16. 对接阿里云短信平台报错
  17. 大写汉字转阿拉伯数字c语言,阿拉伯数字转换成中文大写数字
  18. 计算机教室防辐射方案,办公室电脑族如何防辐射 内调外养轻松应对
  19. 计算机静音图标无法更改怎么办,电脑声音图标有红叉怎么办?教您解决方法
  20. AT2442 フェーン現象 (Foehn Phenomena)

热门文章

  1. 为什么要使用Typescript
  2. 牛腩——遇到的问题总结
  3. IDA Pro与x64dbg联动调试记录
  4. unity-IL2CPP工程打包失败记录
  5. 你不是真正的快乐---纪念即将完结的青春和陪伴我的阿星和星仔和星爷
  6. 学习狂神mybatis
  7. contiki学习笔记-udp-server.c文件详细的解析
  8. 以阿里IoT开发物联网和应用平台
  9. 区块链软件开发艺术品交易平台开发NFT交易平台开发铸造源代码案例分享
  10. 【Python3笔记】五、Python 字符串