annotate react_games/src/2048/main.tsx @ 71:75de5903355c

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