summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/brain/neural_network.cpp19
-rw-r--r--src/game_state.cpp43
-rw-r--r--src/spacebot.cpp13
3 files changed, 65 insertions, 10 deletions
diff --git a/src/brain/neural_network.cpp b/src/brain/neural_network.cpp
index 15eedca..30da46c 100644
--- a/src/brain/neural_network.cpp
+++ b/src/brain/neural_network.cpp
@@ -17,6 +17,24 @@ NeuralNetwork::NeuralNetwork(std::istream &&networkConfigFile, int numberOfSenso
parseFile(std::move(networkConfigFile));
}
+NeuralNetwork::NeuralNetwork(std::istream &&networkConfigFile, std::vector<bool> sensorInitialValues, int numberOfOutputs)
+{
+ _biasNode = std::make_shared<BiasNode>();
+
+ for (int i=0; i<sensorInitialValues.size(); ++i)
+ {
+ auto sensor = std::make_shared<Sensor>(i);
+ sensor->setActivation(sensorInitialValues.at(i) ? 1 : 0);
+ _sensors.push_back(sensor);
+ }
+ for (int i=0; i<numberOfOutputs; ++i)
+ {
+ _outputs.push_back(std::make_shared<Neuron>(i));
+ }
+
+ parseFile(std::move(networkConfigFile));
+}
+
void NeuralNetwork::parseFile(std::istream &&file)
{
double weight;
@@ -123,6 +141,7 @@ void NeuralNetwork::setInput(int inputIndex, double activation)
if (sensor->id() == inputIndex)
{
sensor->setActivation(activation);
+ break;
}
}
}
diff --git a/src/game_state.cpp b/src/game_state.cpp
index 5fed683..e6deae7 100644
--- a/src/game_state.cpp
+++ b/src/game_state.cpp
@@ -2,9 +2,11 @@
#include <iostream>
#include <fstream>
#include <limits>
+#include <bitset>
const int OPENING_LINES = 6;
const int GAME_AREA_LINES = 25;
+const int GAME_WIDTH = 19;
void moveToNextChar(int &x, int &y, int &width, char &nextChar, std::istream &mapFile)
{
@@ -91,5 +93,44 @@ void GameState::logState()
std::vector<bool> GameState::toBitArray() const
{
- return std::vector<bool>();
+ std::vector<bool> result;
+
+ std::vector<bool> alienNodes((GAME_AREA_LINES-2) * (GAME_WIDTH-2), false);
+ for (auto alien : _aliens)
+ {
+ alienNodes.at((alien.y()-1)*(GAME_WIDTH-2)+(alien.x()-1)) = true;
+ }
+ result.insert(result.end(), alienNodes.begin(), alienNodes.end());
+
+ std::vector<bool> bulletNodes((GAME_AREA_LINES-2) * (GAME_WIDTH-2), false);
+ for (auto bullet : _bullets)
+ {
+ bulletNodes.at((bullet.y()-1)*(GAME_WIDTH-2)+(bullet.x()-1)) = true;
+ }
+ result.insert(result.end(), bulletNodes.begin(), bulletNodes.end());
+
+ std::vector<bool> missileNodes((GAME_AREA_LINES-2) * (GAME_WIDTH-2), false);
+ for (auto missile : _missiles)
+ {
+ missileNodes.at((missile.y()-1)*(GAME_WIDTH-2)+(missile.x()-1)) = true;
+ }
+ result.insert(result.end(), missileNodes.begin(), missileNodes.end());
+
+ std::vector<bool> shieldNodes(2 * (GAME_WIDTH-2), false);
+ for (auto shield : _shields)
+ {
+ int row = shield.y() > GAME_AREA_LINES/2 ? 1 : 0;
+ shieldNodes.at(row*(GAME_WIDTH-2)+(shield.x()-1)) = true;
+ }
+
+ for (auto spaceship : _spaceships)
+ {
+ std::bitset<5> spaceshipBits(spaceship.x());
+ for (int i=0; i<spaceshipBits.size(); ++i)
+ {
+ result.push_back(spaceshipBits[i]);
+ }
+ }
+
+ return result;
}
diff --git a/src/spacebot.cpp b/src/spacebot.cpp
index 1f8f2b8..418756c 100644
--- a/src/spacebot.cpp
+++ b/src/spacebot.cpp
@@ -3,9 +3,9 @@
#include "brain/neural_network.h"
#include <fstream>
-Spacebot::Spacebot(std::string outputPath)
+Spacebot::Spacebot(std::string outputPath, std::string brainFilename)
: _outputFilename(outputPath+"/move.txt"),
- _networkConfigFilename("brain.nn"),
+ _brainFilename(brainFilename),
_gameState(std::ifstream(outputPath+"/map.txt"))
{
}
@@ -20,15 +20,10 @@ Move Spacebot::chooseMove()
{
auto sensorInputs = _gameState.toBitArray();
- NeuralNetwork network(std::ifstream(_networkConfigFilename),
- sensorInputs.size(),
+ NeuralNetwork network(std::ifstream(_brainFilename),
+ sensorInputs,
static_cast<int>(Move::BUILD_SHIELD));
- for (int i=0; i<sensorInputs.size(); ++i)
- {
- network.setInput(i, sensorInputs[i] ? 1 : 0);
- }
-
int moveInt = network.findMaxOutputIndex();
return static_cast<Move>(moveInt);
}