def getTrainingData(self): print('Getting Training Data . . .') data = [] number = int(self.train_games / 20) for x in range(self.train_games): game = Game(x=self.x, y=self.y) c_data = [] self.game = game snake = game.start() current_state = self.getState(snake) for _ in range(self.max_steps): action = self.getAction() length = snake.length done, snake, closer = game.step(action) if done: break elif not closer: continue else: correct_output = [0, 0, 0] correct_output[action + 1] = 1 num = 1 if snake.length > length: num = 3 for _ in range(num): c_data.append([current_state, correct_output]) current_state = self.getState(snake) if snake.length > 2: for el in c_data: data.append(el) if x % number == 0: print(f'{int(x/self.train_games*100)}%') return data
def showGame(self, model): game = Game(x=self.x, y=self.y, gui=True) self.game = game while True: snake = game.start() steps = self.max_steps current_state = self.getState(snake) while True: m = model.predict(np.array([current_state])) action = list(m[0]).index(max(list(m[0]))) - 1 length = snake.length done, snake, c = game.step(action) if done: break elif snake.length > length: steps = self.max_steps else: current_state = self.getState(snake) time.sleep(.05) steps -= 1 if steps == 0: break
def test(self, model): print('Testing . . .') num = int(self.test_games / 20) lengths = [] game = Game(x=self.x, y=self.y) self.game = game for x in range(self.test_games): snake = game.start() steps = self.max_steps current_state = self.getState(snake) while True: m = model.predict(np.array([current_state])) action = list(m[0]).index(max(list(m[0]))) - 1 length = snake.length done, snake, _ = game.step(action) if done: break elif snake.length > length: steps = self.max_steps else: current_state = self.getState(snake) steps -= 1 if steps == 0: break lengths.append(snake.length) if x % num == 0: print(f'{int((x/self.test_games)*100)}%') print(f'Average: {sum(lengths)/len(lengths)}')