initial
This commit is contained in:
0
battleship/__init__.py
Normal file
0
battleship/__init__.py
Normal file
3
battleship/admin.py
Normal file
3
battleship/admin.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
6
battleship/apps.py
Normal file
6
battleship/apps.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class BattleshipConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'battleship'
|
||||
44
battleship/migrations/0001_initial.py
Normal file
44
battleship/migrations/0001_initial.py
Normal file
@@ -0,0 +1,44 @@
|
||||
# Generated by Django 3.2.15 on 2022-08-22 11:35
|
||||
|
||||
import battleship.models
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import django.utils.timezone
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Game',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('last_move_ts', models.DateTimeField(default=django.utils.timezone.now)),
|
||||
('turn', models.IntegerField(default=0)),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Player',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('field', models.CharField(default=' ', max_length=100)),
|
||||
('number', models.IntegerField()),
|
||||
('attend_token', models.CharField(default=battleship.models.generate_token, max_length=30)),
|
||||
('token', models.CharField(blank=True, max_length=30, null=True)),
|
||||
('game', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='battleship.game')),
|
||||
],
|
||||
),
|
||||
migrations.AddConstraint(
|
||||
model_name='player',
|
||||
constraint=models.UniqueConstraint(fields=('token',), name='unique_player_token'),
|
||||
),
|
||||
migrations.AddConstraint(
|
||||
model_name='player',
|
||||
constraint=models.UniqueConstraint(fields=('attend_token',), name='unique_player_attend_token'),
|
||||
),
|
||||
]
|
||||
0
battleship/migrations/__init__.py
Normal file
0
battleship/migrations/__init__.py
Normal file
30
battleship/models.py
Normal file
30
battleship/models.py
Normal file
@@ -0,0 +1,30 @@
|
||||
import random
|
||||
|
||||
from django.db import models
|
||||
|
||||
# Create your models here.
|
||||
from django.utils import timezone
|
||||
|
||||
|
||||
def generate_token():
|
||||
letters = 'qwertyuioppasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890'
|
||||
return ''.join([random.choice(letters) for _ in range(30)])
|
||||
|
||||
|
||||
class Game(models.Model):
|
||||
last_move_ts = models.DateTimeField(default=timezone.now)
|
||||
turn = models.IntegerField(default=0)
|
||||
|
||||
|
||||
class Player(models.Model):
|
||||
game = models.ForeignKey(Game, on_delete=models.CASCADE)
|
||||
field = models.CharField(max_length=100, default=' ' * 100)
|
||||
number = models.IntegerField()
|
||||
attend_token = models.CharField(max_length=30, default=generate_token)
|
||||
token = models.CharField(max_length=30, null=True, blank=True)
|
||||
|
||||
class Meta:
|
||||
constraints = [
|
||||
models.UniqueConstraint(fields=['token'], name='unique_player_token'),
|
||||
models.UniqueConstraint(fields=['attend_token'], name='unique_player_attend_token')
|
||||
]
|
||||
3
battleship/tests.py
Normal file
3
battleship/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
99
battleship/views.py
Normal file
99
battleship/views.py
Normal file
@@ -0,0 +1,99 @@
|
||||
from django.http import JsonResponse
|
||||
from django.shortcuts import render
|
||||
|
||||
# Create your views here.
|
||||
from battleship.models import Game, Player, generate_token
|
||||
|
||||
|
||||
def new_game(request):
|
||||
game = Game.objects.create()
|
||||
player1 = Player.objects.create(
|
||||
game=game,
|
||||
number=0,
|
||||
token=generate_token()
|
||||
)
|
||||
player2 = Player.objects.create(
|
||||
game=game,
|
||||
number=1
|
||||
)
|
||||
return JsonResponse({
|
||||
'game_id': game.id,
|
||||
'player_token': player2.attend_token,
|
||||
'my_token': player1.token
|
||||
})
|
||||
|
||||
|
||||
def attend_game(request):
|
||||
game_id = request.POST['game_id']
|
||||
attend_token = request.POST['attend_token']
|
||||
player = Player.objects.get(game_id=game_id, attend_token=attend_token)
|
||||
if player.token is not None:
|
||||
return JsonResponse({}, status=403)
|
||||
player.token = generate_token()
|
||||
player.save()
|
||||
return JsonResponse({
|
||||
'token': player.token
|
||||
})
|
||||
|
||||
|
||||
def place_ships(request):
|
||||
game_id = request.POST['game_id']
|
||||
token = request.POST['token']
|
||||
player = Player.objects.get(game_id=game_id, token=token)
|
||||
if player.field != ' ' * 100:
|
||||
return JsonResponse({}, status=403)
|
||||
player.field = request.POST['field']
|
||||
player.save()
|
||||
return JsonResponse({})
|
||||
|
||||
|
||||
def check_opponent(request):
|
||||
game_id = request.POST['game_id']
|
||||
token = request.POST['token']
|
||||
player = Player.objects.get(game_id=game_id, token=token)
|
||||
player2 = Player.objects.filter(game_id=game_id, number=(1 - player.number)).first()
|
||||
if player2 is None:
|
||||
return JsonResponse({"attend": False, "ready": False})
|
||||
return JsonResponse({"attend": True, "ready": player2.field != ' ' * 100})
|
||||
|
||||
|
||||
def shoot(request):
|
||||
game_id = request.POST['game_id']
|
||||
token = request.POST['token']
|
||||
player = Player.objects.get(game_id=game_id, token=token)
|
||||
if player.game.turn != player.number:
|
||||
return JsonResponse({}, status=403)
|
||||
player2 = Player.objects.get(game_id=game_id, number=(1 - player.number))
|
||||
h = request.POST['h']
|
||||
v = request.POST['v']
|
||||
pos = h * 10 + v
|
||||
if player2.field[pos] == 'x' or player2.field[pos] == '.':
|
||||
return JsonResponse({}, status=403)
|
||||
if player2.field[pos] == 'o':
|
||||
new_symb = 'x'
|
||||
else:
|
||||
new_symb = '.'
|
||||
player.game.turn = (1 - player.game.turn)
|
||||
player.game.save()
|
||||
if pos == 0:
|
||||
player2.field = new_symb + player2.field[1:]
|
||||
elif pos == 99:
|
||||
player2.field[:99] + new_symb
|
||||
else:
|
||||
player2.field = player2.field[:pos] + new_symb + player2.field[pos + 1:]
|
||||
player2.save()
|
||||
return JsonResponse({
|
||||
'shot': new_symb == 'x',
|
||||
'game_finish': 'o' not in player2.field
|
||||
})
|
||||
|
||||
|
||||
def check_status(request):
|
||||
game_id = request.POST['game_id']
|
||||
token = request.POST['token']
|
||||
player = Player.objects.get(game_id=game_id, token=token)
|
||||
player2 = Player.objects.get(game_id=game_id, number=1 - player.number)
|
||||
return JsonResponse({
|
||||
'my_turn': player.game.turn == player.number,
|
||||
'game_finished': 'o' not in player.field or 'o' not in player2.field
|
||||
})
|
||||
Reference in New Issue
Block a user