Форум программистов, компьютерный форум, киберфорум
JavaScript: HTML5 Canvas
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 06.12.2018
Сообщений: 44
1

Змейка на холсте

02.06.2019, 01:56. Показов 1549. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Решил себя испытать, и сделать змейку на js, но что-то не получилось, и приходится писать сюда
CSS
1
2
3
#canvas{
    border: 2px solid black;    
        }
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<html>
<head>
    <title></title>
    <link rel="stylesheet" type="text/css" href="style.css">
    <script src="script.js" type="text/javascript"></script>
</head>
<body>
    <center>
<canvas width="300px" height="405px" id="canvas"></canvas>
    </center>
</body>
</html>
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
var canvas, ctx;
var size =15;
var startpos = 150;
var d =0;
var move;
var snakeLenght = 2;
var tempX = 9, tempY = 19; 
 
 
window.onload = function () {
    canvas = document.getElementById('canvas');
    ctx = canvas.getContext('2d');
}
 
function matrixArray(rows,columns){
  var arr = new Array();
  for(var i=0; i<rows; i++){
    arr[i] = new Array();
    for(var j=0; j<columns; j++){
      arr[i][j] = -1;//вместо i+j+1 пишем любой наполнитель. В простейшем случае - null
    }
  }
  return arr;
}
var XY = matrixArray(20,40);
 
 
addEventListener('keydown', changeMove);
 
function changeMove(e) {
    switch (e.keyCode) {
        case 13:
            XY[tempX][tempY]=0;
            XY[tempX-1][tempY]=1;
            XY[tempX-2][tempY]=2;
            drawAll();
        break;
        case 39:
            if(d!=3){
            clearInterval(move);
            d =1;
            moveOfHead(d);
            }
        break;
        case 40:
            if(d!=4){
            clearInterval(move);
            d =2;
            moveOfHead(d);
            }
        break;
        case 37:
            if(d!=1){
            clearInterval(move);
            d =3;
            moveOfHead(d);
            }
        break;
        case 38:
            if(d!=2){
            clearInterval(move);
            d =4;
            moveOfHead(d);
            }   
        break;
        default:
            // statements_def
            break;
    }
}
 
 
function drawAll() {
    ctx.clearRect(0,0,canvas.width,canvas.height);
    for(let i =0; i<20; i++){
        for(let j=0;j<40;j++){
            if(XY[i][j]==0){
                ctx.fillStyle = 'red';
                ctx.fillRect(i*15,j*10,size,size);
            }else if (XY[i][j]>0) {
                ctx.fillStyle = 'black';
                ctx.fillRect(i*15,j*10,size,size)
            }
        }
    }
}
 
function moveOfHead(vectorOfVelocity) { 
    
        move= setInterval(
        function(){
            if(vectorOfVelocity==1){
            XY[tempX+1][tempY] = 0;
            XY[tempX][tempY] = -1;
            moveBody();
            tempX +=1;
            drawAll();
        }else if (vectorOfVelocity == 2) {
            XY[tempX][tempY+1] = 0;
            XY[tempX][tempY] = -1;
            moveBody();
            tempY +=1;
            drawAll();
        }else if (vectorOfVelocity == 3) {  
            XY[tempX-1][tempY] = 0;
            XY[tempX][tempY] = -1;
            moveBody();
            tempX -=1;
            drawAll();
        }else if (vectorOfVelocity == 4) {
        XY[tempX][tempY-1] = 0;
            XY[tempX][tempY] = -1;
            moveBody();
            tempY -=1;
            drawAll();
        }
        },1000);
}
 
 
function moveBody() {
var x = findHeadPreviousPositionX();
var y = findHeadPreviousPositionY();
console.log(x,y)
}
 
 
function findHeadPreviousPositionX() {
    for(let i =0; i < 20; i ++){
        for (let j = 0; j <40;j++) {
            if(XY[i][j]==0&&d==1){
                return (i-1);
                break;
            }else if (XY[i][j]==0&&d==3) {
                return (i+1);
                break;
            }else if (XY[i][j]==0) {
                if(d==0||d==2){
                    return i;
                    break;
                }
            }
}
}}
 
 
 
function findHeadPreviousPositionY() {
    for(let i =0; i < 20; i ++){
        for (let j = 0; j <40;j++) {
            if(XY[i][j]==0&&d==2){
                return (j-1);
                break;
            }else if (XY[i][j]==0&&d==4) {
                return (j+1);
                break;
            }else if (XY[i][j]==0) {
                if(d==1||d==3){
                    return j;
                    break;
                }
            }
}
}}
 
function findBodyX(numOfParth) {
    for(let i =0; i <20; i++){
        for (let j = 0; j < 40; j++) {
            if(XY[i][j]==numOfParth){
                return i;
                break;
            }
        }
    }
}
function findBodyY(numOfParth) {
    for(let i =0; i <20; i++){
        for (let j = 0; j < 40; j++) {
            if(XY[i][j]==numOfParth){
                return j;
                break;
            }
        }
    }
}
Вот код. Я хотел реализовать движение змейке таким образом:
холст разбит на воображаемые клеточки, есть двумерный массим, количество клеточек по ширине и высоте. Изначальное положение головы 9/19 в массиве.
Когда голова перемещается, то её координаты до перемещения передаются функции, и тело пошагово сдвигается за головой, то есть первый эл. на место головы, второй на место первого, и т.д. Но у меня проблема с переменными tempX и tempY. когда я нажимаю в какую-то сторону, допустим вправо( в самом начале) то меняется только координата х, но стоит мне начать вниз или вверх, то сначала ещё раз изменится х, а уж потом у, так не должно работать, я в сметении.

Добавлено через 53 секунды
И извините за такой галимый код, я только начинаю.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.06.2019, 01:56
Ответы с готовыми решениями:

Игра "Змейка": чтобы змейка не съедала сама себя
Здравствуйте! Пишу змейку на VB 2010. Не получается составить условие того, что бы змейка не...

Рисование на холсте из обьекта
Подскажите пожалуйста как нарисовать холст? var TableHeight = 300, TableWidth = 500; function...

Координаты в canvas на холсте
Всем привет! Я пытаюсь нарисовать телевизор.Так вот, я постоянно путаюсь и немогу нормально...

Повернуть текст на холсте
Столкнулся с проблемой, на холсте ни как не поворачивается текст на определенный угол такая же...

1
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
04.06.2019, 00:45 2
Правильно ли я понимаю, что вы хотите сделать не классическую змейку, которая двигается на одну позицию сама по таймеру, а вашем варианте змейка будет двигаться на одну позицию по нажатию клавиши?

Я бы лучше сначала сделать классическую змейку с таймером. Таймер можно сделать разными путями. Например, с помощью функции setInterval

Мой пример по таймеру выводит значение счётчика, увеличивая его на единицу: https://codepen.io/8Observer8/... itors=1111

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Game
{
    private _counter = 0;
 
    public constructor()
    {
        console.log("Hello My Game");
 
        setInterval(() => { this.GameLoop(); }, 2000);
    }
 
    private GameLoop(): void
    {
        console.log(`My GameLoop. Counter has "${this._counter}" ticks`);
        this._counter++;
    }
}
 
window.onload = () =>
{
    new Game();
}
Добавлено через 4 минуты
Цитата Сообщение от DontBlink Посмотреть сообщение
move= setInterval(
А, всё увидел. Извините за невнимательность.
0
04.06.2019, 00:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.06.2019, 00:45
Помогаю со студенческими работами здесь

Реализации размера шрифта в холсте
Не пойму как реализовать изменение шрифта в canvas через select. Наверное объяснять более подробнее...

Нарисовать 2 градиента на одном холсте
Здравствуйте, у меня 2 прямоугольника залиты разными градиентами (линейный - синий и радиальный...

TCanvas и TPrinter - рисование на холсте с выводом на печать
Если подобная тема обсуждалась, то прошу прощения, но я к сожалению ничего не нашел. Пытаюсь...

Сохранить все, что я вижу на холсте в формат изображения
Вот загрузил я фото с TImage, порисовал там карандашом на Canvas'e в Paintbox'e, но как это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru