feat: improve mastermin usability
This commit is contained in:
parent
4b5650555b
commit
6821f1e09c
2 changed files with 46 additions and 22 deletions
|
@ -5,7 +5,10 @@
|
|||
<meta http-equiv="refresh" content="3" />
|
||||
{% endif %}
|
||||
<style>
|
||||
td {
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
td.board {
|
||||
background: #444444;
|
||||
padding: 7pt;
|
||||
}
|
||||
|
@ -45,7 +48,8 @@
|
|||
<table border="0">
|
||||
{% if done %}
|
||||
<tr>
|
||||
<td>{{ attempt(solution) }}</td>
|
||||
<td>Solution</td>
|
||||
<td class="board">{{ attempt(solution) }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
<tr>
|
||||
|
@ -60,11 +64,11 @@
|
|||
{% for i in range(turn) %}
|
||||
<tr>
|
||||
<td>{{ i+1 }}</td>
|
||||
<td>{% if attempts | length >= i+1 %}{{ attempt(attempts[i]) }}{% endif %}</td>
|
||||
<td>{% if responses[player] | length >= i+1 %}{{ response(responses[player][i], false) }}{% endif %}</td>
|
||||
<td class="board">{% if attempts | length >= i+1 %}{{ attempt(attempts[i]) }}{% endif %}</td>
|
||||
<td class="board">{% if responses[player] | length >= i+1 %}{{ response(responses[player][i], false) }}{% endif %}</td>
|
||||
{% for p in players.values() %}
|
||||
{% if p.uuid == player %}{% continue %}{% endif %}
|
||||
<td>{% if responses[p.uuid] | length >= i+1 %}{{ response(responses[p.uuid][i], true) }}{% endif %}</td>
|
||||
<td class="board">{% if responses[p.uuid] | length >= i+1 %}{{ response(responses[p.uuid][i], true) }}{% endif %}</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
|
@ -74,7 +78,9 @@
|
|||
{% if winners | length == 0 %}
|
||||
Nobody won
|
||||
{% else %}
|
||||
{{ winners | join(', ') }} won!
|
||||
{% for w in winners %}
|
||||
{{ players[w].name }}{% if not loop.last %}, {% endif %}
|
||||
{% endfor %} won!
|
||||
{% endif %}
|
||||
Game Over! <a href="{{ baseurl }}/{{ player }}">Return to lobby</a>
|
||||
{% elif player not in played %}
|
||||
|
@ -91,11 +97,11 @@
|
|||
</form>
|
||||
<div id="colorlist">
|
||||
{% for c in colors %}
|
||||
<span draggable="true" clickable="true" onclick="click(event, '{{ c.value.name }}', '{{ c.value.html }}')" ondragstart="drag(event, '{{ c.value.name }}', '{{ c.value.html }}')" style="color: {{ c.value.html }};">⬤</span>
|
||||
<span class="clickdrag" draggable="true" clickable="true" data-name="{{ c.value.name }}" data-color="{{ c.value.html }}" ondragstart="drag(event, '{{ c.value.name }}', '{{ c.value.html }}')" style="color: {{ c.value.html }};">⬤</span>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<script>
|
||||
let labels = document.getElementsByTagName('label');
|
||||
let labels = Array.from(document.getElementsByTagName('label'));
|
||||
for (let select of document.getElementsByTagName('select')) {
|
||||
select.style.display = 'none';
|
||||
}
|
||||
|
@ -121,12 +127,20 @@
|
|||
}
|
||||
|
||||
function click(e, name, color) {
|
||||
console.log(name);
|
||||
labels[i].style.color = color;
|
||||
document.getElementById(labels[i].getAttribute('for')).value = name;
|
||||
labels[i].classList.remove('clickselect');
|
||||
i = (i+1) % 4;
|
||||
labels[i].classList.add('clickselect');
|
||||
}
|
||||
document.onclick= e => {
|
||||
if (e.target.classList.contains('clickdrag')) {
|
||||
e.preventDefault();
|
||||
console.log('hi');
|
||||
click(e, e.target.getAttribute('data-name'), e.target.getAttribute('data-color'));
|
||||
}
|
||||
};
|
||||
</script>
|
||||
{% else %}
|
||||
Please wait for the other players to finish their turn!
|
||||
|
|
|
@ -15,15 +15,15 @@ class _Color:
|
|||
|
||||
|
||||
class Color(enum.Enum):
|
||||
NONE = _Color('none', '#000000', '\033[30m')
|
||||
RED = _Color('red', '#ff0000', '\033[31m')
|
||||
GREEN = _Color('green', '#00aa00', '\033[32m')
|
||||
BLUE = _Color('blue', '#0000ff', '\033[34m')
|
||||
YELLOW = _Color('yellow', '#ffff00', '\093[33m')
|
||||
WHITE = _Color('white', '#dddddd', '\033[97m')
|
||||
GREY = _Color('grey', '#888888', '\033[90m')
|
||||
PINK = _Color('pink', '#ff0088', '\033[95m')
|
||||
ORANGE = _Color('orange', '#ff8800', '\033[95m')
|
||||
NONE = _Color('None', '#000000', '\033[30m')
|
||||
RED = _Color('Red', '#ff0000', '\033[31m')
|
||||
GREEN = _Color('Green', '#00aa00', '\033[32m')
|
||||
BLUE = _Color('Blue', '#0000ff', '\033[34m')
|
||||
YELLOW = _Color('Yellow', '#ffff00', '\093[33m')
|
||||
WHITE = _Color('White', '#dddddd', '\033[97m')
|
||||
GREY = _Color('Grey', '#888888', '\033[90m')
|
||||
PINK = _Color('Pink', '#ff0088', '\033[95m')
|
||||
ORANGE = _Color('Orange', '#ff8800', '\033[95m')
|
||||
|
||||
|
||||
class ResponseColor(enum.Enum):
|
||||
|
@ -53,6 +53,7 @@ class Mastermind(Puzzle):
|
|||
self._turn = 0
|
||||
self._max_turn = 12
|
||||
self._done = False
|
||||
self._allow_empty = False
|
||||
self._urlbase = '/'
|
||||
|
||||
def add_player(self, uuid: UUID) -> None:
|
||||
|
@ -71,12 +72,13 @@ class Mastermind(Puzzle):
|
|||
def begin(self, options, urlbase):
|
||||
self._urlbase = urlbase
|
||||
colors = list(Color)
|
||||
if 'empty' not in options.getall('rules'):
|
||||
self._allow_empty = 'empty' in options.getall('rules')
|
||||
if not self._allow_empty:
|
||||
colors = colors[1:]
|
||||
if 'repeat' in options.getall('rules'):
|
||||
self._solution = random.choices(colors, 4)
|
||||
self._solution = random.choices(colors, k=4)
|
||||
else:
|
||||
self._solution = random.sample(colors, 4)
|
||||
self._solution = random.sample(colors, k=4)
|
||||
self._turn = 1
|
||||
|
||||
def next_turn(self):
|
||||
|
@ -89,11 +91,16 @@ class Mastermind(Puzzle):
|
|||
# get counted as correct a second time.
|
||||
solution = [x for x in self._solution]
|
||||
response = []
|
||||
checked = [False] * 4
|
||||
for i, a in enumerate(attempt):
|
||||
if a == self._solution[i]:
|
||||
response.append(ResponseColor.RED)
|
||||
solution.remove(a)
|
||||
elif a in solution:
|
||||
checked[i] = True
|
||||
for i, a in enumerate(attempt):
|
||||
if checked[i]:
|
||||
continue
|
||||
if a in solution:
|
||||
response.append(ResponseColor.WHITE)
|
||||
solution.remove(a)
|
||||
else:
|
||||
|
@ -116,7 +123,10 @@ class Mastermind(Puzzle):
|
|||
a2 = Color[action.get('attempt2', 'NONE').upper()]
|
||||
a3 = Color[action.get('attempt3', 'NONE').upper()]
|
||||
a4 = Color[action.get('attempt4', 'NONE').upper()]
|
||||
self._attempts[puuid].append([a1, a2, a3, a4])
|
||||
attempt = [a1, a2, a3, a4]
|
||||
if not self._allow_empty and Color.NONE in attempt:
|
||||
return
|
||||
self._attempts[puuid].append(attempt)
|
||||
self._played.add(puuid)
|
||||
except BaseException as e:
|
||||
print(e)
|
||||
|
|
Loading…
Reference in a new issue