您好我正在使用python和Google应用引擎构建基本的Battleships应用。你可以在这里看到它:http://battleships-1098.appspot.com
我对编码比较新,所以请原谅我,如果我错过了一些相当基本的知识,但我已经在几周内一直在努力解决同样的问题。
该应用程序几乎可以与一个用户完美配合,但只要多个用户开始玩游戏(独立),他们就会开始覆盖彼此的数据。
例如:应用程序要求两个名称,但当另一个用户开始播放时,这些将被新玩家选择的名称覆盖。 e.g,
玩家1选择弗雷德和乔治的名字并开始玩。一切都很好。
然后玩家2开始玩一个完全独立的游戏并选择名字Anne和Rita。这实际上也会覆盖玩家1游戏中的名字。名称不是被覆盖的唯一数据位 - 记录的镜头也是如此。
我已经实施了谷歌登录尝试为每个用户创建单独的会话以努力阻止这一点,但这还没有解决这个问题。我非常感谢一些帮助,弄清楚我做错了什么! (请原谅我在这里效率低下的一些问题 - 我只是想让代码变得更好!)
from google.appengine.api import users
import jinja2
import os
import random
import webapp2
jinja = jinja2.Environment(loader=jinja2.FileSystemLoader(os.path.join(os.path.dirname(__file__), 'templates')))
board1 = []
board2 = []
def generate_board(board):
for row in range(0,5):
row = ['0']*5
board.append(row)
generate_board(board1)
generate_board(board2)
boats = 0
def generate_boats(board):
for boats in range(5):
i = random.randint(0,4)
n = random.randint(0,4)
board[i][n] = '1'
boats += 1
generate_boats(board1)
generate_boats(board2)
def user_shoots(board, col_shot, row_shot):
a=int(col_shot)-1
b=int(row_shot)-1
if board[a][b]=='1':
board[a][b]='X'
return True
else:
return False
i_a=0
i_b=0
t=1.5
s_a=3
s_b=3
h_sunka = []
h_misseda = []
h_sunkb = []
h_missedb = []
c_a = {}
c_b = {}
values={}
greet={}
class MainHandler(webapp2.RequestHandler):
def get(self):
user = users.get_current_user()
if user:
greet['nickname'] = user.nickname()
greet['url'] = users.create_logout_url('/')
template0=jinja.get_template('greeting.html')
self.response.out.write(template0.render(greet))
else:
greet['link2'] = users.create_login_url('/')
template01=jinja.get_template('greeting2.html')
self.response.out.write(template01.render(greet))
class GamePage(webapp2.RequestHandler):
def get(self):
name1=self.request.get("name1")
name2=self.request.get("name2")
values['name1']=name1
values['name2']=name2
c_a['name1']=name1
c_a['name2']=name2
c_b['name1']=name1
c_b['name2']=name2
template3 = jinja.get_template('game_body.html')
self.response.out.write(template3.render(values))
def post(self):
global i_a
global s_a
global t
if int(t)%2!=0:
if t%1==0:
template3 = jinja.get_template('game_body.html')
self.response.out.write(template3.render(c_a))
t+=0.5
else:
col_shot=self.request.get("column")
row_shot=self.request.get("row")
e='missed'
f='sunk'
if user_shoots(board2, col_shot, row_shot):
s_a-=1
i_a+=1
self.response.write('Kabbooom, good shot <br><br>')
h_sunka.append('a'+str(col_shot)+str(row_shot))
if s_a<=0:
self.response.write('\nAll ships down sir <br><br>')
self.response.write(c_a['name1'])
self.response.write(" wins! <br>")
else:
self.response.write('You fool! You missed <br><br>')
i_a+=1
h_misseda.append('a'+str(col_shot)+str(row_shot))
for miss in h_misseda:
c_a[miss]=e
for hit in h_sunka:
c_a[hit]=f
template4 = jinja.get_template('changeturns1.html')
self.response.out.write(template4.render(c_a))
t+=0.5
else:
if t%1==0:
template5 = jinja.get_template('game_title2.html')
self.response.out.write(template5.render(values))
template6 = jinja.get_template('game_body2.html')
self.response.out.write(template6.render(c_b))
t+=0.5
else:
col_shot=self.request.get("column")
row_shot=self.request.get("row")
e='missed'
f='sunk'
global i_b
global s_b
global t
if user_shoots(board1, col_shot, row_shot):
s_b-=1
i_b+=1
self.response.write('Kabbooom, good shot <br><br>')
h_sunkb.append('a'+str(col_shot)+str(row_shot))
if s_b<=0:
self.response.write('\nAll ships down sir <br><br>')
self.response.write(c_b['name2'])
self.response.write(" wins! <br>")
else:
self.response.write('You fool! You missed <br><br>')
i_b+=1
h_missedb.append('a'+str(col_shot)+str(row_shot))
for miss in h_missedb:
c_b[miss]=e
for hit in h_sunkb:
c_b[hit]=f
template7 = jinja.get_template('changeturns2.html')
self.response.out.write(template7.render(c_b))
t+=0.5
app = webapp2.WSGIApplication([
('/', MainHandler), ('/game', GamePage)
], debug=True)