gemini-boggle/new_game.cgi

106 lines
1.8 KiB
Python
Executable File

#!/usr/bin/env python3
import random
from helpers import get_query_string, get_client_cert,show_header_ok,show_redirect
from db import check_hash, set_name, create_connection, create_new_game
class Trie:
def __init__(self,letter):
self.letter=letter
self.mark=False
self.next=[None]*26
@staticmethod
def add(root,word):
curr=root
for i in word:
j=i.upper()
k=ord(j)-65
if curr.next[k]==None:
curr.next[k]=Trie(j)
curr=curr.next[k]
curr.mark=True
f=open('cgi-bin/dice.txt','r')
dice=f.read().split('\n')
f.close()
dice=list(filter(None,dice))
random.shuffle(dice)
b=[]
for j in range(4):
b.append([])
for i in range(4):
die=dice[j*4+i]
b[j].append(die[random.randrange(0,len(die))].upper())
def r(s):
return s and len(s)>=3 and len(s)<=16
f=open('cgi-bin/enable.txt','r')
words=f.read().split('\n')
f.close()
words=list(filter(r,words))
trie=Trie(None)
for word in words:
Trie.add(trie,word.upper())
g=[]
for j in range(4):
g.append([])
for i in range(4):
g[j].append(False)
found=[]
l=['' for i in range(16)]
def dfs(x,y,d,trie):
if x<0 or x>=4 or y<0 or y>=4:
return
if g[y][x]:
return
k=ord(b[y][x].upper())-65
t=trie.next[k]
if not t:
return
l[d]=b[y][x].upper()
if t.mark:
w=''.join(l[0:d+1])
if w not in found:
found.append(w)
g[y][x]=True
for j in [-1,0,1]:
for i in [-1,0,1]:
if i!=0 or j!=0:
dfs(x+i,y+j,d+1,t)
g[y][x]=False
for j in range(4):
for i in range(4):
dfs(i,j,0,trie)
found.sort(key=len,reverse=True)
board=[]
for j in range(4):
for i in range(4):
board.append(b[j][i])
bstr=','.join(board)
fstr=','.join(found)
gstr=','.join(['0']*len(found))
conn=create_connection()
game_id=create_new_game(conn,bstr,fstr,gstr)
show_redirect("choose.cgi?game_id="+str(game_id))