annotate react_games/src/current.tsx @ 51:68fa88ac73fe

Interview prep for xAI
author June Park <parkjune1995@gmail.com>
date Mon, 15 Dec 2025 19:55:17 -0800
parents 0cfd7d9277b0
children 829623189a57
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
44
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
1 import { CSSProperties, useEffect, useReducer, useState } from "react";
37
fb9bcd3145cb [ReactGames] Few games I made using react just to practice few things.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
2 import ReactDOM from "react-dom/client";
fb9bcd3145cb [ReactGames] Few games I made using react just to practice few things.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
3
44
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
4 /**
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
5 * 2048
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
6 *
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
7 * 4 X 4
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
8 */
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
9
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
10 const MAX_WIDTH = 4;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
11
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
12 type Color = 'white' | 'orange' | 'yellow' | 'red';
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
13
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
14 type Cell = {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
15 value: number;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
16 color: Color;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
17 }
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
18
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
19 type Board = Cell[][];
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
20
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
21 type GameState = "in_progress" | "lost" | "won";
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
22
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
23 type Game = {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
24 board: Board;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
25 state: GameState;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
26 steps: number;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
27 }
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
28
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
29 type Command = "u" | "d" | "l" | "r";
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
30
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
31 type GameAction =
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
32 { type: "move", command: Command } | { type: "calculate" };
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
33
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
34
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
35 interface GameStyle {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
36 container: CSSProperties;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
37 board: CSSProperties;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
38 cell: (color: Color) => CSSProperties;
37
fb9bcd3145cb [ReactGames] Few games I made using react just to practice few things.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
39 }
fb9bcd3145cb [ReactGames] Few games I made using react just to practice few things.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
40
44
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
41 const gameStyle: GameStyle = {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
42 container: {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
43 display: "flex",
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
44 flexDirection: "column",
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
45 justifyContent: "center",
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
46 alignItems: "center",
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
47 height: "100vh"
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
48 },
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
49 board: {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
50 display: "grid",
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
51 gridTemplateColumns: "repeat(4, 50px)",
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
52 background: "#EEFFEE",
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
53 },
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
54 cell: (color: Color) => ({
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
55 display: "flex",
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
56 justifyContent: "center",
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
57 alignItems: "center",
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
58 aspectRatio: "1 / 1 ",
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
59 margin: "10px",
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
60 background: color,
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
61 })
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
62 }
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
63
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
64 function initializeBoard(): Board {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
65 const board = Array.from({ length: MAX_WIDTH }, () =>
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
66 Array.from({ length: MAX_WIDTH }, (): Cell => ({ value: 0, color: 'orange' }))
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
67 );
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
68 let rowIndex: number;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
69 let colIndex: number;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
70 rowIndex = Math.floor(Math.random() * 4);
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
71 colIndex = Math.floor(Math.random() * 4);
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
72 board[rowIndex][colIndex].value = 2;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
73 board[rowIndex-1][colIndex].value = 2;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
74 return board;
37
fb9bcd3145cb [ReactGames] Few games I made using react just to practice few things.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
75 }
fb9bcd3145cb [ReactGames] Few games I made using react just to practice few things.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
76
44
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
77 function initializeGame(): Game {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
78 return {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
79 board: initializeBoard(),
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
80 state: "in_progress",
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
81 steps: 0,
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
82 }
37
fb9bcd3145cb [ReactGames] Few games I made using react just to practice few things.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
83 }
44
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
84
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
85
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
86 function handleMove(board: Board, command: Command): Board {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
87 // Deep copy the board and initialize the merged status for the new board
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
88 const copiedBoard = board.map(row =>
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
89 row.map(cell => ({ ...cell, merged: false }))
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
90 );
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
91
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
92 let diff: { row: number, col: number };
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
93 let startRow: number, endRow: number, stepRow: number;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
94 let startCol: number, endCol: number, stepCol: number;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
95
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
96 const size = copiedBoard.length;
37
fb9bcd3145cb [ReactGames] Few games I made using react just to practice few things.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
97
44
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
98 switch (command) {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
99 case "u":
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
100 diff = { row: -1, col: 0 };
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
101 startRow = 0; endRow = size; stepRow = 1;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
102 startCol = 0; endCol = size; stepCol = 1;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
103 break;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
104 case "d":
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
105 diff = { row: 1, col: 0 };
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
106 startRow = size - 1; endRow = -1; stepRow = -1;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
107 startCol = 0; endCol = size; stepCol = 1;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
108 break;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
109 case "l":
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
110 diff = { row: 0, col: -1 };
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
111 startRow = 0; endRow = size; stepRow = 1;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
112 startCol = 0; endCol = size; stepCol = 1;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
113 break;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
114 case "r":
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
115 diff = { row: 0, col: 1 };
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
116 startRow = 0; endRow = size; stepRow = 1;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
117 startCol = size - 1; endCol = -1; stepCol = -1;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
118 break;
37
fb9bcd3145cb [ReactGames] Few games I made using react just to practice few things.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
119 }
fb9bcd3145cb [ReactGames] Few games I made using react just to practice few things.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
120
44
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
121 for (let rowIndex = startRow; rowIndex !== endRow; rowIndex += stepRow) {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
122 for (let colIndex = startCol; colIndex !== endCol; colIndex += stepCol) {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
123 const currentCell = copiedBoard[rowIndex][colIndex];
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
124
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
125 if (currentCell.value === 0) continue;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
126
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
127 let r = rowIndex;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
128 let c = colIndex;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
129 let emptySlot: { r: number, c: number } = { r: rowIndex, c: colIndex };
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
130 let finalSlot: { r: number, c: number } = { r: rowIndex, c: colIndex };
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
131
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
132 while (true) {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
133 r += diff.row;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
134 c += diff.col;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
135
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
136 if (r < 0 || r >= size || c < 0 || c >= size) {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
137 finalSlot = emptySlot;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
138 break;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
139 }
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
140
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
141 const nextCell = copiedBoard[r][c];
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
142
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
143 if (nextCell.value === 0) {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
144 emptySlot = { r, c };
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
145 finalSlot = emptySlot;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
146 } else if (nextCell.value === currentCell.value && !nextCell.merged) {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
147 finalSlot = { r, c };
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
148 break;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
149 } else {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
150 finalSlot = emptySlot;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
151 break;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
152 }
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
153 }
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
154
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
155 const targetCell = copiedBoard[finalSlot.r][finalSlot.c];
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
156
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
157 if (finalSlot.r === rowIndex && finalSlot.c === colIndex) {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
158 continue;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
159 }
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
160
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
161 if (targetCell.value === currentCell.value && !targetCell.merged) {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
162 targetCell.value *= 2;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
163 targetCell.merged = true;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
164
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
165 copiedBoard[rowIndex][colIndex].value = 0;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
166
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
167 } else if (targetCell.value === 0) {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
168 targetCell.value = currentCell.value;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
169 copiedBoard[rowIndex][colIndex].value = 0;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
170 }
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
171 }
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
172 }
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
173
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
174 return copiedBoard;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
175 }
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
176
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
177 function addNewItemsToTheBoard(board: Board) {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
178 let randomRowIndex: number;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
179 let randomColIndex: number;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
180
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
181
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
182 let zeroPos = 0;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
183 board.forEach((row) => {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
184 row.forEach((cell) => {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
185 if (cell.value === 0) {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
186 zeroPos += 1;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
187 }
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
188 })
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
189 })
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
190 if (zeroPos === 0) {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
191 return;
37
fb9bcd3145cb [ReactGames] Few games I made using react just to practice few things.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
192 }
fb9bcd3145cb [ReactGames] Few games I made using react just to practice few things.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
193
44
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
194 let curr = 0;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
195 const maxAddedValues = zeroPos < 2 ? 1 : (zeroPos / 2) | 0;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
196 while (curr < maxAddedValues) {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
197 randomRowIndex = Math.floor(Math.random() * board.length)
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
198 randomColIndex = Math.floor(Math.random() * board.length)
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
199 if (board[randomRowIndex][randomColIndex].value === 0)
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
200 {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
201 board[randomRowIndex][randomColIndex].value = 2;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
202 curr++;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
203 }
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
204 }
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
205 }
37
fb9bcd3145cb [ReactGames] Few games I made using react just to practice few things.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
206
44
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
207 function gameDispatch(game: Game, gameAction: GameAction): Game {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
208 switch(gameAction.type) {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
209 case "move": {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
210 const newBoard = handleMove(game.board, gameAction.command);
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
211 addNewItemsToTheBoard(newBoard);
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
212 return {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
213 ...game,
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
214 board: newBoard,
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
215 }
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
216 }
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
217 case "calculate": {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
218 return {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
219 ...game,
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
220 }
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
221 }
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
222 }
37
fb9bcd3145cb [ReactGames] Few games I made using react just to practice few things.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
223 }
fb9bcd3145cb [ReactGames] Few games I made using react just to practice few things.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
224
44
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
225 function Current() {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
226 const [game, dispatch] = useReducer(gameDispatch, null, initializeGame);
37
fb9bcd3145cb [ReactGames] Few games I made using react just to practice few things.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
227
44
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
228 useEffect(() => {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
229 window.addEventListener("keyup", (e) => {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
230 switch(e.key) {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
231 case "ArrowDown": {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
232 dispatch({ type: "move", command: "d" });
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
233 return;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
234 }
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
235 case "ArrowUp": {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
236 dispatch({ type: "move", command: "u" });
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
237 return;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
238 }
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
239 case "ArrowRight": {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
240 dispatch({ type: "move", command: "r" });
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
241 return;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
242 }
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
243 case "ArrowLeft": {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
244 dispatch({ type: "move", command: "l" });
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
245 return;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
246 }
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
247 default:
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
248 return;
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
249 }
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
250 })
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
251
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
252 }, [])
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
253 return (
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
254 <div style={gameStyle.container}>
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
255 <h1> 2048 </h1>
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
256 <div style={gameStyle.board}>
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
257 {game.board.map((row: Cell[]) => {
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
258 return row.map((cell: Cell) => (<div style={gameStyle.cell(cell.color)}> {cell.value} </div>))
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
259 })}
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
260 </div>
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
261 </div>
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
262 );
0cfd7d9277b0 [ReactGame] 2048
MrJuneJune <me@mrjunejune.com>
parents: 37
diff changeset
263 }
37
fb9bcd3145cb [ReactGames] Few games I made using react just to practice few things.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
264
fb9bcd3145cb [ReactGames] Few games I made using react just to practice few things.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
265 ReactDOM.createRoot(document.getElementById("root")!).render(<Current />);