← back to Model Arena
data/artifacts/1d4944290382/qwen3-14b.html
177 lines
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Tiny Isometric City Builder</title>
<style>
html, body {
margin: 0;
padding: 0;
overflow: hidden;
background: #222;
color: #fff;
font-family: sans-serif;
}
canvas {
display: block;
}
#toolbar {
position: absolute;
top: 10px;
left: 10px;
background: rgba(0,0,0,0.5);
padding: 10px;
border-radius: 5px;
}
#toolbar button {
margin: 5px;
padding: 5px 10px;
cursor: pointer;
background: #444;
border: none;
color: #fff;
border-radius: 3px;
}
#toolbar button:hover {
background: #666;
}
#counts {
position: absolute;
bottom: 10px;
left: 10px;
font-size: 14px;
}
</style>
</head>
<body>
<div id="toolbar">
<button id="rotateView">Rotate View</button>
<button id="house">House</button>
<button id="tree">Tree</button>
<button id="road">Road</button>
<button id="shop">Shop</button>
</div>
<div id="counts">
Houses: <span id="countHouse">0</span> |
Trees: <span id="countTree">0</span> |
Roads: <span id="countRoad">0</span> |
Shops: <span id="countShop">0</span>
</div>
<canvas id="gameCanvas"></canvas>
<script>
const canvas = document.getElementById('gameCanvas');
const ctx = canvas.getContext('2d');
const toolbar = document.getElementById('toolbar');
const countHouse = document.getElementById('countHouse');
const countTree = document.getElementById('countTree');
const countRoad = document.getElementById('countRoad');
const countShop = document.getElementById('countShop');
const tileSize = 40;
const mapSize = 16;
const isometricTileSize = 40;
const isometricMapWidth = mapSize * isometricTileSize;
const isometricMapHeight = mapSize * isometricTileSize;
let currentBuilding = 'house';
let rotation = 0;
canvas.width = isometricMapWidth;
canvas.height = isometricMapHeight;
const map = Array.from({ length: mapSize }, () => Array(mapSize).fill(null));
const buildingColors = {
house: '#6b46c1',
tree: '#228b22',
road: '#808080',
shop: '#ff6347'
};
function drawIsometricTile(x, y, color) {
const px = (x - y) * isometricTileSize / 2;
const py = (x + y) * isometricTileSize / 4;
ctx.fillStyle = color;
ctx.beginPath();
ctx.moveTo(px, py);
ctx.lineTo(px + isometricTileSize / 2, py + isometricTileSize / 2);
ctx.lineTo(px + isometricTileSize / 2, py + isometricTileSize);
ctx.lineTo(px - isometricTileSize / 2, py + isometricTileSize);
ctx.lineTo(px - isometricTileSize / 2, py + isometricTileSize / 2);
ctx.closePath();
ctx.fill();
}
function drawMap() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
for (let y = 0; y < mapSize; y++) {
for (let x = 0; x < mapSize; x++) {
const tile = map[y][x];
if (tile) {
drawIsometricTile(x, y, buildingColors[tile]);
}
}
}
}
function getTileFromMouse(mx, my) {
for (let y = 0; y < mapSize; y++) {
for (let x = 0; x < mapSize; x++) {
const px = (x - y) * isometricTileSize / 2;
const py = (x + y) * isometricTileSize / 4;
const tileX = px + isometricTileSize / 2;
const tileY = py + isometricTileSize / 2;
if (mx >= tileX - isometricTileSize / 2 && mx <= tileX + isometricTileSize / 2 &&
my >= tileY - isometricTileSize / 2 && my <= tileY + isometricTileSize / 2) {
return { x, y };
}
}
}
return null;
}
function rotateMap() {
rotation = (rotation + 1) % 4;
canvas.width = isometricMapWidth;
canvas.height = isometricMapHeight;
drawMap();
}
function updateCounts() {
let houses = 0, trees = 0, roads = 0, shops = 0;
for (let y = 0; y < mapSize; y++) {
for (let x = 0; x < mapSize; x++) {
const tile = map[y][x];
if (tile === 'house') houses++;
else if (tile === 'tree') trees++;
else if (tile === 'road') roads++;
else if (tile === 'shop') shops++;
}
}
countHouse.textContent = houses;
countTree.textContent = trees;
countRoad.textContent = roads;
countShop.textContent = shops;
}
canvas.addEventListener('click', function (e) {
const rect = canvas.getBoundingClientRect();
const mx = e.clientX - rect.left;
const my = e.clientY - rect.top;
const tile = getTileFromMouse(mx, my);
if (tile && tile.x >= 0 && tile.x < mapSize && tile.y >= 0 && tile.y < mapSize) {
map[tile.y][tile.x] = currentBuilding;
drawMap();
updateCounts();
}
});
document.getElementById('house').addEventListener('click', () => currentBuilding = 'house');
document.getElementById('tree').addEventListener('click', () => currentBuilding = 'tree');
document.getElementById('road').addEventListener('click', () => currentBuilding = 'road');
document.getElementById('shop').addEventListener('click', () => currentBuilding = 'shop');
document.getElementById('rotateView').addEventListener('click', rotateMap);
drawMap();
updateCounts();
</script>
</body>
</html>