52 lines
2.2 KiB
Markdown
52 lines
2.2 KiB
Markdown
# 20191201
|
||
|
||

|
||
|
||
```js
|
||
// 整体思想,一个数除一个数就能分成商和余数两部分,用商和余数分别存储x和y的坐标
|
||
let map_width = 400
|
||
let map_height = 400
|
||
let ele_width = 20
|
||
let ele_height = 20
|
||
|
||
// 随机生成坐标,以x坐标为基准, ~~在此处相当于parseInt
|
||
// 横向能放几个格子
|
||
let x_unit = map_width / ele_width
|
||
// 纵向能放几个格子
|
||
let y_unit = map_height / ele_height
|
||
// 生成x坐标,也就是余数 [0, x_unit)
|
||
ele_seat_x = ~~(Math.random() * x_unit)
|
||
// 生成y坐标,也就是商 [0, y_unit) 被除数就是 x_unit 就放大至 [0, y_unit * x_unit)
|
||
ele_seat_y = ~~(Math.random() * y_unit) * x_unit
|
||
// ele_seat 就是完整的坐标,[0, y_unit * x_unit - 1)
|
||
ele_seat = ele_seat_x + ele_seat_y
|
||
|
||
// 逆向解析成单独的 x坐标(像素)和 y坐标(像素)
|
||
let x = ele_seat % x_unit * ele_width
|
||
let y = ~~(ele_seat / x_unit) * ele_height
|
||
|
||
// 正向生成一个坐标,上边那一大堆其实都是分析hhhh
|
||
let seat = ~~(Math.random() * y_unit * x_unit)
|
||
|
||
// 这样生成的坐标进行位置改变的时候也很简单
|
||
// 上下 -+ x_unit 左右 -+ 1
|
||
|
||
// 这样判断会不会和自身相撞只需要进行蛇身的Array.indexOf(新蛇头坐标)看看是不是得-1就ok
|
||
// 这样把蛇身图片和蛇的坐标分来为两个数组进行维护超级香
|
||
|
||
// 判断撞墙
|
||
// 上墙壁 seat < 0
|
||
// 下墙壁 seat >= y_unit * x_unit
|
||
// 左墙壁 方向向左 且 计算蛇头位置 seat % x_unit == x_unit - 1
|
||
// 右墙壁 方向向右 且 计算蛇头位置 seat % x_unit == 0
|
||
// 蛇身体坐标数组
|
||
let snake = [1, 0]
|
||
// 方向
|
||
let direction = 1 //1表示向右,-1表示向左,20表示向下,-20表示向上
|
||
// 蛇头下一步位置,顺手放进数组
|
||
snake.unshift(seat = snake[0] + direction);
|
||
// 判断撞到自己或者撞到墙壁
|
||
if(snake.indexOf(seat, 1) > 0 || seat < 0 || seat > y_unit * x_unit || direction == 1 && seat % x_unit == 0 || direction == -1 && seat % x_unit == x_unit - 1) {
|
||
// 游戏结束的系列操作
|
||
}
|
||
``` |