Compare commits

..

No commits in common. "main" and "v0.1.0" have entirely different histories.
main ... v0.1.0

20 changed files with 187 additions and 826 deletions

11
.gitignore vendored
View File

@ -1,11 +0,0 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
# production
/build
# typescript
*.tsbuildinfo
next-env.d.ts

View File

@ -1,26 +0,0 @@
FROM nginx:latest
RUN apt-get update && apt-get install -y nodejs npm netcat-openbsd
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
WORKDIR /usr/share/nginx/html
COPY index.html .
COPY default.css .
COPY pages/ .
RUN mkdir -p /usr/share/nginx/html/public
RUN cp /app/build/* ./public
HEALTHCHECK CMD nc -z 127.0.0.1 80
EXPOSE 80

23
Jenkinsfile vendored
View File

@ -1,23 +0,0 @@
pipeline {
agent any
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Build') {
steps {
script {
docker.build('test.trianta.dev:latest')
}
}
}
stage('Deploy') {
steps {
sh 'docker stop test && docker rm test || exit 0'
sh 'docker run -d -p 3466:80 --name test test.trianta.dev:latest'
}
}
}
}

142
css/home.css Normal file
View File

@ -0,0 +1,142 @@
body {
font-family: Arial, sans-serif;
font-size: 14px;
color: #cad3f5;
line-height: 1.5;
max-width: 1920px;
margin-inline: auto;
background: #24273a;
margin: 0px auto;
}
#navigation {
background: #181926;
display: flex;
border-bottom-left-radius: 18px;
border-bottom-right-radius: 18px;
}
.navItem {
margin: 6px;
margin-top: 0px;
padding: 8px;
line-height: 21px;
display: inline-block;
}
#top {
margin-bottom: 6px;
border-radius: 16px;
border-top-left-radius: 0px;
margin: 4px auto;
margin-top: 0px;
height: 55px;
}
#main {
/*background: #1e2030;*/
}
.cardStats {
font-size: 18px;
}
h1 {
width: 130px;
text-align: center;
display: inline-block;
font-size: 1.8rem;
margin: 0px;
padding: 8px;
border-top-left-radius: 18px;
border-top-right-radius: 18px;
}
h2 {
color: #6c6f85;
font-size: 1.8rem;
text-align: center;
margin-top: 0;
margin-bottom: 0.5rem;
}
h3 {
color: #dc8a78;
font-size: 1.3rem;
margin-top: 0;
margin-bottom: 0;
}
h4 {
color: #8c8fa1;
font-size: 1.1rem;
margin-top: 0;
margin-bottom: 0.5rem;
}
p {
margin: 0px;
}
a {
text-decoration: none;
padding: 8px;
color: #8aadf4;
}
a:hover, a:active {
border-radius: 9px;
text-decoration: underline;
text-shadow: 1px 1px 1px #333;
animation: hover 3s linear infinite;
}
a.button {
margin: 14px 10%;
padding: 4px 12px;
border: 1px outset #494d64;
border-radius: 9px;
color: #8aadf4;
display: inline-block;
background-color: #363a4f;
text-decoration: none;
width: 80px;
text-align: center;
}
@keyframes hover {
0% { box-shadow: 0 0 8px 4px #24273a; }
15% { box-shadow: 0 0 8px 4px #494d64; }
50% { box-shadow: 0 0 8px 4px #b7bdf8; }
85% { box-shadow: 0 0 8px 4px #494d64; }
100% { box-shadow: 0 0 8px 4px #24273a; }
}
@keyframes card {
0% { box-shadow: 0 0 8px 4px #24273a; }
50% { box-shadow: 0 0 8px 4px #df8e1d; }
100% { box-shadow: 0 0 8px 4px #24273a; }
}
.card {
background: #363a4f;
text-align: center;
border-radius: 6px;
border-top-left-radius: 18px;
border-top-right-radius: 18px;
animation: card 3s linear infinite;
max-width: 800px;
margin: 0px auto;
}
.cardTop {
background: #1e2030;
border-top-left-radius: 18px;
border-top-right-radius: 18px;
}
#pong {
margin: 6px;
border-radius: 9px;
background: #494d64;
}

23
css/pong.css Normal file
View File

@ -0,0 +1,23 @@
html, body {
height: 100%;
margin: 0;
}
body {
background: black;
display: flex;
align-items: center;
justify-content: center;
}
.button {
background: blue;
color: white;
padding: 15px 20px;
font-size: 32px;
font-family: Arial, Helvetica, sans-serif;
text-transform: uppercase;
cursor: pointer;
position: relative;
}

View File

@ -1,161 +0,0 @@
/*
* base text: #06CDFF
* important text: #8200FF
* background: #03001C
*/
body {
font-family: Arial, sans-serif;
font-weight: 800;
color: #06CDFF;
background: #03001C;
line-height: 1.5;
margin-inline: auto;
margin: 0 auto;
}
.inside {
max-width: 60rem;
margin: 0 auto;
padding: 2rem 1.5rem;
}
nav {
padding: 1rem;
text-align: center;
width: 6rem;
}
nav ul {
list-style: none;
margin: 0;
padding: 0;
}
.gap {
width: 4rem;
}
.content {
width: 48rem;
text-align: left;
}
@media screen and (max-width: 600px) {
.column {
width: 100%;
}
.gap {
visibility: hidden;
}
}
.trianta {
border: none !important;
color: #06CDFF !important;
font-size: 2.5rem !important;
min-width: 12rem;
margin: -1rem;
}
.canvas {
margin: auto;
display: inline-block;
width: 60rem;
vertical-align: bottom;
border: solid 4px #06CDFF;
}
.stats {
font-size: 18px;
display: inline-block;
width: 12rem;
vertical-align: middle;
}
h1 {
max-width: 650px;
text-align: left;
padding: 8px 1.5rem;
}
h2 {
border: solid 2px #06CDFF;
margin: auto;
padding: 8px;
text-align: center;
width: 400px;
}
h3 {
text-align: center;
margin-top: 0;
margin-bottom: 0.5rem;
}
p {
margin: 0px;
}
a {
background-color: #03001C;
border: solid 2px #06CDFF;
border-radius: 12px;
color: #06CDFF;
display: inline-block;
margin: 6px;
margin-top: 0px;
max-width: 8rem;
padding: 8px;
text-align: center;
text-decoration: none;
width: 100%;
}
a:hover, a:active {
text-decoration: underline;
}
a.button {
margin: 14px 10%;
padding: 4px 12px;
display: inline-block;
text-decoration: none;
width: 80px;
text-align: center;
}
a:visited {
border: solid 2px #8200FF;
color: #8200FF;
}
@keyframes hover {
0% { box-shadow: 0 0 8px 4px #eff1f5; }
15% { box-shadow: 0 0 8px 4px #bcc0cc; }
50% { box-shadow: 0 0 8px 4px #7287fd; }
85% { box-shadow: 0 0 8px 4px #bcc0cc; }
100% { box-shadow: 0 0 8px 4px #eff1f5; }
}
@keyframes card {
0% { box-shadow: 0 0 8px 4px #eff1f5; }
50% { box-shadow: 0 0 8px 4px #fe640b; }
100% { box-shadow: 0 0 8px 4px #eff1f5; }
}
.card {
text-align: center;
margin: 0px auto;
margin-top: 25px;
margin-bottom: 25px;
}
.reserve {
max-height: 800px;
}
#pong {
margin: 6px;
background: #03001C;
}

View File

@ -3,27 +3,28 @@
<head> <head>
<meta charset="utf-8"/> <meta charset="utf-8"/>
<title>Trianta</title> <title>Trianta</title>
<link rel="stylesheet" href="/default.css" /> <link rel="stylesheet" href="css/home.css" />
</head> </head>
<body> <body>
<div class="inside"> <div id="navigation" style="margin-bottom: 30px;">
<div> <a class="navItem" href="https://www.github.com/trimutex">GitHub</a>
<a href="/" class="trianta">TRIANTA</a> <a class="navItem" href="https://lab.trianta.dev/Trianta">Projects</a>
<p>Function over form by design</p> <p class="navItem" style="text-align: right; flex-grow: 1;">Trianta</p>
</div> </div>
<div style="display: flex;"> <div id="main">
<nav class="column"> <div class="card">
<ul> <h2 class="cardTop">Pong</h2>
<li><a href="https://www.github.com/trimutex">GitHub</a></li> <canvas width="750" height="585" id="pong"></canvas>
<li><a href="https://lab.trianta.dev/Trianta">Projects</a></li> <script src="js/pong.js"></script>
<li><a href="/completed">Completed</a></li> <div id="gameover" hidden="true">
<li><a href="/current">Current</a></li> <h1>Game Over</h1>
<li><a href="/other">Other</a></li> </div>
<li><a href="/contact">Contact</a></li> <div id="restart" hidden="true">
</ul> <button class="button" type="button" onclick = "restartGame()">Restart Game</a>
</nav> </div>
<div class="column gap"></div> <p class="cardStats">Left Paddle Height: <span id="leftPaddle"></span></p>
<div class="column content"></div> <p class="cardStats">Right Paddle Height: <span id="rightPaddle"></span></p>
<a class="navItem" href="https://lab.trianta.dev/Trianta/trianta.dev/src/branch/main/js/pong.js">View Code</a>
</div> </div>
</div> </div>
</body> </body>

29
package-lock.json generated
View File

@ -1,29 +0,0 @@
{
"name": "trianta.dev",
"version": "0.2.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "trianta.dev",
"version": "0.2.2",
"license": "MIT",
"dependencies": {
"typescript": "^5.5.4"
}
},
"node_modules/typescript": {
"version": "5.6.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
"integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
"license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=14.17"
}
}
}
}

View File

@ -1,19 +0,0 @@
{
"name": "trianta.dev",
"version": "0.2.2",
"description": "My personal website",
"main": "index.html",
"scripts": {
"build": "tsc",
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "https://lab.trianta.dev/Trianta/trianta.dev.git"
},
"author": "trianta",
"license": "MIT",
"dependencies": {
"typescript": "^5.5.4"
}
}

View File

@ -1 +0,0 @@
DirectoryIndex index.html

View File

@ -1,68 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Trianta</title>
<link rel="stylesheet" href="/default.css" />
</head>
<body>
<div class="inside">
<div>
<a href="/" class="trianta">TRIANTA</a>
<p>Function over form by design</p>
</div>
<div style="display: flex;">
<nav class="column">
<ul>
<li><a href="https://www.github.com/trimutex">GitHub</a></li>
<li><a href="https://lab.trianta.dev/Trianta">Projects</a></li>
<li><a href="/completed">Completed</a></li>
<li><a href="/current">Current</a></li>
<li><a href="/other">Other</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>
<div class="column gap"></div>
<div class="column content">
<h2>Completed Projects</h2>
<div class="card reserve">
<div class="canvas">
<canvas width="750" height="585" id="pong"></canvas>
<script src="/public/pong.js"></script>
<div id="gameover" hidden="true">
<h3>Game Over</h3>
</div>
<div id="restart" hidden="true">
<button class="button" type="button" onclick = "restartGame()">Restart Game</a>
</div>
</div>
<div class="stats">
<p style="font-size: 22px;">Pong</p>
<p>Left Paddle Height: <span id="leftPaddle"></span></p>
<p>Right Paddle Height: <span id="rightPaddle"></span></p>
<a href="https://lab.trianta.dev/Trianta/trianta.dev/src/branch/main/src/pong.js">View Code</a>
</div>
</div>
<div class="card reserve">
<div class="canvas">
<canvas width="625" height="375" id="snake"></canvas>
<script src="/public/snake.js"></script>
</div>
<div class="stats">
<p style="font-size: 22px;">Snake</p>
<p>
Adjust game size -- Width:
<input id="snakeWidth" type="number" min="2" max="31" value="31">
Height:
<input id="snakeHeight" type="number" min="2" max="24" value="24">
</p>
<p>Snake Head Location: <span id="snakeHead"></span></p>
<p>Food Location: <span id="snakeFood"></span></p>
<a href="https://lab.trianta.dev/Trianta/trianta.dev/src/branch/main/src/snake.ts">View Code</a>
</div>
</div>
</div>
</div>
</div>
</body>
</html>

View File

@ -1 +0,0 @@
DirectoryIndex index.html

View File

@ -1,34 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Trianta</title>
<link rel="stylesheet" href="/default.css" />
</head>
<body>
<div class="inside">
<div>
<a href="/" class="trianta">TRIANTA</a>
<p>Function over form by design</p>
</div>
<div style="display: flex;">
<nav class="column">
<ul>
<li><a href="https://www.github.com/trimutex">GitHub</a></li>
<li><a href="https://lab.trianta.dev/Trianta">Projects</a></li>
<li><a href="/completed">Completed</a></li>
<li><a href="/current">Current</a></li>
<li><a href="/other">Other</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>
<div class="column gap"></div>
<div class="column content">
<h2>Contact Methods</h2>
<p>E-mail: gregcraw2001@gmail.com</p>
<p>Discord: trianta</p>
</div>
</div>
</div>
</body>
</html>

View File

@ -1 +0,0 @@
DirectoryIndex index.html

View File

@ -1,45 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Trianta</title>
<link rel="stylesheet" href="/default.css" />
</head>
<body>
<div class="inside">
<div>
<a href="/" class="trianta">TRIANTA</a>
<p>Function over form by design</p>
</div>
<div style="display: flex;">
<nav class="column">
<ul>
<li><a href="https://www.github.com/trimutex">GitHub</a></li>
<li><a href="https://lab.trianta.dev/Trianta">Projects</a></li>
<li><a href="/completed">Completed</a></li>
<li><a href="/current">Current</a></li>
<li><a href="/other">Other</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>
<div class="column gap"></div>
<div class="column content">
<h2>Current Personal Projects</h2>
<div class="card">
<h3>Wrench</h3>
<p>Description: A simple application to handle all of your Linux configuration needs.</p>
<p>Language: C++26</p>
<p>Tools: CMake</p>
<p>Frameworks: Qt6</p>
<a href="https://github.com/Trimutex/wrench">View Repository</a>
</div>
<div class="card">
<h3>Synopsis</h3>
<p>Description: A markdown repository containing details and changes of servers I maintain.</p>
<a href="https://github.com/Trimutex/synopsis">View Repository</a>
</div>
</div>
</div>
</div>
</body>
</html>

View File

@ -1 +0,0 @@
DirectoryIndex index.html

View File

@ -1,75 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Trianta</title>
<link rel="stylesheet" href="/default.css" />
</head>
<body>
<div class="inside">
<div>
<a href="/" class="trianta">TRIANTA</a>
<p>Function over form by design</p>
</div>
<div style="display: flex;">
<nav class="column">
<ul>
<li><a href="https://www.github.com/trimutex">GitHub</a></li>
<li><a href="https://lab.trianta.dev/Trianta">Projects</a></li>
<li><a href="/completed">Completed</a></li>
<li><a href="/current">Current</a></li>
<li><a href="/other">Other</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>
<div class="column gap"></div>
<div class="column content">
<h2>Other Projects</h2>
<div class="card">
<h3>Hyprland</h3>
<p>Description: An independent, highly customizable, dynamic tiling Wayland compositor that doesn't sacrifice on its looks. </p>
<a href="https://github.com/hyprwm/Hyprland">View Repository</a>
<p>Language: C++26</p>
<p>Tools: CMake</p>
<p>and various libraries.</p>
<p>Contributions (newest first)</p>
<a href="https://github.com/hyprwm/Hyprland/pull/8323">hyprwm/Hyprland#8323</a>
<a href="https://github.com/hyprwm/Hyprland/pull/8044">hyprwm/Hyprland#8044</a>
<a href="https://github.com/hyprwm/Hyprland/pull/7959">hyprwm/Hyprland#7959</a>
<br>
<a href="https://github.com/hyprwm/Hyprland/pull/7755">hyprwm/Hyprland#7755</a>
<a href="https://github.com/hyprwm/Hyprland/pull/7683">hyprwm/Hyprland#7683</a>
<a href="https://github.com/hyprwm/Hyprland/pull/7633">hyprwm/Hyprland#7633</a>
<br>
<a href="https://github.com/hyprwm/Hyprland/pull/7575">hyprwm/Hyprland#7575</a>
<a href="https://github.com/hyprwm/Hyprland/pull/7458">hyprwm/Hyprland#7458</a>
<a href="https://github.com/hyprwm/Hyprland/pull/6652">hyprwm/Hyprland#6652</a>
</div>
<div class="card">
<h3>Proxy</h3>
<p>Description: A program written in C++ to act as a proxy for another server.</p>
<a href="https://lab.trianta.dev/Trianta/proxy-network">View Repository</a>
<p>Language: C++11</p>
<p>Tools: CMake</p>
<p>Testing Frameworks: <a href="https://github.com/ThrowTheSwitch/Unity">Unity Test (ThrowTheSwitch)</a></p>
</div>
<div class="card">
<h3>Cloudcare</h3>
<p>Description: A sample repository that uses downloaded .bed files to train a model on DNA using PyTorch.</p>
<a href="https://github.com/Trimutex/cloudcare">View Repository</a>
<p>Languages: Python, Bash</p>
<p>Libraries: PyTorch</p>
<p>Tools: Conda</p>
</div>
<div class="card">
<h3>N-Queens</h3>
<p>Description: The N-Queens problem recreated in C++ which gets solved using a Genetic Algorithm.</p>
<a href="https://lab.trianta.dev/Trianta/n-queens">View Repository</a>
<p>Language: C++11</p>
<p>Tools: CMake</p>
</div>
</div>
</div>
</div>
</body>
</html>

View File

@ -1,302 +0,0 @@
enum BoardState {
SNAKE = 0,
FOOD = 1,
CHECKED = 2 // For search algorithms
}
// Bit functions for ease
function isBitSet(value: number, bit: number): boolean {
return ((value >> bit) % 2 != 0)
}
function bitSet(value: number, bit: number): number {
return value | 1 << bit;
}
function bitClear(value: number, bit: number): number {
return value & ~(1 << bit);
}
class Point {
x: number;
y: number;
constructor(x = 0, y = 0) {
this.x = x;
this.y = y;
}
copy(other: Point) {
this.x = other.x;
this.y = other.y;
}
add(other: Point) {
var result = new Point;
result.x = this.x + other.x;
result.y = this.y + other.y;
return result;
}
subtract(other: Point) {
var result = new Point;
result.x = this.x - other.x;
result.y = this.y - other.y;
return result;
}
}
class SnakeCore {
canvas: HTMLCanvasElement;
context: CanvasRenderingContext2D;
grid: number;
timeout: number;
width: number;
height: number;
board: number[][];
body: Point[];
food: Point;
gameover: boolean;
foodAte: boolean;
constructor() {
this.canvas = document.getElementById('snake') as HTMLCanvasElement;
this.context = this.canvas.getContext('2d') as CanvasRenderingContext2D;
this.grid = 25; // size of grid squares
this.timeout = 32; // speed in ms
this.width = 25;
this.height = 15;
this.board = [];
for (let i = 0; i < this.height; i++)
this.board.push(new Array(this.width));
this.body = [];
this.food = new Point();
this.gameover = false;
this.foodAte = true;
this.body.push(new Point(12, 8));
this.board[8][12] = 1;
}
get head(): Point {
return this.body[this.body.length - 1];
}
reset() {
console.debug("[TRACE] Reset was triggered");
this.gameover = false;
this.foodAte = true;
for (let i = 0; i < this.height; i++) {
for (let j = 0; j < this.width; j++) {
this.board[i][j] = 0;
}
}
while (this.body.length > 0)
this.body.pop();
while (g_snakebot.path.length > 0)
g_snakebot.path.pop();
this.startRandom();
this.foodRegen();
this.draw();
}
startRandom() {
this.body.push(new Point(Math.floor(Math.random() * this.width), Math.floor(Math.random() * this.height)));
}
foodRegen() {
if (!this.foodAte)
return;
console.debug("[TRACE] Food reset was triggered");
this.foodAte = false;
while (true) {
let tmp = new Point(Math.floor(Math.random() * this.width), Math.floor(Math.random() * this.height));
if (isBitSet(this.board[tmp.y][tmp.x], BoardState.SNAKE))
continue;
this.board[tmp.y][tmp.x] = bitSet(this.board[tmp.y][tmp.x], BoardState.FOOD);
this.food.copy(tmp);
return;
}
}
// Simulate game logic
simulate() {
// Move snake
let next: Point = new Point;
next.copy(g_snakebot.nextMove());
if (next.x < 0 || next.x > g_snake.width || next.y < 0 || next.y > g_snake.height) {
g_snake.gameover = true;
return;
}
if (isBitSet(g_snake.board[next.y][next.x], BoardState.SNAKE) && (g_snake.body.length > 1)) {
g_snake.gameover = true; // Game should end (Snake touching snake)
return;
}
g_snake.board[next.y][next.x] = bitSet(g_snake.board[next.y][next.x], BoardState.SNAKE);
g_snake.body.push(next);
if (!isBitSet(g_snake.board[next.y][next.x], BoardState.FOOD)) {
let old: Point = g_snake.body.shift() as Point;
g_snake.board[old.y][old.x] = bitClear(g_snake.board[old.y][old.x], BoardState.SNAKE);
} else {
g_snake.board[next.y][next.x] = bitClear(g_snake.board[next.y][next.x], BoardState.FOOD);
g_snake.foodAte = true;
while (g_snakebot.path.length > 0)
g_snakebot.path.pop();
}
}
// Draw game to canvas
draw() {
// Clear the screen
g_snake.context.clearRect(0, 0, g_snake.canvas.width, g_snake.canvas.height);
// Draw game
for (let i = 0; i < g_snake.height; i++) {
for (let j = 0; j < g_snake.width; j++) {
if (isBitSet(g_snake.board[i][j], BoardState.SNAKE))
g_snake.context.fillStyle = "green";
else if (isBitSet(g_snake.board[i][j], BoardState.FOOD))
g_snake.context.fillStyle = "red";
else
continue;
g_snake.context.fillRect(j * g_snake.grid, i * g_snake.grid, g_snake.grid, g_snake.grid);
}
}
}
// Update text on page to match game
updatePageText() {
document.getElementById("snakeHead").innerHTML = "x: " + this.body[this.body.length - 1].x + " y: " + this.body[this.body.length - 1].y;
document.getElementById("snakeFood").innerHTML = "x: " + this.food.x + " y: " + this.food.y ;
}
// Update width and height from page to match game
getPageNumbers() {
let specifiedWidth = parseInt((document.getElementById("snakeWidth") as HTMLInputElement).value);
let specifiedHeight = parseInt((document.getElementById("snakeHeight") as HTMLInputElement).value);
if (this.width == specifiedWidth && this.height == specifiedHeight)
return false;
this.width = specifiedWidth;
this.height = specifiedHeight;
while (this.height > this.board.length)
this.board.push(new Array(this.width));
this.canvas.setAttribute("width", String(specifiedWidth * this.grid));
this.canvas.setAttribute("height", String(specifiedHeight * this.grid));
return true;
}
}
class Bot {
pathUntrimmed: Point[];
path: Point[];
constructor() {
this.pathUntrimmed = [];
this.path = [];
}
bfs() {
var search: Point[] = [g_snake.head];
while (search.length !== 0) {
let current: Point = search.shift() as Point;
if (isBitSet(g_snake.board[current.y][current.x], BoardState.CHECKED))
continue;
this.pathUntrimmed.push(current);
let locals: Point[] = new Array(4);
for (var i = 0; i < 4; i++) {
locals[i] = new Point;
locals[i].copy(current);
}
locals[0].y += 1;
locals[1].x += 1;
locals[2].y -= 1;
locals[3].x -= 1;
for (const local of locals) {
if (local.x < 0 || local.x > g_snake.width - 1 || local.y < 0 || local.y > g_snake.height - 1)
continue;
let value = g_snake.board[local.y][local.x];
if (isBitSet(value, BoardState.FOOD)) {
this.pathUntrimmed.push(local);
return;
}
if (isBitSet(value, BoardState.CHECKED) || isBitSet(value, BoardState.SNAKE))
continue;
search.push(local);
}
g_snake.board[current.y][current.x] = bitSet(g_snake.board[current.y][current.x], BoardState.CHECKED);
}
}
trim() {
let reachedSnake = false;
this.path.push(this.pathUntrimmed.pop() as Point); // Push food location
while (this.pathUntrimmed.length !== 0) {
let location: Point = this.pathUntrimmed.pop();
if (reachedSnake)
continue;
if (isBitSet(g_snake.board[location.y][location.x], BoardState.SNAKE)) {
reachedSnake = true;
continue;
}
var delta = new Point;
delta = location.subtract(this.path[this.path.length - 1]);
if ((Math.abs(delta.x) + Math.abs(delta.y)) === 1)
this.path.push(location);
}
}
unvisit() {
for (let i = 0; i < g_snake.height; i++) {
for (let j = 0; j < g_snake.width; j++) {
g_snake.board[i][j] = bitClear(g_snake.board[i][j], BoardState.CHECKED);
}
}
}
nextMove() {
// Get new path to food
if (this.path.length === 0)
this.pathRefresh();
var next: Point = new Point;
next.copy(this.path.pop());
var delta = new Point;
delta = next.subtract(g_snake.head);
if (delta.x > 1)
console.log("[ERR] delta.x > 1");
else if (delta.x < -1)
console.log("[ERR] delta.x < 1");
if (delta.y > 1)
console.log("[ERR] delta.y > 1");
else if (delta.y < -1)
console.log("[ERR] delta.y < 1");
return next;
}
pathRefresh() {
this.bfs();
this.trim();
this.unvisit();
}
}
const g_snake: SnakeCore = new SnakeCore();
const g_snakebot: Bot = new Bot();
// game loop
function snakeloop() {
// Reset of needed
if (g_snake.gameover || g_snake.getPageNumbers())
g_snake.reset();
// Simulate movement of snake
g_snake.simulate();
// Regenerate food if needed
g_snake.foodRegen();
g_snake.draw();
g_snake.updatePageText();
}
// start the game
setInterval(snakeloop, g_snake.timeout);

View File

@ -1,8 +0,0 @@
{
"compilerOptions": {
"outDir": "./build",
"allowJs": true,
"target": "es5"
},
"include": ["./src/**/*"]
}