Browse Source

Reset button stops the game

master
Dylan Baker 3 years ago
parent
commit
444d6fcb18
4 changed files with 43 additions and 9 deletions
  1. 19
    6
      src/Board.tsx
  2. 3
    1
      src/Cell.tsx
  3. 19
    1
      src/Controls.tsx
  4. 2
    1
      src/index.css

+ 19
- 6
src/Board.tsx View File

3
 import Controls from './Controls';
3
 import Controls from './Controls';
4
 import { generateNewGrid, updateGridDimensions } from './lib';
4
 import { generateNewGrid, updateGridDimensions } from './lib';
5
 
5
 
6
-const DEFAULT_WIDTH = 20;
7
-const DEFAULT_HEIGHT = 10;
8
-const DEFAULT_SPEED = 500;
6
+const DEFAULT_WIDTH = 30;
7
+const DEFAULT_HEIGHT = 20;
8
+const DEFAULT_SPEED = 100;
9
+const DEFAULT_CELL_SIZE = 30;
9
 
10
 
10
 const INITIAL_GRID = Array(DEFAULT_HEIGHT).fill(
11
 const INITIAL_GRID = Array(DEFAULT_HEIGHT).fill(
11
   Array(DEFAULT_WIDTH).fill(false),
12
   Array(DEFAULT_WIDTH).fill(false),
14
 interface State {
15
 interface State {
15
   grid: boolean[][];
16
   grid: boolean[][];
16
   running: boolean;
17
   running: boolean;
18
+  cellSize: number;
17
   speed: number;
19
   speed: number;
18
   width: number;
20
   width: number;
19
   height: number;
21
   height: number;
27
     this.state = {
29
     this.state = {
28
       grid: [...INITIAL_GRID],
30
       grid: [...INITIAL_GRID],
29
       running: false,
31
       running: false,
32
+      cellSize: DEFAULT_CELL_SIZE,
30
       speed: DEFAULT_SPEED,
33
       speed: DEFAULT_SPEED,
31
       width: DEFAULT_WIDTH,
34
       width: DEFAULT_WIDTH,
32
       height: DEFAULT_HEIGHT,
35
       height: DEFAULT_HEIGHT,
47
 
50
 
48
   reset = () => {
51
   reset = () => {
49
     this.setState({ grid: [...INITIAL_GRID] });
52
     this.setState({ grid: [...INITIAL_GRID] });
53
+    this.stop();
54
+    this.setState({ running: false });
55
+    this.setState({ cellSize: DEFAULT_CELL_SIZE });
56
+    this.setState({ width: DEFAULT_WIDTH, height: DEFAULT_HEIGHT });
50
   };
57
   };
51
 
58
 
52
   toggleCell = (x: number, y: number) => {
59
   toggleCell = (x: number, y: number) => {
71
     }
78
     }
72
   };
79
   };
73
 
80
 
81
+  updateCellSize = (f: (size: number) => number) => {
82
+    this.setState({ cellSize: f(this.state.cellSize) });
83
+  };
84
+
74
   updateDimensions = (dimensions: { width?: number; height?: number }) => {
85
   updateDimensions = (dimensions: { width?: number; height?: number }) => {
75
     if (dimensions.width) {
86
     if (dimensions.width) {
76
       this.setState({ width: dimensions.width });
87
       this.setState({ width: dimensions.width });
90
   };
101
   };
91
 
102
 
92
   render() {
103
   render() {
93
-    const { grid, running, speed, width, height } = this.state;
104
+    const { grid, running, speed, width, height, cellSize } = this.state;
94
 
105
 
95
     return (
106
     return (
96
       <div className="container">
107
       <div className="container">
97
         <Controls
108
         <Controls
98
           running={running}
109
           running={running}
99
           speed={speed}
110
           speed={speed}
100
-          toggle={this.toggleRunning}
101
           width={width}
111
           width={width}
102
           height={height}
112
           height={height}
113
+          toggle={this.toggleRunning}
114
+          updateCellSize={this.updateCellSize}
103
           updateDimensions={this.updateDimensions}
115
           updateDimensions={this.updateDimensions}
104
           updateSpeed={this.updateSpeed}
116
           updateSpeed={this.updateSpeed}
105
           reset={this.reset}
117
           reset={this.reset}
107
         <div className="board-container">
119
         <div className="board-container">
108
           <div className="board">
120
           <div className="board">
109
             {grid.map((row, y) => (
121
             {grid.map((row, y) => (
110
-              <div className="row" key={y}>
122
+              <div className="row" key={y} style={{ height: cellSize }}>
111
                 {row.map((cell, x) => (
123
                 {row.map((cell, x) => (
112
                   <Cell
124
                   <Cell
113
                     disabled={running}
125
                     disabled={running}
114
                     x={x}
126
                     x={x}
115
                     y={y}
127
                     y={y}
128
+                    cellSize={cellSize}
116
                     alive={cell}
129
                     alive={cell}
117
                     toggle={this.toggleCell}
130
                     toggle={this.toggleCell}
118
                     key={x}
131
                     key={x}

+ 3
- 1
src/Cell.tsx View File

6
   alive: boolean;
6
   alive: boolean;
7
   disabled: boolean;
7
   disabled: boolean;
8
   toggle: (x: number, y: number) => void;
8
   toggle: (x: number, y: number) => void;
9
+  cellSize: number;
9
 }
10
 }
10
 
11
 
11
 const Cell = (props: Props) => {
12
 const Cell = (props: Props) => {
12
-  const { alive, toggle, x, y, disabled } = props;
13
+  const { alive, toggle, x, y, disabled, cellSize } = props;
13
   return (
14
   return (
14
     <span
15
     <span
15
       onClick={() => (disabled ? null : toggle(x, y))}
16
       onClick={() => (disabled ? null : toggle(x, y))}
16
       className={`cell ${alive ? 'alive' : 'dead'} ${
17
       className={`cell ${alive ? 'alive' : 'dead'} ${
17
         disabled ? 'nonclickable' : 'clickable'
18
         disabled ? 'nonclickable' : 'clickable'
18
       }`}
19
       }`}
20
+      style={{ width: `${cellSize}px`, height: `${cellSize}px` }}
19
     ></span>
21
     ></span>
20
   );
22
   );
21
 };
23
 };

+ 19
- 1
src/Controls.tsx View File

7
   height: number;
7
   height: number;
8
   reset: () => void;
8
   reset: () => void;
9
   toggle: () => void;
9
   toggle: () => void;
10
-  updateSpeed: (speed: number) => void;
10
+  updateCellSize: (f: (size: number) => number) => void;
11
   updateDimensions: (dimensions: { width?: number; height?: number }) => void;
11
   updateDimensions: (dimensions: { width?: number; height?: number }) => void;
12
+  updateSpeed: (speed: number) => void;
12
 }
13
 }
13
 
14
 
14
 const Controls = (props: Props) => {
15
 const Controls = (props: Props) => {
20
     width,
21
     width,
21
     height,
22
     height,
22
     reset,
23
     reset,
24
+    updateCellSize,
23
     updateDimensions,
25
     updateDimensions,
24
   } = props;
26
   } = props;
25
 
27
 
33
     }
35
     }
34
   };
36
   };
35
 
37
 
38
+  const getSmaller = () => {
39
+    updateCellSize((size) => size - 1);
40
+  };
41
+
42
+  const getBigger = () => {
43
+    updateCellSize((size) => size + 1);
44
+  };
45
+
36
   useEffect(() => {
46
   useEffect(() => {
37
     document.addEventListener('keyup', (e) => {
47
     document.addEventListener('keyup', (e) => {
38
       if (e.key === ' ') {
48
       if (e.key === ' ') {
75
           Faster
85
           Faster
76
         </button>
86
         </button>
77
       </div>
87
       </div>
88
+      <div className="controls__section size">
89
+        <button className="button" onClick={getSmaller}>
90
+          Smaller
91
+        </button>
92
+        <button className="button" onClick={getBigger}>
93
+          Bigger
94
+        </button>
95
+      </div>
78
       <div className="controls__section play-reset">
96
       <div className="controls__section play-reset">
79
         <div className="reset">
97
         <div className="reset">
80
           <button className="button" onClick={reset}>
98
           <button className="button" onClick={reset}>

+ 2
- 1
src/index.css View File

91
   margin: 0.5em 0;
91
   margin: 0.5em 0;
92
 }
92
 }
93
 
93
 
94
+.size,
94
 .speed {
95
 .speed {
95
   align-items: center;
96
   align-items: center;
96
   display: flex;
97
   display: flex;
97
   flex: 1;
98
   flex: 1;
98
-  justify-content: flex-end;
99
+  justify-content: center;
99
 }
100
 }
100
 
101
 
101
 .button[disabled] {
102
 .button[disabled] {

Loading…
Cancel
Save