Skip to content

Commit

Permalink
minesweeper is now split into components b00tc4mp#200
Browse files Browse the repository at this point in the history
  • Loading branch information
J0s3rra committed Apr 9, 2024
1 parent 10d7fe3 commit 644912d
Show file tree
Hide file tree
Showing 4 changed files with 143 additions and 113 deletions.
116 changes: 3 additions & 113 deletions staff/joseramon-rodriguez/shapes/minesweeper/src/App.jsx
Original file line number Diff line number Diff line change
@@ -1,125 +1,15 @@
import './App.css'
import React from 'react'
import Board from './components/Board'

function App() {
const columns = 8
const rows = 8

const initialBoard = new Array(rows)

for (let i = 0; i < initialBoard.length; i++) {
initialBoard[i] = new Array(columns)
for (let j = 0; j < initialBoard[i].length; j++) {
const isBomb = Math.floor(Math.random() * 10)

const cell = {
isBomb: !isBomb,
isClicked: false,
}

initialBoard[i][j] = cell
}
}

for (let i = 0; i < initialBoard.length; i++) {
for (let j = 0; j < initialBoard[i].length; j++) {
let bombsAside = 0

if (initialBoard[i]?.[j - 1]?.isBomb) bombsAside++
if (initialBoard[i]?.[j + 1]?.isBomb) bombsAside++
if (initialBoard[i - 1]?.[j]?.isBomb) bombsAside++
if (initialBoard[i + 1]?.[j]?.isBomb) bombsAside++
if (initialBoard[i - 1]?.[j - 1]?.isBomb) bombsAside++
if (initialBoard[i - 1]?.[j + 1]?.isBomb) bombsAside++
if (initialBoard[i + 1]?.[j - 1]?.isBomb) bombsAside++
if (initialBoard[i + 1]?.[j + 1]?.isBomb) bombsAside++

initialBoard[i][j].bombsAside = bombsAside
}
}

const [board, setBoard] = React.useState(initialBoard)
const [gameState, setGameState] = React.useState(null)

function handleCellClick(i, j) {
if (gameState === 'lose') return
const boardCopy = [...board].map(row => [...row])

const cellCopy = { ...boardCopy[i][j] }

cellCopy.isClicked = true

boardCopy[i][j] = cellCopy

setBoard(boardCopy)

if (cellCopy.isBomb) {
setTimeout(() => alert('explosion!'))

setGameState('lose')
}
}

const handleResetClick = () => {
const newBoard = new Array(rows)

for (let i = 0; i < newBoard.length; i++) {
newBoard[i] = new Array(columns)

for (let j = 0; j < newBoard[i].length; j++) {
const isBomb = Math.floor(Math.random() * 10)

const cell = {
isBomb: !isBomb,
isClicked: false
}

newBoard[i][j] = cell
}
}

for (let i = 0; i < newBoard.length; i++) {
for (let j = 0; j < newBoard[i].length; j++) {
let bombsAside = 0

if (newBoard[i]?.[j - 1]?.isBomb) bombsAside++
if (newBoard[i]?.[j + 1]?.isBomb) bombsAside++
if (newBoard[i - 1]?.[j]?.isBomb) bombsAside++
if (newBoard[i + 1]?.[j]?.isBomb) bombsAside++
if (newBoard[i - 1]?.[j - 1]?.isBomb) bombsAside++
if (newBoard[i - 1]?.[j + 1]?.isBomb) bombsAside++
if (newBoard[i + 1]?.[j - 1]?.isBomb) bombsAside++
if (newBoard[i + 1]?.[j + 1]?.isBomb) bombsAside++

newBoard[i][j].bombsAside = bombsAside
}
}
setBoard(newBoard)
setGameState(null)
}

return (
<>
<header>
<h1>Hello mine sweeper</h1>
</header>
<main>
<section className='board'
style={{
gridTemplateColumns: `repeat(${columns},1fr)`,
gridTemplateRows: `repeat(${rows},1fr)`
}}
>
{board.map((row, i) => row.map((cell, j) => {
return cell.isClicked ? <div key={`${i}-${j}`} className='cell'>
{cell.isBomb ? 'boom' : cell.bombsAside}
</div> : <div key={`${i}-${j}`} className='cell'>
<button onClick={() => handleCellClick(i, j)} className='cell-button'></button>
</div>
})).flat()}
</section>

{gameState === 'lose' && <button onClick={handleResetClick}>Reset</button>}
<main className='main'>
<Board />
</main>
<footer></footer>
</>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import { useState } from "react";
import { generateBoard } from "../logic/generateBoard";
import Cell from "./Cell"

const columns = 8
const rows = 8
const bombs = 10

const initialBoard = generateBoard(columns, rows, bombs)

function Board() {
const [board, setBoard] = useState(initialBoard)
const [gameState, setGameState] = useState(null)

const handleCellClick = (i, j) => {
if (gameState === 'loose') return

const boardCopy = [...board].map(row => [...row])

const cellCopy = { ...boardCopy[i][j] }

cellCopy.isClicked = true

boardCopy[i][j] = cellCopy

setBoard(boardCopy)

if (cellCopy.isBomb) {
setTimeout(() => alert('explotaste'), 20)

setGameState('loose')
}
}

const handleResetClick = () => {
const newBoard = generateBoard(columns, rows)

setBoard(newBoard)
setGameState(null)
}

return (
<div>
<section
className="board"
style={{
gridTemplateColumns: `repeat(${columns},1fr)`,
gridTemplateRows: `repeat(${rows},1fr)`
}}
>
{board.map((row, i) => row.map((cell, j) => (
<Cell
onCellClick={handleCellClick}
coords={{ i, j }}
key={`${i}-${j}`}
cell={cell}
/>)
)).flat()}
</section>
{gameState === 'loose' && <button onClick={handleResetClick}>Reset</button>}
</div>
)
}

export default Board
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
function Cell(props) {
const { cell, coords, onCellClick } = props

if (cell.isClicked) {
return (
<div className="clicked-cell">
{cell.isBomb ? 'Boom' : cell.bombsAside}
</div>
)
}
else {
return (
<div className="no-clicked-cell">
<button onClick={() => onCellClick(coords.i, coords.j)} className="cell-button" />
</div>
)
}
}

export default Cell
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
function generateBoard(columns, rows, bombs) {
const board = new Array(rows)

const cellsQuantity = columns * rows

const indexes = []

for (let i = 0; i < bombs; i++) {
const index = Math.floor(Math.random() * cellsQuantity - 1)

const indexI = Math.floor(index / 8)
const indexJ = index % 8

if (indexes.some((index => index.i === indexI && index.j === indexJ)))
i--

else indexes.push({ i: indexI, j: indexJ })
}

for (let i = 0; i < board.length; i++) {
board[i] = new Array(columns)

for (let j = 0; j < board[i].length; j++) {
const isBomb = indexes.some(index => index.j === j && index.i === i)

const cell = {
isBomb,
isClicked: false
}

board[i][j] = cell
}
}

for (let i = 0; i < board.length; i++) {
for (let j = 0; j < board[i].length; j++) {
let bombsAside = 0

if (board[i]?.[j - 1]?.isBomb) bombsAside++
if (board[i]?.[j + 1]?.isBomb) bombsAside++
if (board[i - 1]?.[j]?.isBomb) bombsAside++
if (board[i + 1]?.[j]?.isBomb) bombsAside++
if (board[i - 1]?.[j - 1]?.isBomb) bombsAside++
if (board[i - 1]?.[j + 1]?.isBomb) bombsAside++
if (board[i + 1]?.[j - 1]?.isBomb) bombsAside++
if (board[i + 1]?.[j + 1]?.isBomb) bombsAside++

board[i][j].bombsAside = bombsAside
}
}

return board
}

export { generateBoard }

0 comments on commit 644912d

Please sign in to comment.