Javascript 为什么在使用setinterval时股票代码会被卡住
小提琴: JavaScript:Javascript 为什么在使用setinterval时股票代码会被卡住,javascript,jquery,html,css,Javascript,Jquery,Html,Css,小提琴: JavaScript: function init() { var ctx; var turn = []; var xV = [-1, 0, 1, 0]; var yV = [0, -1, 0, 1]; var queue = []; var elements = 1; var map = [];
function init() {
var ctx;
var turn = [];
var xV = [-1, 0, 1, 0];
var yV = [0, -1, 0, 1];
var queue = [];
var elements = 1;
var map = [];
var MR = Math.random;
var X = 5 + (MR() * (100 - 10)) | 0;
var Y = 5 + (MR() * (30 - 10)) | 0;
var direction = MR() * 3 | 0;
var interval = 0;
var score = 0;
var inc_score = 50;
var sum = 0,
easy = 0;
var i, dir;
var win = window;
var doc = document;
var canvas = doc.createElement('canvas');
var setInt = win.setInterval;
var clInt = win.clearInterval;
for (i = 0; i < 100; i++) {
map[i] = [];
}
canvas.setAttribute('width', 100 * 10);
canvas.setAttribute('height', 30 * 10);
ctx = canvas.getContext('2d');
var div = document.getElementById("pnlGame");
div.appendChild(canvas);
//doc.body.appendChild(canvas);
function placeFood() {
var x, y;
do {
x = MR() * 100 | 0;
y = MR() * 30 | 0;
} while (map[x][y]);
map[x][y] = 1;
ctx.strokeRect(x * 10 + 1, y * 10 + 1, 10 - 2, 10 - 2);
}
placeFood();
function clock() {
if (easy) {
X = (X + 100) % 100;
Y = (Y + 30) % 30;
}
--inc_score;
if (turn.length) {
dir = turn.pop();
if ((dir % 2) !== (direction % 2)) {
direction = dir;
}
}
if (
(easy || (0 <= X && 0 <= Y && X < 100 && Y < 30))
&& 2 !== map[X][Y]) {
if (1 === map[X][Y]) {
score += Math.max(5, inc_score);
inc_score = 50;
placeFood();
elements++;
}
ctx.fillRect(X * 10, Y * 10, 10 - 1, 10 - 1);
map[X][Y] = 2;
queue.unshift([X, Y]);
X += xV[direction];
Y += yV[direction];
if (elements < queue.length) {
dir = queue.pop()
map[dir[0]][dir[1]] = 0;
ctx.clearRect(dir[0] * 10, dir[1] * 10, 10, 10);
}
} else if (!turn.length) {
if (confirm("You lost! Play again? Your Score is " + score)) {
ctx.clearRect(0, 0, 450, 300);
queue = [];
elements = 1;
map = [];
X = 5 + (MR() * (100 - 10)) | 0;
Y = 5 + (MR() * (30 - 10)) | 0;
direction = MR() * 3 | 0;
score = 0;
inc_score = 50;
for (i = 0; i < 100; i++) {
map[i] = [];
}
placeFood();
} else {
clInt(interval);
//window.location = "YourTasks.aspx";
}
}
}
interval = setInt(clock, 120);
doc.onkeydown = function (e) {
var code = e.keyCode - 37;
/*
* 0: left
* 1: up
* 2: right
* 3: down
**/
if (0 <= code && code < 4 && code !== turn[0]) {
turn.unshift(code);
} else if (-5 == code) {
if (interval) {
clInt(interval);
interval = 0;
} else {
interval = setInt(clock, 120);
}
} else { // O.o
dir = sum + code;
if (dir == 44 || dir == 94 || dir == 126 || dir == 171) {
sum += code
} else if (dir === 218) easy = 1;
}
}
}
函数init(){
var-ctx;
var回合=[];
var xV=[-1,0,1,0];
var-yV=[0,-1,0,1];
变量队列=[];
var元素=1;
var-map=[];
var MR=数学随机;
var X=5+(MR()*(100-10))| 0;
var Y=5+(MR()*(30-10))|0;
var方向=MR()*3 | 0;
var区间=0;
var得分=0;
var inc_得分=50;
var总和=0,
easy=0;
变量i,dir;
var win=窗口;
var doc=单据;
var canvas=doc.createElement('canvas');
var setInt=win.setInterval;
var clInt=win.clearInterval;
对于(i=0;i<100;i++){
map[i]=[];
}
canvas.setAttribute('width',100*10);
canvas.setAttribute('height',30*10);
ctx=canvas.getContext('2d');
var div=document.getElementById(“pnlGame”);
子类(画布);
//doc.body.appendChild(画布);
功能食品{
变量x,y;
做{
x=MR()*100 | 0;
y=MR()*30 | 0;
}while(map[x][y]);
map[x][y]=1;
ctx.strokeRect(x*10+1,y*10+1,10-2,10-2);
}
placeFood();
功能时钟(){
如果(容易){
X=(X+100)%100;
Y=(Y+30)%30;
}
--inc_分数;
如果(转弯长度){
dir=turn.pop();
如果((方向%2)!=(方向%2)){
方向=方向;
}
}
如果(
(简单| |(0您已将画布的宽度设置为1000(canvas.setAttribute('width',100*10);
)
在你清理它的地方,你只清理了一个450宽的盒子
ctx.clearRect(0, 0, 450, 300);
您需要将此更改为
ctx.clearRect(0, 0, 1000, 300);
你的提琴不起作用每次我输入javascript并保存JSFIDLE站点时,都会清除所有内容。因此,我用HTML、CSS和JQuery创建了提琴,并将JS发布在这里。:)简单地问一个问题,我正在尝试添加一个处理“OK”的按钮从确认警报中。我从DIV中删除了画布并读取了它,但它一直在追加。我希望通过画布外的按钮处理“确定”以重新启动游戏。如果不介意重新加载页面,可以使用location.reload();
我希望避免重新加载页面,而只是开始游戏的新副本:/I我不太明白您所说的“处理确定以重新启动游戏,但从外部的按钮…”。你可以在小提琴上添加一些东西,并添加一条关于应该发生什么的注释吗?顺便说一句,如果你只是想重新启动,你可以执行clearRect并再次调用init()。在你的init中,你可以执行doc.createElement('canvas'))
只需检查画布是否已经存在-如果画布确实非常跳过CreateElement,那么如果用户单击“确定”,游戏将重新启动。我想防止确认警报在一段时间后变得烦人。相反,在标签中显示分数,并有一个播放按钮,用户可以按该按钮再次玩游戏。