Add models
This commit is contained in:
parent
9f14b74575
commit
aec0b77d29
@ -7,3 +7,6 @@ install:
|
|||||||
|
|
||||||
run:
|
run:
|
||||||
./venv/bin/flask run --host 0.0.0.0
|
./venv/bin/flask run --host 0.0.0.0
|
||||||
|
|
||||||
|
test:
|
||||||
|
./venv/bin/python -m unittest
|
@ -2,6 +2,7 @@ import json
|
|||||||
from flask import Flask, jsonify
|
from flask import Flask, jsonify
|
||||||
from flask_cors import CORS
|
from flask_cors import CORS
|
||||||
|
|
||||||
|
from ebermergen.models.game import Game
|
||||||
from .lib import generate_map
|
from .lib import generate_map
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
@ -15,9 +16,16 @@ def index():
|
|||||||
|
|
||||||
@app.route('/generate')
|
@app.route('/generate')
|
||||||
def generate():
|
def generate():
|
||||||
return jsonify(generate_map(10, 8))
|
return jsonify(generate_map((10, 8)))
|
||||||
|
|
||||||
|
|
||||||
@app.route('/generate/<int:x>/<int:y>')
|
@app.route('/generate/<int:x>/<int:y>')
|
||||||
def generate_var(x, y):
|
def generate_var(x, y):
|
||||||
return jsonify(generate_map(x, y))
|
return jsonify(generate_map((x, y)))
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/state')
|
||||||
|
def state():
|
||||||
|
a = Game()
|
||||||
|
a.seed_map()
|
||||||
|
return jsonify(a.serialize())
|
||||||
|
@ -3,5 +3,6 @@ import random
|
|||||||
TERRAIN_TYPES = [0, 1, 2, 3]
|
TERRAIN_TYPES = [0, 1, 2, 3]
|
||||||
|
|
||||||
|
|
||||||
def generate_map(x_len, y_len):
|
def generate_map(dimensions):
|
||||||
|
x_len, y_len = dimensions
|
||||||
return [[random.choice(TERRAIN_TYPES) for y in range(y_len)] for x in range(x_len)]
|
return [[random.choice(TERRAIN_TYPES) for y in range(y_len)] for x in range(x_len)]
|
||||||
|
0
srv/ebermergen/models/__init__.py
Normal file
0
srv/ebermergen/models/__init__.py
Normal file
14
srv/ebermergen/models/auto_id.py
Normal file
14
srv/ebermergen/models/auto_id.py
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
class AutoID:
|
||||||
|
last_id = 0
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.increment_id()
|
||||||
|
self.id = self.last_id
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def increment_id(cls):
|
||||||
|
cls.last_id += 1
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def reset_id(cls):
|
||||||
|
cls.last_id = 0
|
26
srv/ebermergen/models/entities.py
Normal file
26
srv/ebermergen/models/entities.py
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
|
||||||
|
from .auto_id import AutoID
|
||||||
|
|
||||||
|
|
||||||
|
class Town(AutoID):
|
||||||
|
def __init__(self, player, coords):
|
||||||
|
super().__init__()
|
||||||
|
self.player = player
|
||||||
|
self.coords = coords
|
||||||
|
self.level = 1
|
||||||
|
|
||||||
|
|
||||||
|
class Tower(AutoID):
|
||||||
|
def __init__(self, player, coords):
|
||||||
|
super().__init__()
|
||||||
|
self.player = player
|
||||||
|
self.coords = coords
|
||||||
|
self.level = 1
|
||||||
|
|
||||||
|
|
||||||
|
class Mob(AutoID):
|
||||||
|
def __init__(self, player, coords):
|
||||||
|
super().__init__()
|
||||||
|
self.player = player
|
||||||
|
self.coords = coords
|
||||||
|
self.level = 1
|
46
srv/ebermergen/models/game.py
Normal file
46
srv/ebermergen/models/game.py
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
import random
|
||||||
|
import json
|
||||||
|
|
||||||
|
from .player import Player
|
||||||
|
from .map import Map
|
||||||
|
from .entities import Town
|
||||||
|
|
||||||
|
|
||||||
|
class Game:
|
||||||
|
def __init__(self):
|
||||||
|
self.players = [Player('P1'), Player('P2')]
|
||||||
|
self.map = Map((20, 16))
|
||||||
|
self.towns = []
|
||||||
|
self.towers = []
|
||||||
|
self.mobs = []
|
||||||
|
|
||||||
|
def get_free_positions(self):
|
||||||
|
positions = self.map.get_positions()
|
||||||
|
positions = positions.difference([el.coords for el in self.towns])
|
||||||
|
positions = positions.difference([el.coords for el in self.towers])
|
||||||
|
return positions
|
||||||
|
|
||||||
|
def get_random_position(self):
|
||||||
|
return random.choice(tuple(self.get_free_positions()))
|
||||||
|
|
||||||
|
def seed_map(self):
|
||||||
|
self.towns.append(Town(self.players[0], self.get_random_position()))
|
||||||
|
self.towns.append(Town(self.players[1], self.get_random_position()))
|
||||||
|
self.towns.append(Town(self.players[0], self.get_random_position()))
|
||||||
|
self.towns.append(Town(self.players[1], self.get_random_position()))
|
||||||
|
|
||||||
|
def serialize(self):
|
||||||
|
naive = json.loads(json.dumps(self, default=lambda o: o.__dict__))
|
||||||
|
|
||||||
|
def reduce_player(entities):
|
||||||
|
for obj in entities:
|
||||||
|
obj['player'] = obj['player']['id']
|
||||||
|
|
||||||
|
def make_id_based(entities):
|
||||||
|
return {obj['id']: obj for obj in entities}
|
||||||
|
|
||||||
|
for entity_type in ['towns', 'mobs', 'towers']:
|
||||||
|
reduce_player(naive[entity_type])
|
||||||
|
naive[entity_type] = make_id_based(naive[entity_type])
|
||||||
|
naive['players'] = make_id_based(naive['players'])
|
||||||
|
return naive
|
15
srv/ebermergen/models/map.py
Normal file
15
srv/ebermergen/models/map.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
from ebermergen.lib import generate_map
|
||||||
|
|
||||||
|
|
||||||
|
class Map:
|
||||||
|
def __init__(self, dimensions):
|
||||||
|
self.dimensions = dimensions
|
||||||
|
self.terrain = generate_map(dimensions)
|
||||||
|
|
||||||
|
def get_positions(self):
|
||||||
|
positions = set()
|
||||||
|
for x in range(self.dimensions[0]):
|
||||||
|
for y in range(self.dimensions[1]):
|
||||||
|
positions.add((x, y))
|
||||||
|
return positions
|
7
srv/ebermergen/models/player.py
Normal file
7
srv/ebermergen/models/player.py
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
from .auto_id import AutoID
|
||||||
|
|
||||||
|
|
||||||
|
class Player(AutoID):
|
||||||
|
def __init__(self, name):
|
||||||
|
super().__init__()
|
||||||
|
self.name = name
|
0
srv/tests/__init__.py
Normal file
0
srv/tests/__init__.py
Normal file
35
srv/tests/test_auto_id.py
Normal file
35
srv/tests/test_auto_id.py
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
import unittest
|
||||||
|
|
||||||
|
from ebermergen.models.auto_id import AutoID
|
||||||
|
|
||||||
|
|
||||||
|
class TestAutoID(unittest.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
AutoID.reset_id()
|
||||||
|
|
||||||
|
def test_first_instance(self):
|
||||||
|
a = AutoID()
|
||||||
|
self.assertEqual(a.id, 1)
|
||||||
|
|
||||||
|
def test_increment(self):
|
||||||
|
a, b = AutoID(), AutoID()
|
||||||
|
self.assertEqual(a.id, 1)
|
||||||
|
self.assertEqual(b.id, 2)
|
||||||
|
|
||||||
|
def test_inheritance(self):
|
||||||
|
class ClassA(AutoID):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class ClassB(AutoID):
|
||||||
|
pass
|
||||||
|
|
||||||
|
a = ClassA()
|
||||||
|
b = ClassB()
|
||||||
|
self.assertEqual(a.id, 1)
|
||||||
|
self.assertEqual(b.id, 1)
|
||||||
|
a2 = ClassA()
|
||||||
|
b2 = ClassB()
|
||||||
|
self.assertEqual(a.id, 1)
|
||||||
|
self.assertEqual(b.id, 1)
|
||||||
|
self.assertEqual(a2.id, 2)
|
||||||
|
self.assertEqual(b2.id, 2)
|
13
srv/tests/test_game.py
Normal file
13
srv/tests/test_game.py
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import unittest
|
||||||
|
|
||||||
|
from ebermergen.models.game import Game
|
||||||
|
|
||||||
|
|
||||||
|
class TestSerializer(unittest.TestCase):
|
||||||
|
def test_instantiation(self):
|
||||||
|
a = Game()
|
||||||
|
self.assertEqual(2, len(a.players))
|
||||||
|
|
||||||
|
def test_seeding(self):
|
||||||
|
a = Game()
|
||||||
|
a.seed_map()
|
10
srv/tests/test_serialize.py
Normal file
10
srv/tests/test_serialize.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import unittest
|
||||||
|
|
||||||
|
from ebermergen.models.game import Game
|
||||||
|
|
||||||
|
|
||||||
|
class TestSerializer(unittest.TestCase):
|
||||||
|
def test_serialize(self):
|
||||||
|
a = Game()
|
||||||
|
a.seed_map()
|
||||||
|
a.serialize()
|
Loading…
x
Reference in New Issue
Block a user