import { faBurst, faCrosshairs, faXmark } from '@fortawesome/free-solid-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { CSSProperties, useState } from 'react';
import './styles/App.scss';
function App() {
const [target, setTarget] = useState({
event: false,
x: 0,
y: 0
})
const [targetPreview, setTargetPreview] = useState({
event: false,
x: 0,
y: 0,
style: {
height: 0,
top: 0,
left: 0,
width: 0
}
})
let borderTiles: JSX.Element[] = [];
let shipElems: JSX.Element[] = [];
let elems2: {
field: string,
x: number,
y: number,
}[] = [];
let hitElems: {
field: string,
x: number,
y: number,
}[] = [],
count = 12;
for (let y = 0; y < count; y++) {
elems2.push(...[
// Up
{ field: String.fromCharCode(65+y), x: y+2, y: 1 },
// Left
{ field: (y+1).toString(), x: 1, y: y+2 },
// Bottom
{ field: String.fromCharCode(65+y), x: y+2, y: count+2 },
// Right
{ field: (y+1).toString(), x: count+2, y: y+2 }
]);
for (let x = 0; x < count; x++) {
hitElems.push({ field: String.fromCharCode(65+x)+(y), x: x+2, y: y+2 })
}
}
const hitSVGs = hitElems.map((obj, i) =>
);
for (let y = 0; y < count+2; y++) {
for (let x = 0; x < count+2; x++) {
const corner = [
x === 0 && y === 0 ? 'left-top-corner' : '',
x === count+1 && y === 0 ? 'right-top-corner' : '',
x === 0 && y === count+1 ? 'left-bottom-corner' : '',
x === count+1 && y === count+1 ? 'right-bottom-corner' : ''
].filter(s => s);
const border = [
x === 0 ? 'left' : '',
y === 0 ? 'top' : '',
x === count+1 ? 'right' : '',
y === count+1 ? 'bottom' : ''
].filter(s => s);
const borderType = corner.length ? corner[0] : border[0];
const action = x > 0 && x < count+1 && y > 0 && y < count+1;
const classNames = [
'border-tile',
borderType ? `edge ${borderType}` : '',
action ? 'action' : ''
].join(' ')
borderTiles.push(
setTarget({ event: true, x, y }) : () => {}}
onMouseEnter={e => {
const target = e.target as HTMLDivElement
if (action) {
setTargetPreview({
event: true,
x,
y,
style: {
height: target.offsetHeight,
left: target.offsetLeft,
top: target.offsetTop,
width: target.offsetWidth,
}
})
} else {
setTargetPreview(e => Object.assign({...e}, {
style: {
height: target.offsetHeight,
left: target.offsetLeft,
top: target.offsetTop,
width: target.offsetWidth,
}
}))
}
}}
onMouseLeave={action ? () => setTargetPreview(e => Object.assign({...e}, {event: false})) : () => {}}
>
)
}
}
for (let i = 1; i <= 6; i++) {
shipElems.push(
);
}
return (
{[1,2,3,4,5,6,11,12,13,14].map((num, i) =>
)}
{[1,2,3,4].map((num, i) =>
)}
{/* Bordes */}
{ borderTiles }
{/* Collumn lettes and row numbers */}
{elems2.map((obj, i) =>
{obj.field}
)}
{ hitSVGs }
{/* Ships */}
{/* { shipElems } */}
{/* Fog images */}
{/*

*/}
Edit src/App.tsx
and save to reload.
Battleships designed by macrovector
);
}
export default App;