【发布时间】:2016-12-31 19:30:08
【问题描述】:
我正在尝试自学没有多余的 JavaScript 游戏开发。我选择在棋盘上保留所有可能的位置,以便游戏需要在逻辑对象中渲染 x 或 o 作为可能的移动。我不知道如何在它出现的矩形区域内绘制 x。我希望玩家最终单击或触摸可能移动对象的矩形区域中的任何空间。我怎么做?当我需要创建实例而不知道玩家将点击或触摸的位置时,我该如何重做?
// the stage object holds the HTML5 canvas, it's 2d context, and a self starting function that sizes it. (unless all ready fired, canvas is not defined.)
var stage = {
canvas: document.getElementById('canvas'),
context: this.canvas.getContext('2d'),
full_screen: (function () {
this.canvas.width = document.documentElement.clientWidth;
this.canvas.height = window.innerHeight;
this.canvas.style.border = '1px solid black';
console.log(this.canvas);
return this.canvas;
})()
};
stage.width = stage.canvas.width;
stage.height = stage.canvas.height;
var init = function () {
// ui for the game
var button = {
pause: document.getElementById('pause'),
restart: document.getElementById('restart'),
options: document.getElementById('opt')
};
// this function assigns functions the ui buttons
var functionality = function () {
button.pause.onclick = pause;
button.restart.onclick = restart;
button.options.onclick = options;
};
var logic = {
player: { score: 0 },
cpu: { score: 0 },
possible_moves: {
x: 0,
y: 0,
top_left: {
x: stage.width * .05,
y: stage.height * .02,
width: stage.width * .22,
height: stage.height * .22,
draw: function () {
stage.context.beginPath();
stage.context.lineWidth = 1;
stage.context.rect(this.x, this.y, this.width, this.height);
stage.context.stroke();
}
},
top_middle: {
x: stage.canvas.width * .385,
y: stage.canvas.height * .02,
width: stage.width * .22,
height: stage.height * .22,
draw: function () {
stage.context.beginPath();
stage.context.lineWidth = 1;
stage.context.rect(this.x, this.y, this.width, this.height);
stage.context.stroke();
}
},
top_right: {
x: stage.canvas.width * .715,
y: stage.canvas.height * .02,
width: stage.width * .22,
height: stage.height * .22,
draw: function () {
stage.context.beginPath();
stage.context.lineWidth = 1;
stage.context.rect(this.x, this.y, this.width, this.height);
stage.context.stroke();
}
},
middle_left: {
x: stage.canvas.width * .05,
y: stage.canvas.height * .35,
width: stage.width * .22,
height: stage.height * .22,
draw: function () {
stage.context.beginPath();
stage.context.lineWidth = 1;
stage.context.rect(this.x, this.y, this.width, this.height);
stage.context.stroke();
}
},
middle_middle: {
x: stage.canvas.width * .385,
y: stage.canvas.height * .35,
width: stage.width * .22,
height: stage.height * .22,
draw: function () {
stage.context.beginPath();
stage.context.lineWidth = 1;
stage.context.rect(this.x, this.y, this.width, this.height);
stage.context.stroke();
}
},
middle_right: {
x: stage.canvas.width * .715,
y: stage.canvas.height * .35,
width: stage.width * .22,
height: stage.height * .22,
draw: function () {
stage.context.beginPath();
stage.context.lineWidth = 1;
stage.context.rect(this.x, this.y, this.width, this.height);
stage.context.stroke();
}
},
bottom_left: {
x: stage.canvas.width * .05,
y: stage.canvas.height * .68,
width: stage.width * .22,
height: stage.height * .22,
draw: function () {
stage.context.beginPath();
stage.context.lineWidth = 1;
stage.context.rect(this.x, this.y, this.width, this.height);
stage.context.stroke();
}
},
bottom_middle: {
x: stage.canvas.width * .385,
y: stage.canvas.height * .68,
width: stage.width * .22,
height: stage.height * .22,
draw: function () {
stage.context.beginPath();
stage.context.lineWidth = 1;
stage.context.rect(this.x, this.y, this.width, this.height);
stage.context.stroke();
}
},
bottom_right: {
x: stage.canvas.width * .715,
y: stage.canvas.height * .68,
width: stage.width * .22,
height: stage.height * .22,
draw: function () {
stage.context.beginPath();
stage.context.lineWidth = 1;
stage.context.rect(this.x, this.y, this.width, this.height);
stage.context.stroke();
}
},
draw_top_row: function () {
logic.possible_moves.top_left.draw();
logic.possible_moves.top_middle.draw();
logic.possible_moves.top_right.draw();
},
draw_middle_row: function () {
logic.possible_moves.middle_left.draw();
logic.possible_moves.middle_middle.draw();
logic.possible_moves.middle_right.draw();
},
draw_bottom_row: function () {
logic.possible_moves.bottom_left.draw();
logic.possible_moves.bottom_middle.draw();
logic.possible_moves.bottom_right.draw();
},
draw_left_column: function () {
logic.possible_moves.top_left.draw();
logic.possible_moves.middle_left.draw();
logic.possible_moves.bottom_left.draw();
},
draw_middle_column: function () {
logic.possible_moves.top_middle.draw();
logic.possible_moves.middle_middle.draw();
logic.possible_moves.bottom_middle.draw();
},
draw_right_column: function () {
logic.possible_moves.top_right.draw();
logic.possible_moves.middle_right.draw();
logic.possible_moves.bottom_right.draw();
},
draw_left_to_right_diagonal: function () {
logic.possible_moves.top_left.draw();
logic.possible_moves.middle_middle.draw();
logic.possible_moves.bottom_right.draw();
},
draw_right_to_left_diagonal: function () {
logic.possible_moves.top_right.draw();
logic.possible_moves.middle_middle.draw();
logic.possible_moves.bottom_left.draw();
},
draw_all_moves: function () {
logic.possible_moves.top_left.draw();
logic.possible_moves.top_middle.draw();
logic.possible_moves.top_right.draw();
logic.possible_moves.middle_left.draw();
logic.possible_moves.middle_middle.draw();
logic.possible_moves.middle_right.draw();
logic.possible_moves.bottom_left.draw();
logic.possible_moves.bottom_middle.draw();
logic.possible_moves.bottom_right.draw();
},
generate_logic_map: (function () {
})()
}
};
// I had to add the scoreboard to the logic object as an after thought because I wanted to just reference the two individual player and cpu objects in case I need to increase complextity to those cbjects seperately. Also, jaascript won't allow me to reference these propties "inside" the object.
logic.score_board = {
p: logic.player.score,
c: logic.cpu.score
};
// this object holds the visual elements of the game
var assets = {
x: {
left_to_right: {
x1: logic.possible_moves.top_left.x,
y1: logic.possible_moves.top_left.y,
x2: logic.possible_moves.top_left.width,
y2: logic.possible_moves.top_left.height,
draw: function () {
stage.context.beginPath();
stage.context.moveTo(this.x1, this.y1);
stage.context.lineTo(this.x2, this.y2);
stage.context.stroke();
console.log(this.x1, this.x2, this.y1, this.y2);
}
},
right_to_left: {
x1: logic.possible_moves.top_left.width,
y1: logic.possible_moves.top_left.height,
x2: 0,
y2: 43,
draw: function () {
stage.context.beginPath();
stage.context.moveTo(this.x1, this.y1);
stage.context.lineTo(this.x2, this.y2);
stage.context.stroke();
console.log(this.x1, this.x2, this.y1, this.y2);
}
},
draw: function () {
console.log(this.left_to_right.x1, this.left_to_right.y1, this.left_to_right.x2, this.left_to_right.y2);
stage.context.lineWidth = 5;
stage.context.strokeStyle = 'black';
this.left_to_right.draw();
//this.right_to_left.draw();
}
},
o: {},
grid: {
x: 0,
y: 0,
horizontal_line_l: {
x1: stage.canvas.width * .02,
y1: stage.canvas.height * .33,
x2: stage.canvas.width * .98,
y2: stage.canvas.height * .33,
draw: function () {
stage.context.beginPath();
stage.context.moveTo(this.x1, this.y1);
stage.context.lineTo(this.x2, this.y2);
stage.context.stroke();
}
},
horizontal_line_r: {
x1: stage.canvas.width * .02,
y1: stage.canvas.height * .66,
x2: stage.canvas.width * .98,
y2: stage.canvas.height * .66,
draw: function () {
stage.context.beginPath();
stage.context.moveTo(this.x1, this.y1);
stage.context.lineTo(this.x2, this.y2);
stage.context.stroke();
}
},
vertical_line_u: {
x1: stage.canvas.width * .33,
y1: stage.canvas.height * .02,
x2: stage.canvas.width * .33,
y2: stage.canvas.height * .98,
draw: function () {
stage.context.beginPath();
stage.context.moveTo(this.x1, this.y1);
stage.context.lineTo(this.x2, this.y2);
stage.context.stroke();
}
},
vertical_line_d: {
x1: stage.canvas.width * .66,
y1: stage.canvas.height * .02,
x2: stage.canvas.width * .66,
y2: stage.canvas.height * .98,
draw: function () {
stage.context.beginPath();
stage.context.moveTo(this.x1, this.y1);
stage.context.lineTo(this.x2, this.y2);
stage.context.stroke();
}
},
draw: function () {
stage.context.lineWidth = 20;
stage.context.strokeStyle = '#0000ff';
stage.context.lineCap = 'round';
this.horizontal_line_l.draw();
this.horizontal_line_r.draw();
this.vertical_line_u.draw();
this.vertical_line_d.draw();
}
},
text: {}
};
assets.grid.draw();
logic.possible_moves.draw_all_moves();
assets.x.draw();
};
window.onload = init();
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>Tik Tack Toe</title>
<link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/3.18.1/build/cssreset/cssreset-min.css">
<link rel="stylesheet" type="text/css" href="game.css" />
</head>
<body>
<div id="container">
<canvas id="canvas"></canvas>
<div id="UI" class="">
<ul>
<li><button id="pause">Pause</button></li>
<li><button id="restart">Restart</button></li>
<li><button id="opt">Options</button></li>
</ul>
</div>
</div>
<script src="game.js"></script>
</body>
</html>
【问题讨论】:
标签: javascript html canvas frontend tic-tac-toe