-
Notifications
You must be signed in to change notification settings - Fork 7
/
game.model.ts
86 lines (75 loc) · 1.75 KB
/
game.model.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
export type GridSize = {
width: number;
height: number;
};
export const DEFAULT_GRID_SIZE: GridSize = {
width: 10,
height: 10,
};
export const DEFAULT_SPEED = 2;
export type Coordinates = {
x: number;
y: number;
};
export class Snake {
public direction: Direction;
public segments: Coordinates[];
public get body(): Coordinates[] {
return this.segments.slice(1, -1);
}
public get head(): Coordinates {
return this.segments[0];
}
public get tail(): Coordinates | null {
return this.segments.length > 1
? this.segments[this.segments.length - 1]
: null;
}
public get tailDirection(): Direction | null {
if (!this.tail) {
return null;
}
const lastBodySegment = this.body[this.body.length - 1] ?? this.head;
if (lastBodySegment.x - this.tail.x === 1) {
return Direction.Right;
} else if (lastBodySegment.x - this.tail.x === -1) {
return Direction.Left;
} else if (lastBodySegment.y - this.tail.y === 1) {
return Direction.Down;
} else if (lastBodySegment.y - this.tail.y === -1) {
return Direction.Up;
}
return null;
}
public constructor(
segments: Coordinates[],
direction: Direction = DEFAULT_DIRECTION,
) {
this.segments = segments;
this.direction = direction;
}
}
export enum GameStatus {
Initial = 'initial',
Running = 'running',
Paused = 'paused',
GameOver = 'game-over',
}
export type GameConfig = {
gridSize?: GridSize;
snake?: Snake;
food?: Coordinates;
initialSpeed?: number;
};
export type GameState = {
snake: Snake;
food: Coordinates;
status: GameStatus;
};
export enum Direction {
Left = '👈',
Right = '👉',
Up = '☝️',
Down = '👇',
}
export const DEFAULT_DIRECTION = Direction.Right;