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(
{`${i}.svg`}/
); } return (
{[1,2,3,4,5,6,11,12,13,14].map((num, i) => {`${num}.svg`})} {[1,2,3,4].map((num, i) => {`fog${num}.png`})}
{/* Bordes */} { borderTiles } {/* Collumn lettes and row numbers */} {elems2.map((obj, i) => {obj.field} )} { hitSVGs } {/* Ships */} {/* { shipElems } */} {/* Fog images */} {/* {`fog1.png`} {`fog1.png`} {`fog4.png`} */}

Edit src/App.tsx and save to reload.

Battleships designed by macrovector
); } export default App;