2024-03-09 18:06:44 +00:00
|
|
|
#!/usr/bin/env python3
|
2024-03-09 18:06:19 +00:00
|
|
|
from colored import bg, fg, attr
|
2024-03-09 18:06:30 +00:00
|
|
|
import datetime
|
|
|
|
import time
|
2024-03-09 18:06:19 +00:00
|
|
|
from getch import getch
|
|
|
|
import possible
|
2024-03-09 18:07:07 +00:00
|
|
|
import os
|
|
|
|
|
|
|
|
unicode=True
|
|
|
|
if not 'xterm' in os.environ['TERM']:
|
|
|
|
unicode=False
|
2024-03-09 18:06:19 +00:00
|
|
|
|
2024-03-09 18:06:30 +00:00
|
|
|
colors = [bg("white")+fg("black"), bg("dark_gray")+fg("white"),bg("light_yellow")+fg("dark_gray"),bg("green")+fg("white"),bg("light_gray")]
|
2024-03-09 18:06:19 +00:00
|
|
|
keycolors = [fg("white")+bg("black"), fg("dark_gray")+bg("black"),fg("light_yellow")+bg("black"),fg("green")+bg("black")]
|
|
|
|
reset = bg("black")+fg("white")
|
|
|
|
|
|
|
|
class Wordle:
|
|
|
|
def check(self):
|
|
|
|
word=self.curGuess.upper()
|
|
|
|
if word.lower() not in possible.guesses and word.lower() not in possible.answers:
|
|
|
|
return False
|
|
|
|
else:
|
|
|
|
turn=self.turn
|
2024-03-09 18:06:30 +00:00
|
|
|
self.guesses[turn][0]=[4,4,4,4,4]
|
|
|
|
self.drawGuessLine(turn)
|
2024-03-09 18:06:58 +00:00
|
|
|
time.sleep(0.01)
|
2024-03-09 18:06:19 +00:00
|
|
|
self.guesses[turn][1] = word
|
|
|
|
processed=[]
|
|
|
|
for i,letter in enumerate(word):
|
|
|
|
if letter == self.answer[i]:
|
|
|
|
self.guesses[turn][0][i] = 3
|
|
|
|
self.guessedKeys[letter] = 3
|
|
|
|
processed.append(letter)
|
|
|
|
for i,letter in enumerate(word):
|
|
|
|
if letter in self.answer and processed.count(letter)<self.answer.count(letter) and letter != self.answer[i]:
|
|
|
|
processed.append(letter)
|
|
|
|
self.guesses[turn][0][i] = 2
|
|
|
|
if letter not in self.guessedKeys:
|
2024-03-09 18:06:30 +00:00
|
|
|
self.guessedKeys[letter] = 2
|
2024-03-09 18:06:19 +00:00
|
|
|
else:
|
2024-03-09 18:06:30 +00:00
|
|
|
self.guesses[turn][0][i] = max(self.guesses[turn][0][i]%4,1)
|
2024-03-09 18:06:19 +00:00
|
|
|
if letter not in self.guessedKeys:
|
2024-03-09 18:06:30 +00:00
|
|
|
self.guessedKeys[letter] = 1
|
2024-03-09 18:06:19 +00:00
|
|
|
self.drawGuessLine(self.turn)
|
|
|
|
self.turn +=1
|
|
|
|
self.drawStatusLine()
|
|
|
|
self.drawKeyboard()
|
|
|
|
return True
|
|
|
|
|
|
|
|
def wonGame(self):
|
|
|
|
return self.curGuess == self.answer
|
|
|
|
def placeCursor(self):
|
2024-03-09 18:06:55 +00:00
|
|
|
putCursorInside(min(self.turn,5),min(len(self.curGuess),4))
|
2024-03-09 18:06:19 +00:00
|
|
|
def drawGuessLine(self,i):
|
|
|
|
baseRow = i * 4;
|
|
|
|
baseCol = 46
|
|
|
|
guess = self.guesses[i]
|
|
|
|
for line in range(3):
|
|
|
|
placeCursor(baseCol, baseRow+line)
|
|
|
|
for k,letter in enumerate(guess[0]):
|
|
|
|
if line!=1:
|
|
|
|
put(colors[letter]+" "+reset+" ")
|
|
|
|
else:
|
|
|
|
put(colors[letter]+" "+guess[1][k]+" "+reset+" ")
|
|
|
|
def drawStatusLine(self):
|
|
|
|
placeCursor(9,21)
|
|
|
|
put(reset+str(self.number))
|
|
|
|
placeCursor(34,21)
|
2024-03-09 18:07:00 +00:00
|
|
|
if(self.wonGame()):
|
|
|
|
t=self.turn
|
|
|
|
else:
|
|
|
|
t=self.turn+1
|
|
|
|
put("Turn: "+str(min(t,6))+"/6"+colors[0])
|
2024-03-09 18:06:19 +00:00
|
|
|
|
|
|
|
def drawKeyboard(self):
|
|
|
|
placeCursor(13,17)
|
|
|
|
for key in "qwertyuiop":
|
|
|
|
if key.upper() in self.guessedKeys:
|
|
|
|
put(keycolors[self.guessedKeys[key.upper()]]+key+' ')
|
|
|
|
else:
|
|
|
|
put(reset+key+' ')
|
|
|
|
placeCursor(14,18)
|
|
|
|
for key in "asdfghjkl":
|
|
|
|
if key.upper() in self.guessedKeys:
|
|
|
|
put(keycolors[self.guessedKeys[key.upper()]]+key+' ')
|
|
|
|
else:
|
|
|
|
put(reset+key+' ')
|
|
|
|
placeCursor(16,19)
|
|
|
|
for key in "zxcvbnm":
|
|
|
|
if key.upper() in self.guessedKeys:
|
|
|
|
put(keycolors[self.guessedKeys[key.upper()]]+key+' ')
|
|
|
|
else:
|
|
|
|
put(reset+key+' ')
|
|
|
|
|
|
|
|
|
|
|
|
put(colors[0])
|
|
|
|
|
|
|
|
def __init__(self):
|
2024-03-09 18:06:30 +00:00
|
|
|
start = datetime.date(2021,6,19)
|
|
|
|
number = (datetime.date.today()-start).days
|
2024-03-09 18:06:19 +00:00
|
|
|
self.number = number
|
|
|
|
self.turn = 0
|
|
|
|
self.curGuess=""
|
|
|
|
self.answer = possible.answers[number].upper()
|
|
|
|
self.guessedKeys = {}
|
|
|
|
# 0 = no guess, 1 = not in word, 2 = wrong place, 3 = correct
|
|
|
|
self.guesses = [[[0 for i in range(5)]," "] for i in range(6)]
|
|
|
|
for i in range(6):
|
|
|
|
self.drawGuessLine(i)
|
|
|
|
self.drawStatusLine()
|
|
|
|
self.drawKeyboard()
|
|
|
|
self.errorStatus=""
|
|
|
|
def updateError(self,e=reset+" "+colors[0]):
|
|
|
|
self.errorStatus = e
|
|
|
|
placeCursor(3, 22)
|
|
|
|
put(e)
|
|
|
|
self.placeCursor()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def put(s):
|
|
|
|
print(s,end='',flush=True);
|
|
|
|
def move(direction,n=1):
|
|
|
|
keymap={"u":"A","d":"B","l":"D","r":"C"}
|
|
|
|
put("\033["+str(n)+keymap[direction]);
|
|
|
|
def goHome():
|
|
|
|
print("\r")
|
|
|
|
move("u",50)
|
|
|
|
def placeCursor(x,y):
|
|
|
|
goHome()
|
|
|
|
if x>0:
|
|
|
|
move("r",x)
|
|
|
|
if y>0:
|
|
|
|
move("d",y)
|
|
|
|
def putCursorInside(guess,letter):
|
|
|
|
row = guess * 4 + 1;
|
2024-03-09 18:06:30 +00:00
|
|
|
col = 48 + letter * 6;
|
2024-03-09 18:06:19 +00:00
|
|
|
placeCursor(col,row);
|
|
|
|
put(colors[0])
|
2024-03-09 18:06:58 +00:00
|
|
|
def blankScreen():
|
|
|
|
placeCursor(0,0)
|
|
|
|
put(reset+((" "*80+"\n")*24));
|
|
|
|
placeCursor(0,0)
|
2024-03-09 18:06:19 +00:00
|
|
|
def main():
|
|
|
|
cursorLocation = 0
|
2024-03-09 18:06:58 +00:00
|
|
|
print("\033c")
|
|
|
|
blankScreen()
|
2024-03-09 18:07:07 +00:00
|
|
|
if not unicode:
|
|
|
|
screen="\x1b[?25l"+fg('green')+''' _ _
|
|
|
|
__ _____ _ __ __| | | ___
|
|
|
|
\ \ /\ / / _ \| '__/ _` | |/ _ \
|
|
|
|
\ V V / (_) | | | (_| | | __/
|
|
|
|
\_/\_/ \___/|_| \__,_|_|\___| '''
|
|
|
|
else:
|
|
|
|
screen="\x1b[?25l"+fg('green')+'''
|
2024-03-09 18:06:30 +00:00
|
|
|
████████████████████████████████████████
|
|
|
|
█▄─█▀▀▀█─▄█─▄▄─█▄─▄▄▀█▄─▄▄▀█▄─▄███▄─▄▄─█
|
2024-03-09 18:06:19 +00:00
|
|
|
██─█─█─█─██─██─██─▄─▄██─██─██─██▀██─▄█▀█
|
2024-03-09 18:07:07 +00:00
|
|
|
▀▀▄▄▄▀▄▄▄▀▀▄▄▄▄▀▄▄▀▄▄▀▄▄▄▄▀▀▄▄▄▄▄▀▄▄▄▄▄▀'''
|
|
|
|
screen +='''
|
|
|
|
clone by xereeto
|
|
|
|
original by josh wardle '''+fg('white')+'''
|
2024-03-09 18:06:19 +00:00
|
|
|
----------------------------------------
|
2024-03-09 18:06:30 +00:00
|
|
|
Guess the WORDLE in 6 tries.
|
|
|
|
Each guess must be a valid 5 letter word.
|
|
|
|
Press the enter button to submit.
|
|
|
|
|
|
|
|
After each guess, the color of the tiles
|
|
|
|
will change to show how close your guess
|
|
|
|
was to the word.
|
|
|
|
----------------------------------------
|
|
|
|
Keys:
|
|
|
|
q w e r t y u i o p
|
|
|
|
a s d f g h j k l
|
2024-03-09 18:06:19 +00:00
|
|
|
z x c v b n m
|
2024-03-09 18:06:30 +00:00
|
|
|
----------------------------------------
|
|
|
|
Game: XXX
|
2024-03-09 18:06:19 +00:00
|
|
|
'''
|
2024-03-09 18:07:07 +00:00
|
|
|
|
2024-03-09 18:06:19 +00:00
|
|
|
goHome()
|
2024-03-09 18:06:30 +00:00
|
|
|
print(screen,end="")
|
2024-03-09 18:06:19 +00:00
|
|
|
goHome()
|
|
|
|
w = Wordle()
|
|
|
|
while w.turn<6 and not w.wonGame():
|
|
|
|
turnOver = False
|
|
|
|
w.curGuess=""
|
|
|
|
prevchar = 0
|
|
|
|
char = 0
|
|
|
|
w.placeCursor()
|
|
|
|
while not turnOver:
|
|
|
|
try:
|
|
|
|
char = getch().upper()
|
|
|
|
except OverflowError:
|
|
|
|
pass
|
2024-03-09 18:06:30 +00:00
|
|
|
if ord(char)==3:
|
|
|
|
return
|
2024-03-09 18:06:19 +00:00
|
|
|
prevchar = ord(char)
|
|
|
|
if char>="A" and char <="Z" and prevchar !=91:
|
|
|
|
if len(w.curGuess)<5:
|
|
|
|
put(char)
|
|
|
|
w.curGuess+=char
|
|
|
|
w.updateError()
|
|
|
|
w.placeCursor()
|
2024-03-09 18:07:09 +00:00
|
|
|
if ord(char)==127 or ord(char)==8: # backspace
|
2024-03-09 18:06:19 +00:00
|
|
|
if len(w.curGuess)>0:
|
|
|
|
if len(w.curGuess)==5:
|
|
|
|
put(" ")
|
|
|
|
w.curGuess=w.curGuess[:-1]
|
|
|
|
w.placeCursor()
|
|
|
|
else:
|
|
|
|
w.curGuess=w.curGuess[:-1]
|
|
|
|
w.placeCursor()
|
|
|
|
put(" ")
|
|
|
|
move("l",1)
|
|
|
|
w.updateError();
|
|
|
|
if ord(char)==10: # enter
|
|
|
|
if len(w.curGuess)<5:
|
|
|
|
w.updateError("Use all 5 letters!")
|
|
|
|
elif w.check():
|
|
|
|
turnOver=True
|
|
|
|
else:
|
|
|
|
w.updateError("You have to enter a real word!")
|
|
|
|
if w.wonGame():
|
2024-03-09 18:06:30 +00:00
|
|
|
s="s"
|
|
|
|
if w.turn==1:
|
|
|
|
s=""
|
|
|
|
w.updateError("You won in "+str(w.turn)+" turn"+s+"!")
|
2024-03-09 18:06:19 +00:00
|
|
|
else:
|
2024-03-09 18:06:30 +00:00
|
|
|
w.updateError("You lost :( The word was "+w.answer+"!")
|
|
|
|
time.sleep(2)
|
|
|
|
midnight = (datetime.datetime.now() + datetime.timedelta(days=1)).replace(hour=0, minute=0, microsecond=0, second=0)
|
2024-03-09 18:06:55 +00:00
|
|
|
w.updateError()
|
2024-03-09 18:06:30 +00:00
|
|
|
w.updateError("Next WORDLE in: "+str(datetime.timedelta(seconds=(midnight-datetime.datetime.now()).seconds)))
|
2024-03-09 18:06:19 +00:00
|
|
|
time.sleep(2)
|
2024-03-09 18:06:42 +00:00
|
|
|
return w
|
2024-03-09 18:06:19 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-03-09 18:06:42 +00:00
|
|
|
import sys
|
2024-03-09 18:06:53 +00:00
|
|
|
w=None
|
2024-03-09 18:06:19 +00:00
|
|
|
try:
|
2024-03-09 18:06:42 +00:00
|
|
|
w=main()
|
2024-03-09 18:06:53 +00:00
|
|
|
|
2024-03-09 18:06:19 +00:00
|
|
|
except KeyboardInterrupt:
|
|
|
|
pass
|
|
|
|
finally:
|
2024-03-09 18:06:42 +00:00
|
|
|
print("\033cGoodbye!"+reset,end='')
|
|
|
|
cliflag = sys.argv[1] if len(sys.argv) > 1 else ''
|
2024-03-09 18:07:07 +00:00
|
|
|
if(w and cliflag != "--no-unicode" and unicode):
|
2024-03-09 18:06:42 +00:00
|
|
|
print("\n\nWordle "+str(w.turn)+"/6")
|
|
|
|
blocks=["⬛","🟨","🟩"]
|
|
|
|
for guess in w.guesses:
|
|
|
|
if guess[0][0]:
|
|
|
|
for letter in guess[0]:
|
|
|
|
put(blocks[letter-1])
|
|
|
|
print()
|
|
|
|
print("\x1b[?25h")
|
2024-03-09 18:07:09 +00:00
|
|
|
|