You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
251 lines
8.2 KiB
251 lines
8.2 KiB
import {Component} from '../../lib/vuetranslit.js'
|
|
import app from '../application.js'
|
|
import {GameState, snakeDirection} from '../util/util.js'
|
|
|
|
const template = `<div></div>`
|
|
|
|
class AIComponent extends Component {
|
|
static get tag() { return 'ai'; }
|
|
static get template() { return template; }
|
|
static get props() { return {}; }
|
|
|
|
ready = app;
|
|
hamiltonCircuit = [];
|
|
move_snake = null;
|
|
set_sD = null;
|
|
|
|
async play() {
|
|
const start = parseInt(app.rowCount / 2);
|
|
|
|
this.createHamiltonCircuit(app.rowCount, app.colCount, start + ',2');
|
|
let currInstruction = this.hamiltonCircuit.length - 1;
|
|
|
|
while (app.get_current_state() === GameState.Gameplay) {
|
|
let nextLoc;
|
|
if (currInstruction === this.hamiltonCircuit.length - 1) nextLoc = 0;
|
|
else nextLoc = currInstruction + 1;
|
|
|
|
this.travel(currInstruction,nextLoc);
|
|
|
|
currInstruction = nextLoc;
|
|
await this.sleep(Math.ceil(5000/(app.rowCount * app.colCount)));
|
|
}
|
|
}
|
|
|
|
travel(point1,point2) {
|
|
const p1 = this.hamiltonCircuit[point1].split(',');
|
|
const p2 = this.hamiltonCircuit[point2].split(',');
|
|
|
|
if (parseInt(p1[0]) < parseInt(p2[0])) {
|
|
this.set_sD(snakeDirection.Down);
|
|
} else if (parseInt(p1[0]) > parseInt(p2[0])) {
|
|
this.set_sD(snakeDirection.Up);
|
|
} else if (parseInt(p1[1]) < parseInt(p2[1])) {
|
|
this.set_sD(snakeDirection.Right);
|
|
} else if (parseInt(p1[1]) > parseInt(p2[1])) {
|
|
this.set_sD(snakeDirection.Left);
|
|
}
|
|
this.move_snake();
|
|
}
|
|
|
|
sleep(ms) {
|
|
return new Promise(resolve => setTimeout(resolve,ms));
|
|
}
|
|
|
|
createHamiltonCircuit(rows,cols,start) {
|
|
const getLast = () => { return this.hamiltonCircuit[this.hamiltonCircuit.length - 1]; }
|
|
this.move_hor(1,start);
|
|
if (cols % 2) {
|
|
/*
|
|
10x7: top zigzag, vertical zigzag, full bottom zigzag
|
|
10x9: top zigzag, vertical zigzag, full bottom zigzag
|
|
*/
|
|
if (rows % 4) {
|
|
while (true) {
|
|
if (parseInt(getLast().split(',')[0]) === 1) break;
|
|
this.move_hor_until(1,cols - 3,getLast());
|
|
this.move_vert(-1,getLast());
|
|
if (parseInt(getLast().split(',')[0]) === 1) break;
|
|
this.move_hor_until(-1,0,getLast());
|
|
this.move_vert(-1,getLast());
|
|
}
|
|
while (true) {
|
|
if (parseInt(getLast().split(',')[1]) === cols - 2) break;
|
|
this.move_vert(-1,getLast());
|
|
this.move_hor(1,getLast());
|
|
if (parseInt(getLast().split(',')[1]) === cols - 2) break;
|
|
this.move_vert(1,getLast());
|
|
this.move_hor(1,getLast());
|
|
}
|
|
while (true) {
|
|
if (!this.move_hor(1,getLast())) break;
|
|
if (!this.move_vert(1,getLast())) break;
|
|
if (!this.move_hor(-1,getLast())) break;
|
|
if (!this.move_vert(1,getLast())) break;
|
|
}
|
|
while (true) {
|
|
this.move_hor(-1,getLast());
|
|
if (parseInt(getLast().split(',')[1]) === 0) break;
|
|
this.move_vert_until(-1,parseInt(start.split(',')[0]) + 1, getLast());
|
|
this.move_hor(-1,getLast());
|
|
if (parseInt(getLast().split(',')[1]) === 0) break;
|
|
this.move_vert_until(1,rows - 1, getLast());
|
|
}
|
|
}
|
|
else {
|
|
if ((cols - 1) % 4) {
|
|
while (true) {
|
|
if (parseInt(getLast().split(',')[0]) === 0) break;
|
|
this.move_hor_until(1,cols - 3, getLast());
|
|
this.move_vert(-1,getLast());
|
|
if (parseInt(getLast().split(',')[0]) === 0) break;
|
|
this.move_hor_until(-1,0, getLast());
|
|
this.move_vert(-1,getLast());
|
|
}
|
|
this.move_hor_until(1,cols - 1,getLast());
|
|
while (true) {
|
|
this.move_vert(1,getLast());
|
|
if (parseInt(getLast().split(',')[0]) === parseInt(start.split(',')[0]) + 1) break;
|
|
this.move_hor(-1,getLast());
|
|
this.move_vert(1,getLast());
|
|
if (parseInt(getLast().split(',')[0]) === parseInt(start.split(',')[0]) + 1) break;
|
|
this.move_hor(1,getLast());
|
|
}
|
|
}
|
|
else {
|
|
while (true) {
|
|
if (parseInt(getLast().split(',')[0]) === 0) break;
|
|
this.move_hor_until(1,cols - 2, getLast());
|
|
this.move_vert(-1,getLast());
|
|
if (parseInt(getLast().split(',')[0]) === 0) break;
|
|
this.move_hor_until(-1,0, getLast());
|
|
this.move_vert(-1,getLast());
|
|
}
|
|
this.move_hor_until(1,cols-1,getLast());
|
|
this.move_vert_until(1,parseInt(start.split(',')[0]) + 1, getLast());
|
|
}
|
|
while (true) {
|
|
if (parseInt(getLast().split(',')[0]) === rows - 1) break;
|
|
this.move_hor_until(-1,1,getLast());
|
|
this.move_vert(1,getLast());
|
|
if (parseInt(getLast().split(',')[0]) === rows - 1) break;
|
|
this.move_hor_until(1,cols-1,getLast());
|
|
this.move_vert(1,getLast());
|
|
}
|
|
this.move_hor_until(-1,0,getLast());
|
|
}
|
|
this.move_vert_until(-1,parseInt(start.split(',')[0]),getLast());
|
|
this.move_hor_until(1,parseInt(start.split(',')[1]),getLast());
|
|
}
|
|
else {
|
|
if ((rows - parseInt(start.split(',')[0]) - (rows % 2)) % 2) {
|
|
while (true) {
|
|
if (parseInt(getLast().split(',')[0]) === 1) break;
|
|
this.move_hor_until(1,cols - 2,getLast());
|
|
this.move_vert(-1,getLast());
|
|
if (parseInt(getLast().split(',')[0]) === 1) break;
|
|
this.move_hor_until(-1,0, getLast());
|
|
this.move_vert(-1,getLast());
|
|
}
|
|
while (true) {
|
|
if (!this.move_vert(-1,getLast())) break;
|
|
if (!this.move_hor(1,getLast())) break;
|
|
if (!this.move_vert(1,getLast())) break;
|
|
if (!this.move_hor(1,getLast())) break;
|
|
}
|
|
}
|
|
else {
|
|
while (true) {
|
|
if (parseInt(getLast().split(',')[0]) === 0) break;
|
|
this.move_hor_until(1,cols - 2,getLast());
|
|
this.move_vert(-1,getLast());
|
|
if (parseInt(getLast().split(',')[0]) === 0) break;
|
|
this.move_hor_until(-1,0, getLast());
|
|
this.move_vert(-1,getLast());
|
|
}
|
|
this.move_hor_until(1,cols - 1, getLast());
|
|
}
|
|
this.move_vert_until(1,parseInt(start.split(',')[0]) + 1,getLast());
|
|
|
|
if ((rows - parseInt(start.split(',')[0]) - 1) % 2) {
|
|
while (true) {
|
|
if (parseInt(getLast().split(',')[0]) === rows - 1) break;
|
|
this.move_hor_until(-1,1,getLast());
|
|
this.move_vert(1,getLast());
|
|
if (parseInt(getLast().split(',')[0]) === rows - 1) break;
|
|
this.move_hor_until(1,cols - 1,getLast());
|
|
this.move_vert(1,getLast());
|
|
}
|
|
this.move_hor_until(-1,0,getLast());
|
|
}
|
|
else {
|
|
while (true) {
|
|
if (parseInt(getLast().split(',')[0]) === rows - 2) break;
|
|
this.move_hor_until(-1,1,getLast());
|
|
this.move_vert(1,getLast());
|
|
if (parseInt(getLast().split(',')[0]) === rows - 2) break;
|
|
this.move_hor_until(1,cols - 1,getLast());
|
|
this.move_vert(1,getLast());
|
|
}
|
|
while (true) {
|
|
if (!this.move_vert(1,getLast())) break;
|
|
if (!this.move_hor(-1,getLast())) break;
|
|
if (!this.move_vert(-1,getLast())) break;
|
|
if (!this.move_hor(-1,getLast())) break;
|
|
}
|
|
}
|
|
this.move_vert_until(-1,parseInt(start.split(',')[0]),getLast());
|
|
this.move_hor_until(1,parseInt(start.split(',')[1]),getLast());
|
|
}
|
|
}
|
|
|
|
move_vert_until(dir,row,start) {
|
|
let lastLoc = start.split(',');
|
|
while (parseInt(lastLoc[0]) != row) {
|
|
let nextLoc = (parseInt(lastLoc[0]) + dir) + ',' + lastLoc[1];
|
|
this.hamiltonCircuit.push(nextLoc);
|
|
lastLoc = nextLoc.split(',');
|
|
}
|
|
}
|
|
|
|
move_hor_until(dir, col, start) {
|
|
let lastLoc = start.split(',');
|
|
while (parseInt(lastLoc[1]) != col) {
|
|
let nextLoc = lastLoc[0] + ',' + (parseInt(lastLoc[1]) + dir);
|
|
this.hamiltonCircuit.push(nextLoc);
|
|
lastLoc = nextLoc.split(',');
|
|
}
|
|
}
|
|
|
|
move_vert(dir,start) {
|
|
const currLoc = start.split(',');
|
|
if (parseInt(currLoc[0]) + dir > -1 && parseInt(currLoc[0]) + dir < app.rowCount) {
|
|
const newLoc = (parseInt(currLoc[0]) + dir) + ',' + currLoc[1];
|
|
if (this.hamiltonCircuit.filter(x => x === newLoc).length === 0) {
|
|
this.hamiltonCircuit.push(newLoc);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
move_hor(dir,start) {
|
|
const currLoc = start.split(',');
|
|
if (parseInt(currLoc[1]) + dir > -1 && parseInt(currLoc[1]) + dir < app.colCount) {
|
|
const newLoc = currLoc[0] + ',' + (parseInt(currLoc[1]) + dir);
|
|
if (this.hamiltonCircuit.filter(x => x === newLoc).length === 0) {
|
|
this.hamiltonCircuit.push(newLoc);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
on_create() {
|
|
this.set_sD = app.passFunction[1];
|
|
this.move_snake = app.passFunction[0];
|
|
this.play();
|
|
}
|
|
}
|
|
|
|
export default AIComponent; |