else
parent
f561782a81
commit
87f4c44976
Binary file not shown.
After Width: | Height: | Size: 30 KiB |
|
@ -0,0 +1,10 @@
|
|||
BaseGame
|
||||
=======
|
||||
|
||||
Practice your ability to convert numbers between two bases.
|
||||
|
||||
Edit the `DEFAULT_` variables at the top of the script to however you like them. While playing, you can enter "!" to play on different settings. Enter "?" to receive the answer to the current round.
|
||||
|
||||
<p align="center">
|
||||
<img src="https://github.com/voussoir/else/blob/master/.GitImages/basegame.png?raw=true" alt="basegame"/>
|
||||
</p>
|
|
@ -0,0 +1,112 @@
|
|||
import random
|
||||
import shutil
|
||||
|
||||
DEFAULT_FROMBASE = 10
|
||||
DEFAULT_TOBASE = 16
|
||||
DEFAULT_LOWER = 0
|
||||
DEFAULT_UPPER = 1000
|
||||
|
||||
|
||||
TERMINALWIDTH = shutil.get_terminal_size().columns
|
||||
|
||||
def basex(number, base, alphabet='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'):
|
||||
"""Converts an integer to a different base string."""
|
||||
alphabet = alphabet[:base]
|
||||
if not isinstance(number, (int, str)):
|
||||
raise TypeError('number must be an integer')
|
||||
number = int(number)
|
||||
based = ''
|
||||
sign = ''
|
||||
if number < 0:
|
||||
sign = '-'
|
||||
number = -number
|
||||
if 0 <= number < len(alphabet):
|
||||
return sign + alphabet[number]
|
||||
while number != 0:
|
||||
number, i = divmod(number, len(alphabet))
|
||||
based = alphabet[i] + based
|
||||
return sign + based
|
||||
|
||||
def changebase(number, frombase, tobase):
|
||||
number = str(number)
|
||||
result = int(number, frombase)
|
||||
return basex(result, tobase)
|
||||
|
||||
def intinput(prompt, greaterthan=None):
|
||||
''' Prompt for input until the user enters an int '''
|
||||
while True:
|
||||
result = input(prompt)
|
||||
try:
|
||||
i = int(result)
|
||||
if greaterthan is None or i > greaterthan:
|
||||
return i
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
def configuration():
|
||||
frombase = intinput(' From base: ', 1)
|
||||
tobase = intinput(' To base: ', 1)
|
||||
lower = intinput('Lower bound: ')
|
||||
upper = intinput('Upper bound: ', lower)
|
||||
return {
|
||||
'frombase': frombase,
|
||||
'tobase': tobase,
|
||||
'lower': lower,
|
||||
'upper': upper,
|
||||
}
|
||||
|
||||
def calcpoints(solution, lower, upper, maxpoints):
|
||||
'''
|
||||
1/2 of the maxpoints are granted automatically.
|
||||
The other 1/2 points depends on how large the number
|
||||
you had to guess was.
|
||||
'''
|
||||
basescore = int(maxpoints / 2) + 1
|
||||
bonus = (solution - lower) / (upper - lower)
|
||||
bonus *= basescore
|
||||
bonus = int(bonus)
|
||||
return basescore + bonus
|
||||
|
||||
def playgame():
|
||||
c= {
|
||||
'frombase': DEFAULT_FROMBASE,
|
||||
'tobase': DEFAULT_TOBASE,
|
||||
'lower': DEFAULT_LOWER,
|
||||
'upper': DEFAULT_UPPER,
|
||||
}
|
||||
print('\n"!" to reconfigure, "?" to give up')
|
||||
score = 0
|
||||
while True:
|
||||
number = random.randint(c['lower'], c['upper'])
|
||||
prompt = changebase(number, 10, c['frombase'])
|
||||
solution = changebase(number, 10, c['tobase']).lower()
|
||||
prompt = 'b%d -> b%d : %s = ' % (c['frombase'], c['tobase'], prompt)
|
||||
|
||||
cursor = len(prompt) + 1
|
||||
scoretext = '(score: %d)' % score
|
||||
spacer = ' ' * (TERMINALWIDTH - (len(scoretext) + cursor))
|
||||
prompt = prompt + spacer + scoretext
|
||||
prompt += '\b' * (TERMINALWIDTH - cursor)
|
||||
|
||||
correctness = False
|
||||
while not correctness:
|
||||
guess = input(prompt).lower()
|
||||
guess = guess.lstrip('0')
|
||||
if guess == '!':
|
||||
c = configuration()
|
||||
correctness = True
|
||||
print()
|
||||
if guess == '?':
|
||||
if c['frombase'] != 10 and c['tobase'] != 10:
|
||||
b10 = ' (b10= %d)' % number
|
||||
else:
|
||||
b10 = ''
|
||||
print('%s= %s%s'% (' '*(cursor-3), solution, b10))
|
||||
correctness = True
|
||||
if guess == solution:
|
||||
maxpoints = int((c['upper'] - c['lower']) ** 0.5)
|
||||
score += calcpoints(number, c['lower'],c['upper'],maxpoints)
|
||||
correctness = True
|
||||
|
||||
if __name__ == '__main__':
|
||||
playgame()
|
|
@ -0,0 +1,75 @@
|
|||
import tkinter
|
||||
|
||||
class Keyboard:
|
||||
def __init__(self):
|
||||
self.windowtitle = 'Keyboard'
|
||||
|
||||
self.keywidth = 30
|
||||
self.keyspace = 5
|
||||
self.keys = self.build_keydict()
|
||||
|
||||
self.t = tkinter.Tk()
|
||||
self.t.title(self.windowtitle)
|
||||
self.w = (self.keywidth + self.keyspace) * 16
|
||||
self.h = (self.keywidth + self.keyspace) * 6
|
||||
self.screenwidth = self.t.winfo_screenwidth()
|
||||
self.screenheight = self.t.winfo_screenheight()
|
||||
self.windowwidth = self.w
|
||||
self.windowheight = self.h
|
||||
self.windowx = (self.screenwidth-self.windowwidth) / 2
|
||||
self.windowy = ((self.screenheight-self.windowheight) / 2) - 27
|
||||
self.geometrystring = '%dx%d+%d+%d' % (
|
||||
self.windowwidth, self.windowheight, self.windowx, self.windowy)
|
||||
self.t.geometry(self.geometrystring)
|
||||
|
||||
self.c = tkinter.Canvas(self.t)
|
||||
self.c.pack(expand=True, fill='both')
|
||||
|
||||
self.build_qwerty()
|
||||
|
||||
self.t.bind('<KeyPress>', self.press)
|
||||
self.t.bind('<KeyRelease>', self.release)
|
||||
|
||||
def mainloop(self):
|
||||
self.t.mainloop()
|
||||
|
||||
def press(self, event):
|
||||
c = event.char.lower()
|
||||
if c in self.keys:
|
||||
self.c.itemconfig(self.keys[c], fill='#f00')
|
||||
|
||||
def release(self, event):
|
||||
c = event.char.lower()
|
||||
if c in self.keys:
|
||||
self.c.itemconfig(self.keys[c], fill='systembuttonface')
|
||||
|
||||
def build_keydict(self):
|
||||
mainy = self.keywidth
|
||||
w = self.keywidth + self.keyspace
|
||||
rows = [
|
||||
{'c':'`1234567890-=', 'x':w, 'y':mainy},
|
||||
{'c':'qwertyuiop[]\\', 'x':w*1.5, 'y':mainy+w},
|
||||
{'c':'asdfghjkl;\'', 'x':w*1.8, 'y':mainy+(w*2)},
|
||||
{'c':'zxcvbnm,./', 'x':w*2.4, 'y':mainy+(w*3)},
|
||||
{'c':' ', 'x':w, 'y':mainy+(w*4)}
|
||||
]
|
||||
|
||||
keys = {}
|
||||
for row in rows:
|
||||
for ki in range(len(row['c'])):
|
||||
k = row['c'][ki]
|
||||
keys[k] = (row['x'] + ((self.keywidth + self.keyspace) * ki), row['y'])
|
||||
return keys
|
||||
|
||||
def build_qwerty(self):
|
||||
w = self.keywidth
|
||||
for k in self.keys:
|
||||
x = self.keys[k][0]
|
||||
y = self.keys[k][1]
|
||||
self.keys[k] = self.c.create_rectangle(x, y, x+w, y+w)
|
||||
self.c.create_text(x+(w/2), y+(w/2), text=k)
|
||||
|
||||
|
||||
|
||||
k = Keyboard()
|
||||
k.mainloop()
|
|
@ -4,5 +4,5 @@ TKDraw
|
|||
Unfortunately, there's no TKErase ...
|
||||
|
||||
<p align="center">
|
||||
<img src="https://github.com/voussoir/else/blob/master/.GitImages/tkdraw.png?raw=true" alt="ASCII"/>
|
||||
<img src="https://github.com/voussoir/else/blob/master/.GitImages/tkdraw.png?raw=true" alt="tkdraw"/>
|
||||
</p>
|
Loading…
Reference in New Issue