cringe-studios.com/meeemster/chess/chess copy.html

217 lines
5.7 KiB
HTML
Raw Permalink Normal View History

2022-11-04 16:30:10 +01:00
<!DOCTYPE html>
<html ng-app="myApp">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.8.2/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js" integrity="sha512-894YE6QWD5I59HgZOGReFYm4dnWc1Qt5NtvYSaNcOP+u1T9qYdvdihz0PPSiiqn/+/3e7Jo4EaG7TubfWGUrMQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<!-- CSS only -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-0evHe/X+R7YkIZDRvuzKMRqM+OrBnVFBL6DOitfPri4tjfHxaWutUpFmBp4vmVor" crossorigin="anonymous">
<style>
body {
background-color: #222;
color: white;
user-select: none;
}
#chessboard {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
grid-template-rows: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
width: 80vmin;
height: 80vmin;
border: 10px solid gray;
}
.chess-container {
display: flex;
justify-content: center;
}
.white {
background-color: white;
}
.black {
background-color: black;
}
.black, .white {
display: flex;
align-items: center;
justify-content: center;
}
.black > img, .white > img {
width: 100%;
}
</style>
</head>
<body>
<header>
<h1>sussy amogus chess edition</h1>
<nav>
<a href="#!chess">A</a>
<a href="#!two">B</a>
<a href="#!three">C</a>
</nav>
</header>
<section>
<div ng-controller="GreetingController" class="chess-container">
<div id="chessboard">
</div>
</div>
</section>
<footer>
chess end. yay
</footer>
<script>
let board = document.getElementById("chessboard");
let PAWN = "pawn";
let KING = "king";
let TEXTURES = {
pawn: {w: "amoguspawnw.png", b: "amoguspawnb.png"},
king: {w: "amoguskingw.png", b: "amoguskingb.png"}
}
let chessfields = [];
function getPiece(element) {
let field = parseInt(element.getAttribute("data-field"));
let x = field % 8;
let y = Math.floor(field / 8);
let pieceBlack = element.getAttribute("data-pieceBlack") == "true";
let type = element.getAttribute("data-pieceType");
return {
type: type,
field: field,
x: x,
y: y,
black: pieceBlack
}
}
function getPieceAt(x, y) {
let field = y * 8 + x;
if(field < 0 || field > 63) return null;
let fieldEl = chessfields[field];
return fieldEl.children.length == 0 ? null : getPiece(fieldEl.children[0]);
}
for(let i = 0; i < 64; i++) {
let field = document.createElement("div");
let x = i % 8;
let y = Math.floor(i / 8);
if(x % 2 == 0 ^ y % 2 == 0) {
field.classList.add("black");
}else {
field.classList.add("white");
}
field.ondragover = function(e) {
let piece = e.dataTransfer.getData("piece");
if(piece == null) return;
let thePiece = document.getElementById(piece);
let pieceObj = getPiece(thePiece);
let pieceOnField = field.children.length != 0;
switch(pieceObj.type) {
case KING:
if(Math.abs(x - pieceObj.x) > 1) return;
if(Math.abs(y - pieceObj.y) > 1) return;
for(let dx = -1; dx <= 1; dx++) {
for(let dy = -1; dy <= 1; dy++) {
let p = getPieceAt(x + dx, y + dy);
if(p != null && p.type == KING && p.black != pieceObj.black) return;
}
}
break;
case PAWN:
if(Math.abs(x - pieceObj.x) > 1) return;
if((x - pieceObj.x == 0) == pieceOnField) return;
if(y - pieceObj.y != (pieceObj.black ? 1 : -1)) return;
break;
}
if(pieceOnField){
let otherPieceObj = getPiece(field.children[0]);
if(pieceObj.black != otherPieceObj.black) {
field.style.backgroundColor = "red";
e.preventDefault();
return;
}
return;
}
field.style.backgroundColor = "green";
e.preventDefault();
}
field.ondragleave = function(e) {
field.style.backgroundColor = null;
}
field.ondrop = function(e) {
e.preventDefault();
let piece = e.dataTransfer.getData("piece");
if(piece == null) return;
field.style.backgroundColor = null;
let thePiece = document.getElementById(piece);
thePiece.setAttribute("data-field", i);
if(field.children.length != 0) field.children[0].remove();
field.appendChild(thePiece);
}
board.appendChild(field);
chessfields.push(field);
}
let pieces = [
{type: PAWN, black: true},
{type: PAWN, black: false},
{type: KING, black: true},
{type: KING, black: false}
];
for(let p of pieces) {
let field;
outer: while(true) {
field = Math.floor(Math.random() * 64);
let x = field % 8;
let y = Math.floor(field / 8);
if(chessfields[field].children.length != 0) continue;
for(let dx = -1; dx <= 1; dx++) {
for(let dy = -1; dy <= 1; dy++) {
let pc = getPieceAt(x + dx, y + dy);
if(pc != null && pc.type == KING && pc.black != p.black) continue outer;
}
}
break;
}
let thePiece = document.createElement("img");
thePiece.id = "cringe" + Math.random();
thePiece.setAttribute("draggable", true);
thePiece.src = TEXTURES[p.type][p.black ? "b" : "w"];
thePiece.setAttribute("data-pieceType", p.type);
thePiece.setAttribute("data-pieceBlack", p.black);
thePiece.setAttribute("data-field", field);
chessfields[field].appendChild(thePiece);
thePiece.ondragstart = function(e) {
e.dataTransfer.setData("piece", thePiece.id);
};
}
var myApp = angular.module('myApp',[]);
myApp.controller('GreetingController', ['$scope', function($scope) {
$scope.greeting = 'Cringe';
}]);
</script>
</body>
</html>