Advertisement
Guest User

Untitled

a guest
Jun 19th, 2019
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.07 KB | None | 0 0
  1. from flask import Flask,request,render_template,redirect,session
  2. import matplotlib
  3. matplotlib.use('Agg')
  4. import matplotlib.pyplot as plt
  5. import io
  6. import base64
  7. import numpy as np
  8. from matplotlib.table import Table
  9. app=Flask(__name__)
  10. app.secret_key = b'_5#y2L"Fff8z\n\xec]/'
  11. statki=[]
  12. statki_gracza=[]
  13. zakazane=[]
  14. for i in range(1,4):
  15. for j in range(1,11):
  16. zakazane.extend([(-i,j),(j,-i),(j,10+i),(10+i,j)])
  17. class ship:
  18. def __init__(self, masts, direction, pos):
  19. self.masts = masts
  20. self.direction = direction
  21. self.pos=pos
  22. 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)]
  23. def sprawdz_maszty(statki):
  24. if len(statki)==0:
  25. return 4
  26. elif len(statki) in [1,2]:
  27. return 3
  28. elif len(statki) in [3,4,5]:
  29. return 2
  30. elif len(statki) in [6,7,8,9]:
  31. return 1
  32. #Utworzenie pustej tabeli na statki
  33. def ships_table(ax,color,nrows=10,ncols=10):
  34. tb = Table(ax, bbox=[0,0,1,1])
  35. width, height = 1.0/ncols, 1.0/nrows
  36. for i in range(nrows):
  37. for j in range(ncols):
  38. tb.add_cell(i, j, width, height, loc='center', facecolor=color)
  39. for i in range(nrows):
  40. tb.add_cell(i, -1, width, height, text=i+1, loc='right',
  41. edgecolor='none', facecolor='none')
  42. for j in range(ncols):
  43. tb.add_cell(-1, j, width, height/2, text=chr(ord('A')+j), loc='center',
  44. edgecolor='none', facecolor='none')
  45. return tb
  46. #Dodanie komórek, na których umieszczone są statki
  47. def dodaj_statek(statek,tab,color,nrows=10,ncols=10):
  48. width, height = 1.0/ncols, 1.0/nrows
  49. if statek.direction=='v':
  50. for i in range(statek.masts):
  51. tab.add_cell(statek.pos[0]+i, statek.pos[1], width, height,loc='center',facecolor=color, edgecolor='none', text='Statek')
  52. else:
  53. for i in range(statek.masts):
  54. tab.add_cell(statek.pos[0], statek.pos[1]+i, width, height,loc='center',facecolor=color, edgecolor='none')
  55. @app.route("/")
  56. def hello():
  57. return render_template("index.html")
  58. @app.route("/statek", methods=["POST"])
  59. def statek():
  60. bledne=0
  61. img = io.BytesIO()
  62. fig,ax = plt.subplots()
  63. ax.set_axis_off()
  64. plansza=ships_table(ax,'white',10,10)
  65. try:
  66. direction=request.form["dir"]
  67. x=int(request.form["x"])
  68. y=int(request.form["y"])
  69. except:
  70. #Osobna obsługa strony przy pierwszym wywołaniu
  71. ax.add_table(plansza)
  72. plt.savefig(img, format='png')
  73. img.seek(0)
  74. url = base64.b64encode(img.getvalue()).decode()
  75. plt.close()
  76. rysunek='data:image/png;base64,{}'.format(url)
  77. return render_template("statek.html",maszty=4,rysunek=rysunek,bledne=bledne)
  78. maszty=sprawdz_maszty(statki)
  79. if direction=='v':
  80. for k in range(maszty):
  81. if (x,y+k) in zakazane:
  82. bledne=1
  83. break
  84. else:
  85. zakazane.extend([(x+m,y+l) for l in range(-1,maszty+1) for m in range(-1,2)])
  86. else:
  87. for k in range(maszty):
  88. if (x+k,y) in zakazane:
  89. bledne=1
  90. break
  91. else:
  92. zakazane.extend([(x+l,y+m) for l in range(-1,maszty+1) for m in range(-1,2)])
  93. if bledne==0:
  94. statek=ship(maszty, direction, (y-1,x-1))
  95. statki.append(statek)
  96. if len(statki)==10:
  97. session["statki"]=[statek.__dict__ for statek in statki]
  98. return redirect("/gramy")
  99. for statek in statki:
  100. dodaj_statek(statek,plansza,'green')
  101. maszty=sprawdz_maszty(statki)
  102. ax.add_table(plansza)
  103. plt.savefig(img, format='png')
  104. img.seek(0)
  105. url = base64.b64encode(img.getvalue()).decode()
  106. plt.close()
  107. rysunek='data:image/png;base64,{}'.format(url)
  108. return render_template("statek.html",maszty=maszty,rysunek=rysunek,bledne=bledne)
  109. @app.route("/gramy", methods=["POST", "GET"])
  110. def gra():
  111. img = io.BytesIO()
  112. fig,axes = plt.subplots(1,2)
  113. plansza_gr=ships_table(axes[0],'white',10,10)
  114. plansza_op=ships_table(axes[1],'blue',10,10)
  115. if "statki" in session:
  116. statki_sesja=session["statki"]
  117. for st in statki_sesja:
  118. statek=ship(st["masts"], st["direction"], st["pos"])
  119. statki_gracza.append(statek)
  120. session.pop("statki", None)
  121. for statek in statki_gracza:
  122. dodaj_statek(statek,plansza_gr,'green')
  123. axes[0].add_table(plansza_gr)
  124. axes[0].text(0.5,1.1,'Flota gracza',transform=axes[0].transAxes, ha="center")
  125. axes[0].axis("off")
  126. axes[1].add_table(plansza_op)
  127. axes[1].text(0.5,1.1,'Flota przeciwnika',transform=axes[1].transAxes, ha="center")
  128. axes[1].axis("off")
  129. plt.savefig(img, format='png')
  130. img.seek(0)
  131. url = base64.b64encode(img.getvalue()).decode()
  132. plt.close()
  133. rysunek='data:image/png;base64,{}'.format(url)
  134. return render_template("gramy.html",rysunek=rysunek)
  135. @app.route("/koniec", methods=["POST"])
  136. def koniec():
  137. return render_template("koniec.html")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement