25 lines
1.2 KiB
JavaScript
25 lines
1.2 KiB
JavaScript
const assert = require('node:assert/strict')
|
|
const fs = require('node:fs')
|
|
const snake = require('../src/common/snake.js')
|
|
let seed=83971
|
|
const rand=()=>{seed=(Math.imul(seed,1664525)+1013904223)>>>0;return seed/4294967296}
|
|
const dirs=[{x:1,y:0},{x:0,y:1},{x:-1,y:0},{x:0,y:-1}]
|
|
let moves=0, seams=0
|
|
for(const board of [16,snake.ARENA]) for(const mode of ['classic','wrap']) for(let game=0;game<1000;game++) {
|
|
let cells=snake.initialSnake(),dir=dirs[0]
|
|
for(let tick=0;tick<100;tick++) {
|
|
dir=snake.turn(dir,dirs[Math.floor(rand()*4)])
|
|
const h=cells[0]
|
|
const food=rand()<0.3?snake.step([h],dir,null,board,'wrap').snake[0]:null
|
|
const r=snake.step(cells,dir,food,board,mode)
|
|
if(!r.alive)break
|
|
if(Math.abs(r.snake[0].x-h.x)>1||Math.abs(r.snake[0].y-h.y)>1)seams++
|
|
cells=r.snake
|
|
assert.equal(new Set(cells.map(c=>c.x+','+c.y)).size,cells.length)
|
|
for(const c of cells)assert.ok(board===16 ? c.x>=0&&c.x<16&&c.y>=0&&c.y<16 : snake.ARENA.rows[c.y].includes(c.x))
|
|
for(const name of snake.renderPieces(cells,dir,board))assert.ok(fs.existsSync(require('node:path').join(__dirname,'../src/common/tex',name+'.png')),name)
|
|
moves++
|
|
}
|
|
}
|
|
console.log(JSON.stringify({randomizedValidMoves:moves,edgeCrossings:seams}))
|