Skip to content

Commit

Permalink
demo update
Browse files Browse the repository at this point in the history
  • Loading branch information
wang0618 committed Aug 8, 2021
1 parent 4a5fa81 commit d0482b9
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 26 deletions.
50 changes: 25 additions & 25 deletions demos/gomoku_game.py
Original file line number Diff line number Diff line change
@@ -1,43 +1,43 @@
"""
Online Shared Gomoku Game
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
All online players are divided into two roles (black and white) and play same Gomoku game together.
All online players are assigned to two groups (black and white) and play same Gomoku game together.
:demo_host:`Demo </gomoku_game>`, `Source code <https://github.com/wang0618/PyWebIO/blob/dev/demos/gomoku_game.py>`_
"""
import pywebio, time
from pywebio.output import *
from pywebio.session import *

chessboard_size = 15
goboard_size = 15
# -1 -> none, 0 -> black, 1 -> white
chessboard = [
[-1] * chessboard_size
for _ in range(chessboard_size)
goboard = [
[-1] * goboard_size
for _ in range(goboard_size)
]

def winner(): # return winner piece, return None if no winner
for x in range(2, chessboard_size - 2):
for y in range(2, chessboard_size - 2):
for x in range(2, goboard_size - 2):
for y in range(2, goboard_size - 2):
# check if (x,y) is the win center
if chessboard[x][y] != -1 and any([
all(chessboard[x][y] == chessboard[m][n] for m, n in [(x - 2, y), (x - 1, y), (x + 1, y), (x + 2, y)]),
all(chessboard[x][y] == chessboard[m][n] for m, n in [(x, y - 2), (x, y - 1), (x, y + 1), (x, y + 2)]),
all(chessboard[x][y] == chessboard[m][n] for m, n in [(x - 2, y - 2), (x - 1, y - 1), (x + 1, y + 1), (x + 2, y + 2)]),
all(chessboard[x][y] == chessboard[m][n] for m, n in [(x - 2, y + 2), (x - 1, y + 1), (x + 1, y - 1), (x + 2, y - 2)]),
if goboard[x][y] != -1 and any([
all(goboard[x][y] == goboard[m][n] for m, n in [(x - 2, y), (x - 1, y), (x + 1, y), (x + 2, y)]),
all(goboard[x][y] == goboard[m][n] for m, n in [(x, y - 2), (x, y - 1), (x, y + 1), (x, y + 2)]),
all(goboard[x][y] == goboard[m][n] for m, n in [(x - 2, y - 2), (x - 1, y - 1), (x + 1, y + 1), (x + 2, y + 2)]),
all(goboard[x][y] == goboard[m][n] for m, n in [(x - 2, y + 2), (x - 1, y + 1), (x + 1, y - 1), (x + 2, y - 2)]),
]):
return ['⚫', '⚪'][chessboard[x][y]]
return ['⚫', '⚪'][goboard[x][y]]

session_id = 0 # auto incremented id for each session
current_turn = 0 # 0 for black, 1 for white
player_count = [0, 0] # count of player for two roles
def main():
"""Online Shared Gomoku Game
All online players are divided into two roles (black and white) and share this game."""
global session_id, current_turn, chessboard
A web based Gomoku (AKA GoBang, Five in a Row) game made with PyWebIO under 100 lines of Python code."""
global session_id, current_turn, goboard
if winner(): # The current game is over, reset game
chessboard = [[-1] * chessboard_size for _ in range(chessboard_size)]
goboard = [[-1] * goboard_size for _ in range(goboard_size)]
current_turn = 0

my_turn = session_id % 2
Expand All @@ -53,33 +53,33 @@ def player_exit():
put_html("""<style> table th, table td { padding: 0px !important;} button {padding: .75rem!important; margin:0!important} </style>""") # Custom styles to make the board more beautiful

put_markdown(f"""# Online Shared Gomoku Game
All online players are divided into two roles (black and white) and share this game. You can open this page in multiple tabs of your browser to simulate multiple users.
All online players are assigned to two groups (black and white) and share this game. \nYou can open this page in multiple tabs of your browser to simulate multiple users.
This application uses less than 100 lines of code, the source code is [here](https://github.com/wang0618/PyWebIO/blob/dev/demos/gomoku_game.py)
Currently online player: {player_count[0]} for ⚫, {player_count[1]} for ⚪.
Your role is {my_chess}.
""", lstrip=True)

def set_chess(pos):
def set_stone(pos):
global current_turn
if current_turn != my_turn:
toast("It's not your turn!!", color='error')
return
x, y = pos
chessboard[x][y] = my_turn
goboard[x][y] = my_turn
current_turn = (current_turn + 1) % 2

@use_scope('chessboard', clear=True)
def show_chessboard():
@use_scope('goboard', clear=True)
def show_goboard():
table = [
[
put_buttons([dict(label=' ', value=(x, y), color='light')], onclick=set_chess) if cell == -1 else [' ⚫', ' ⚪'][cell]
put_buttons([dict(label=' ', value=(x, y), color='light')], onclick=set_stone) if cell == -1 else [' ⚫', ' ⚪'][cell]
for y, cell in enumerate(row)
]
for x, row in enumerate(chessboard)
for x, row in enumerate(goboard)
]
put_table(table)

show_chessboard()
show_goboard()
while not winner():
with use_scope('msg', clear=True):
current_turn_copy = current_turn
Expand All @@ -89,7 +89,7 @@ def show_chessboard():
put_row([put_text("Your opponent's turn, waiting... "), put_loading().style('width:1.5em; height:1.5em')], size='auto 1fr')
while current_turn == current_turn_copy: # wait for next move
time.sleep(0.2)
show_chessboard()
show_goboard()
with use_scope('msg', clear=True):
put_text('Game over. The winner is %s!\nRefresh page to start a new round.' % winner())

Expand Down
2 changes: 1 addition & 1 deletion demos/markdown_previewer.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ def main():
The online markdown editor with live preview. The source code of this application is [here](https://github.com/wang0618/PyWebIO/blob/dev/demos/markdown_previewer.py).
## Write your Markdown
""", lstrip=True)
put_textarea('md_text', rows=18, code=True)
put_textarea('md_text', rows=18, code={'mode': 'markdown'})

put_buttons(['Download content'], lambda _: download('saved.md', pin.md_text.encode('utf8')), small=True)

Expand Down

0 comments on commit d0482b9

Please sign in to comment.