Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from flask import Flask,request,render_template,redirect,session
- import matplotlib
- matplotlib.use('Agg')
- import matplotlib.pyplot as plt
- import io
- import base64
- import numpy as np
- from matplotlib.table import Table
- app=Flask(__name__)
- app.secret_key = b'_5#y2L"Fff8z\n\xec]/'
- statki=[]
- statki_gracza=[]
- zakazane=[]
- for i in range(1,4):
- for j in range(1,11):
- zakazane.extend([(-i,j),(j,-i),(j,10+i),(10+i,j)])
- class ship:
- def __init__(self, masts, direction, pos):
- self.masts = masts
- self.direction = direction
- self.pos=pos
- self.punkty=[(pos[0]+k,pos[1]) for k in range(masts)] if direction=='v' else [(pos[0],pos[1]+k) for k in range(masts)]
- def sprawdz_maszty(statki):
- if len(statki)==0:
- return 4
- elif len(statki) in [1,2]:
- return 3
- elif len(statki) in [3,4,5]:
- return 2
- elif len(statki) in [6,7,8,9]:
- return 1
- #Utworzenie pustej tabeli na statki
- def ships_table(ax,color,nrows=10,ncols=10):
- tb = Table(ax, bbox=[0,0,1,1])
- width, height = 1.0/ncols, 1.0/nrows
- for i in range(nrows):
- for j in range(ncols):
- tb.add_cell(i, j, width, height, loc='center', facecolor=color)
- for i in range(nrows):
- tb.add_cell(i, -1, width, height, text=i+1, loc='right',
- edgecolor='none', facecolor='none')
- for j in range(ncols):
- tb.add_cell(-1, j, width, height/2, text=chr(ord('A')+j), loc='center',
- edgecolor='none', facecolor='none')
- return tb
- #Dodanie komórek, na których umieszczone są statki
- def dodaj_statek(statek,tab,color,nrows=10,ncols=10):
- width, height = 1.0/ncols, 1.0/nrows
- if statek.direction=='v':
- for i in range(statek.masts):
- tab.add_cell(statek.pos[0]+i, statek.pos[1], width, height,loc='center',facecolor=color, edgecolor='none', text='Statek')
- else:
- for i in range(statek.masts):
- tab.add_cell(statek.pos[0], statek.pos[1]+i, width, height,loc='center',facecolor=color, edgecolor='none')
- @app.route("/")
- def hello():
- return render_template("index.html")
- @app.route("/statek", methods=["POST"])
- def statek():
- bledne=0
- img = io.BytesIO()
- fig,ax = plt.subplots()
- ax.set_axis_off()
- plansza=ships_table(ax,'white',10,10)
- try:
- direction=request.form["dir"]
- x=int(request.form["x"])
- y=int(request.form["y"])
- except:
- #Osobna obsługa strony przy pierwszym wywołaniu
- ax.add_table(plansza)
- plt.savefig(img, format='png')
- img.seek(0)
- url = base64.b64encode(img.getvalue()).decode()
- plt.close()
- rysunek='data:image/png;base64,{}'.format(url)
- return render_template("statek.html",maszty=4,rysunek=rysunek,bledne=bledne)
- maszty=sprawdz_maszty(statki)
- if direction=='v':
- for k in range(maszty):
- if (x,y+k) in zakazane:
- bledne=1
- break
- else:
- zakazane.extend([(x+m,y+l) for l in range(-1,maszty+1) for m in range(-1,2)])
- else:
- for k in range(maszty):
- if (x+k,y) in zakazane:
- bledne=1
- break
- else:
- zakazane.extend([(x+l,y+m) for l in range(-1,maszty+1) for m in range(-1,2)])
- if bledne==0:
- statek=ship(maszty, direction, (y-1,x-1))
- statki.append(statek)
- if len(statki)==10:
- session["statki"]=[statek.__dict__ for statek in statki]
- return redirect("/gramy")
- for statek in statki:
- dodaj_statek(statek,plansza,'green')
- maszty=sprawdz_maszty(statki)
- ax.add_table(plansza)
- plt.savefig(img, format='png')
- img.seek(0)
- url = base64.b64encode(img.getvalue()).decode()
- plt.close()
- rysunek='data:image/png;base64,{}'.format(url)
- return render_template("statek.html",maszty=maszty,rysunek=rysunek,bledne=bledne)
- @app.route("/gramy", methods=["POST", "GET"])
- def gra():
- img = io.BytesIO()
- fig,axes = plt.subplots(1,2)
- plansza_gr=ships_table(axes[0],'white',10,10)
- plansza_op=ships_table(axes[1],'blue',10,10)
- if "statki" in session:
- statki_sesja=session["statki"]
- for st in statki_sesja:
- statek=ship(st["masts"], st["direction"], st["pos"])
- statki_gracza.append(statek)
- session.pop("statki", None)
- for statek in statki_gracza:
- dodaj_statek(statek,plansza_gr,'green')
- axes[0].add_table(plansza_gr)
- axes[0].text(0.5,1.1,'Flota gracza',transform=axes[0].transAxes, ha="center")
- axes[0].axis("off")
- axes[1].add_table(plansza_op)
- axes[1].text(0.5,1.1,'Flota przeciwnika',transform=axes[1].transAxes, ha="center")
- axes[1].axis("off")
- plt.savefig(img, format='png')
- img.seek(0)
- url = base64.b64encode(img.getvalue()).decode()
- plt.close()
- rysunek='data:image/png;base64,{}'.format(url)
- return render_template("gramy.html",rysunek=rysunek)
- @app.route("/koniec", methods=["POST"])
- def koniec():
- return render_template("koniec.html")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement