-
Notifications
You must be signed in to change notification settings - Fork 0
/
Game.java
194 lines (170 loc) · 4.71 KB
/
Game.java
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
import java.util.Random;
import java.util.ArrayList;
/**
* This class builds and stores all necessary components of the game.
*
* @author Huy Nguyen
* @version (a version number or a date)
*/
public class Game
{
//This variable lets the game know when to stop
private boolean running;
private boolean gameOver;
private int size;
private int score;
private Grid grid;
private Snake snake;
private ArrayList<FruitTile> fruits;
//Setting up and running the game
/**
* Sets up a game with a given size
* Doesn't start the game.
* @param size The size of the grid
*/
public Game(int size)
{
this.size = size;
init(size);
score = 0;
}
/**
* Resets the game to its initial state.
* @param row The size of the grid
*/
public void init(int size)
{
running = false;
gameOver = false;
//Creates the grid with dimension parameters
grid = new Grid(size);
//Sets up the snake in the middle of the grid
int x = size/2;
SnakeTile headTile = new SnakeTile(grid, x, x);
SnakeTile middleTile = new SnakeTile(grid, x, x+1);
SnakeTile tailTile = new SnakeTile(grid, x, x+2);
snake = new Snake(grid, headTile, middleTile, tailTile);
//Create a fruit at a random location on the grid
fruits = new ArrayList<FruitTile>();
fruits = placeRandomFruit();
}
/**
* Runs the game one step in a given direction.
* If the snake ate a fruit in this step, places a new random fruit on the grid
* If the snake ran into itself or the edge of the grid, stops game and sets gameOver to true.
* @param direction The direction desired
*/
public void runOneStep(Direction direction)
{
assert direction != null : "Game gets null direction";
if (snake.canMove(direction) && running){
if (snake.move() == true) {
fruits.removeAll(fruits);
score += 10;
placeRandomFruit();
}
}
else {
running = false;
gameOver = true;
}
}
//Creating a fruit
/**
* Places a FruitTile at a random location on the grid.
* Location must not already be occupied
* @return The collection of FruitTile objects
*/
public ArrayList<FruitTile> placeRandomFruit()
{
if (!fruits.isEmpty()) {
fruits.remove(0);
}
FruitTile fruit = createRandomFruit();
boolean found = false;
while (!found) {
if (isFruitValid(fruit) == false) {
fruit = createRandomFruit();
}
else {
found = true;
}
}
fruits.add(fruit);
return fruits;
}
/**
* Creates a FruitTile at a random location on the grid.
*/
public FruitTile createRandomFruit()
{
Random r = new Random();
int row = r.nextInt(size);
int col = r.nextInt(size);
assert row >= 0 && row <= size : "Row out of range";
assert col >= 0 && col <= size : "Column out of range";
return new FruitTile(grid, row, col);
}
/**
* Checks whether a fruit is at a valid location.
* Cannot overlap another tile.
* @return Whether the location is valid
*/
public boolean isFruitValid(FruitTile fruit)
{
boolean valid = true;
for (SnakeTile snakeTile : snake.getSnakeTiles()) {
Location fLocation = fruit.getLocation();
Location sLocation = snakeTile.getLocation();
if (fLocation.getRow() == sLocation.getRow()
&& fLocation.getCol() == sLocation.getCol()) {
valid = false;
}
}
return valid;
}
//Other accessor & mutator methods ------------------------------------------------------------
/**
* Returns the snake in the grid
*/
public Snake getSnake()
{
return snake;
}
/**
* Returns the score of the game
*/
public int getScore()
{
return score;
}
/**
* Returns the fruit in the grid
*/
public ArrayList<FruitTile> getFruit()
{
return fruits;
}
/**
* Set the value of the running variable
* @param b The value to set the variable to
*/
public void setRunning(boolean b)
{
running = b;
}
/**
* Returns the whether or not the game is still running
*/
public boolean getRunning()
{
return running;
}
/**
* Returns whether or not the player has lost.
*/
public boolean isOver()
{
return gameOver;
}
}