diff --git a/web/src/App.tsx b/web/src/App.tsx
index 4ff136d..08d6815 100644
--- a/web/src/App.tsx
+++ b/web/src/App.tsx
@@ -1,7 +1,9 @@
import './App.css';
-
import reactLogo from './assets/react.svg';
import IncrementButton from './IncrementButton';
+import { SnakeEngine } from './SnakeEngine/SnakeEngine';
+
+SnakeEngine.helloWorld();
function App() {
return (
@@ -15,14 +17,16 @@ function App() {
Vite + React
-
+
Edit src/App.tsx and save to test HMR
-
Click on the Vite and React logos to learn more
+
+ Click on the Vite and React logos to learn more
+
);
}
diff --git a/web/src/SnakeEngine/SnakeEngine.ts b/web/src/SnakeEngine/SnakeEngine.ts
new file mode 100644
index 0000000..19b9596
--- /dev/null
+++ b/web/src/SnakeEngine/SnakeEngine.ts
@@ -0,0 +1,186 @@
+class Constants {
+ static SnakeSpeed = 2;
+}
+
+export class SnakeEngine {
+ static boardSize = 9;
+ static gameOver = false
+ static food = { x: 0, y: 0 }
+ static snake = {
+ // length: 3,
+ body: [
+ { x: 0, y: 0 },
+ { x: 1, y: 0 },
+ { x: 2, y: 0 },
+ ],
+ direction: 'right',
+ };
+
+ static board = this.boardGenerator();
+
+ static randomCoord() {
+ return Math.floor(Math.random() * (SnakeEngine.boardSize + 1));
+ }
+
+ static boardGenerator() {
+ const board: string[] = [];
+ for (let i = 0; i < 10; i++) {
+ let row = '';
+ for (let j = 0; j < 10; j++) {
+ row += '0';
+ }
+ board.push(row);
+ }
+ SnakeEngine.snake.body.forEach(element => {
+ this.UpdateBoard(element.y, element.x, board, true);
+ console.log('BoardGen x: ', element.x, 'y: ', element.y);
+ });
+ this.UpdateBoard(SnakeEngine.food.y, SnakeEngine.food.x, board, false);
+ // this.UpdateBoard(0, 0, board, true);
+ // this.UpdateBoard(0, 1, board, true);
+ // this.UpdateBoard(0, 2, board, true);
+ return board;
+ }
+
+ static UpdateBoard(y: number, x: number, board: Array, snake: boolean) {
+ const row = board[y];
+ // console.log('Update x: ', x, 'y: ', y);
+ const a = row.split('');
+ if (snake === true) {
+ a[x] = 'S';
+ } else {
+ a[x] = 'F';
+ }
+ // add ? a[x] = 'S' : a[x] = '0'; // add if true remove if false
+ board[y] = a.join('');
+ return board;
+ }
+
+ static helloWorld() {
+ const speed = new Constants();
+ console.log(speed);
+ }
+
+ static view(board: Array) {
+ SnakeEngine.board = this.boardGenerator(); // board is generated
+ console.clear();
+ let boardString = '';
+ for (let i = 0; i < board.length - 1; i++) {
+ boardString += board[i] + '\n';
+ }
+ console.log(boardString);
+ }
+
+ static model() {
+ // const newSnakeHead = SnakeEngine.snake.body[SnakeEngine.snake.body.length - 1]; // change to slice
+ let x = SnakeEngine.snake.body[SnakeEngine.snake.body.length - 1].x;
+ let y = SnakeEngine.snake.body[SnakeEngine.snake.body.length - 1].y;
+ switch (SnakeEngine.snake.direction) {
+ case 'up':
+ y = y - 1;
+ if (y < 0) {
+ y = 9;
+ }
+ break;
+ case 'down':
+ y = y + 1;
+ if (y > 9) {
+ y = 0;
+ }
+ break;
+ case 'left':
+ x = x - 1;
+ if (x < 0) {
+ x = 9;
+ }
+ break;
+ case 'right':
+ x = x + 1;
+ if (x > 9) {
+ x = 0;
+ }
+ break;
+ default:
+ }
+ const newSnakeHead = { x: x, y: y };
+ // newSnakeHead.y = y;
+ // newSnakeHead.x = x;
+ // console.log('Model x; ', x, 'Model y: ', y);
+ SnakeEngine.snake.body.push(newSnakeHead);
+ if (SnakeEngine.foodEaten() === false) {
+ SnakeEngine.snake.body.shift();
+ }
+ // this.UpdateBoard(oldTail.y, oldTail.x, SnakeEngine.board, false);
+ // this.UpdateBoard(y, x, SnakeEngine.board, true);
+ }
+
+ static controller() {
+ document.addEventListener('keydown', parseInput);
+ function parseInput(e: { key: string}) {
+ switch (e.key) {
+ case 'w':
+ case 'ArrowUp':
+ SnakeEngine.snake.direction = 'up';
+ break;
+ case 'a':
+ case 'ArrowLeft':
+ SnakeEngine.snake.direction = 'left';
+ break;
+ case 's':
+ case 'ArrowRight':
+ SnakeEngine.snake.direction = 'down';
+ break;
+ case 'd':
+ case 'ArrowDown':
+ SnakeEngine.snake.direction = 'right';
+ break;
+ default:
+ }
+ }
+ }
+
+ static foodEaten() {
+ for (const cell of SnakeEngine.snake.body) {
+ if (cell.x === SnakeEngine.food.x && cell.y === SnakeEngine.food.y) {
+ SnakeEngine.randomiseFood();
+ return true;
+ }
+ }
+ return false;
+ }
+
+ static randomiseFood() {
+ let valid = false;
+ while (valid === false) {
+ valid = true;
+ SnakeEngine.food.x = SnakeEngine.randomCoord();
+ SnakeEngine.food.y = SnakeEngine.randomCoord();
+ for (const cell of SnakeEngine.snake.body) {
+ if (cell.x === SnakeEngine.food.x && cell.y === SnakeEngine.food.y) {
+ valid = false;
+ }
+ }
+ }
+ }
+
+ static main() {
+ SnakeEngine.randomiseFood();
+ // console.log('Get input');
+ this.controller();
+ // this.newFrame();
+ this.view(SnakeEngine.board);
+
+ const interval = setInterval(this.newFrame, 500);
+ if (SnakeEngine.gameOver === true) {
+ clearInterval(interval);
+ }
+
+ return null;
+ }
+
+ static newFrame = () => {
+ this.model();
+ this.view(SnakeEngine.board);
+ }
+}
+SnakeEngine.main();