import sqlite3 from urllib.parse import urlparse, parse_qs from http.server import BaseHTTPRequestHandler, HTTPServer WIDTH, HEIGHT = 50, 20 HOST, PORT = "localhost", 80 class MyHandler(BaseHTTPRequestHandler): def start(self): return """\
""" def end(self): return """\ """ def write_your_name(self): return """\ """ def world(self): strings = [[" " for _ in range(WIDTH)] for _ in range(HEIGHT)] for row in self._cursor.execute("""SELECT posx, posy, level FROM players"""): strings[row[1]][row[0]] = ("%02d" % row[2]) strings = ["|"+"".join(string)+"|\n" for string in strings] strings.append(("-"*(2*WIDTH+2))+""+("-"*(2*WIDTH+2))+"\n"+"".join(strings) def _set_headers(self): self.send_response(200) self.send_header('Content-type', 'text/html') self.end_headers() def do_GET(self): self._connection = sqlite3.connect('game.db') self._cursor = self._connection.cursor() self._set_headers() parsed = urlparse(self.path) pquery = parse_qs(parsed.query) response = self.start() self._root = '..' self._name = pquery.get('name', (None,))[0] if parsed.path == '/': self._root = '' response += self.write_your_name() if self._name is not None: if parsed.path == '/go': result = self._cursor.execute("""SELECT name FROM players WHERE name = ?""", (self._name,)) if result.fetchone() is None: self._cursor.execute("""INSERT INTO players (name, posx, posy, level) VALUES (?, ?, ?, 1)""", (self._name, WIDTH//2, HEIGHT//2)) response += self.world() response += "
I start.
" self._connection.commit() if parsed.path == '/left': self._cursor.execute("""UPDATE players SET posx = posx - 1 WHERE name = ? AND posx > 0""", (self._name,)) response += self.world() response += "
I go left.
" self._connection.commit() if parsed.path == '/up': self._cursor.execute("""UPDATE players SET posy = posy - 1 WHERE name = ? AND posy > 0""", (self._name,)) response += self.world() response += "
I go up.
" self._connection.commit() if parsed.path == '/down': self._cursor.execute("""UPDATE players SET posy = posy + 1 WHERE name = ? AND posy < ?""", (self._name, HEIGHT - 1)) response += self.world() response += "
I go down.
" self._connection.commit() if parsed.path == '/right': self._cursor.execute("""UPDATE players SET posx = posx + 1 WHERE name = ? AND posx < ?""", (self._name, WIDTH - 1)) response += self.world() response += "
I go right.
" self._connection.commit() response += self.end() self._connection.close() self.wfile.write(bytes(response, "UTF-8")) def do_POST(self): self.do_GET() def do_HEAD(self): self._set_headers() server = HTTPServer((HOST, PORT), MyHandler) try: server.serve_forever() except KeyboardInterrupt: pass server.server_close()