annotate react_games/src/2048/main.tsx @ 216:e82b80b24012 default tip

[MrJuneJune] Make webp translate background job.
author June Park <parkjune1995@gmail.com>
date Sat, 28 Feb 2026 21:04:43 -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 }