summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--__main__.py110
-rw-r--r--app.py18
-rw-r--r--tui/__init__.py2
-rw-r--r--tui/static.py33
4 files changed, 97 insertions, 66 deletions
diff --git a/__main__.py b/__main__.py
index 902d92b..8f60946 100644
--- a/__main__.py
+++ b/__main__.py
@@ -3,71 +3,99 @@ import sys
from argparse import ArgumentParser
from app import App
+from tui import KEY_DESCRIPTIONS
+
parser = ArgumentParser(
prog='miinaharava',
description='Klassisen miinaharavapelin terminaali toteutus.',
+ add_help=False
)
-parser.add_argument(
+level_group = parser.add_argument_group('Vaikeustaso')
+level_group.add_argument(
'-i', '--intermediate',
- help='Asettaa keskivaikean vaikeustaso (oletus on aloittelija)',
+ help='keskivaikea (oletus on aloittelija)',
action='store_true'
)
-parser.add_argument(
+level_group.add_argument(
'-e', '--expert',
- help='Asettaa edistyneen vaikeustason (vaatii 100 merkkiä leveän terminaalin)',
+ help='edistynyt (vaatii 100 merkkiä leveän terminaalin)',
action='store_true'
)
-parser.add_argument(
- '-s', '--simple',
- help='Käytä yksinkertaisempaa vain yhtä pistettä tutkivaa bottia',
- action='store_true'
+
+
+custom_group = parser.add_argument_group('Mukautettu vaikeustaso')
+def board_size(wxh_string):
+ """ parser for dimensions. throws error on bad input"""
+ w, h = wxh_string.split('x')
+ return (int(w), int(h))
+custom_group.add_argument(
+ '-s', '--size',
+ metavar='<S>',
+ type= board_size,
+ dest='size',
+ help='Pelikentän koko, missä <S> on {leveys}x{korkeus}.'
+)
+custom_group.add_argument(
+ '-m', '--mines',
+ metavar='<M>',
+ type=int,
+ dest='mines',
+ help='Säätää pelilaulla olevien pommien määrän <M>:ksi.',
)
-parser.add_argument(
+
+
+hint_group = parser.add_argument_group('Tekoäly')
+hint_group.add_argument(
'-a', '--auto',
- help='Antaa botin pelata automaattisesti',
- action='store_true'
+ dest='autoplay',
+ default=0,
+ action='count',
+ help='Pelaa tekoälyn vihjeet. [-aa] Pelaa myös epävarmat.'
)
-parser.add_argument(
- '-u', '--uncertain',
- help='Antaa botille luvan tehdä myös epävarmoja valintoja (asettaa myös -a asetuksen)',
- action='store_true'
+hint_group.add_argument(
+ '-b', '--bot', metavar='<B>',
+ choices=range(2),
+ type=int,
+ default=2,
+ help='Valitsee tekoälyn <B>, missä: 0: Ei tekoälyä 1: Yksinkertainen, 2: DSSP (oletus)',
)
-parser.add_argument(
+
+batch_group = parser.add_argument_group('Automatisointi')
+batch_group.add_argument(
'-q', '--quiet',
- help='Tulostaa minimaalisesti (asettaa myös -a ja -u asetukset)',
+ help='Tulostaa minimaalisesti (asettaa myös [-aa])',
action='store_true'
)
-parser.add_argument(
- '-c',
- metavar='COUNT',
+batch_group.add_argument(
+ '-c', '--count',
+ metavar='<C>',
type=int,
dest='count',
- help='Suorittaa ohelmaa COUNT kertaa ja tulostaa voitto-osuuden.',
-)
-parser.add_argument(
- '-w',
- metavar='WIDTH',
- type=int,
- dest='width',
- help='Mukautaa pelilaudan leveydelle WIDTH. (resetoi vaikeustason)',
+ help='Suorittaa ohelmaa <C> kertaa ja tulostaa voitto-osuuden.',
)
-parser.add_argument(
- '-H',
- metavar='HEIGHT',
- type=int,
- dest='height',
- help='Mukautaa pelilaudan korkeudelle HEIGTH. (resetoi vaikeustason)',
+
+misc_group = parser.add_argument_group('Sekalaista')
+misc_group.add_argument(
+ '-h', '--help',
+ help='Tulostaa tämän viestin',
+ action='store_true'
)
-parser.add_argument(
- '-m',
- metavar='MINES',
- type=int,
- dest='mines',
- help='Säätää pelilaulla olevien pommien määrän MINES:ksi. (resetoi vaikeustason)',
+misc_group.add_argument(
+ '-k', '--keys',
+ help='Tulostaa pelin näppäinkartan.',
+ action='store_true'
)
args = parser.parse_args()
+if args.help:
+ parser.print_help()
+ sys.exit()
+
+if args.keys:
+ print(end=KEY_DESCRIPTIONS)
+ sys.exit()
+
if args.count is None:
app = App(args)
is_win = app.run()
@@ -77,7 +105,7 @@ if args.count is None:
win_count = 0
run_count = args.count
-args.uncertain=True
+args.autoplay = 2
for i in range(run_count):
print(end=f" \rSuoritus {i+1:>6}/{run_count} ")
print(end=f"({100*win_count/(i if i else 1):.1f}%)..")
diff --git a/app.py b/app.py
index 0dfef0a..b82bf57 100644
--- a/app.py
+++ b/app.py
@@ -1,5 +1,5 @@
""" app.py - pääohjelma """
-from board import Board, Level, LevelSpecs
+from board import Board, Level
from tui import Tui
from game import Game
from bots import SimpleBot, DSSPBot
@@ -14,18 +14,20 @@ class App:
# pylint: disable = multiple-statements
if args.intermediate: board_opts['level'] = Level.INTERMEDIATE
if args.expert: board_opts['level'] = Level.EXPERT
- if args.width: board_opts['width'] = args.width
- if args.height: board_opts['height'] = args.height
if args.mines: board_opts['mines'] = args.mines
+ if args.size:
+ board_opts['width'] = args.size[0]
+ board_opts['height'] = args.size[1]
- if args.simple: tui_opts['bot'] = SimpleBot
- tui_opts['autoplay'] = args.auto
- tui_opts['interactive'] = not args.uncertain
+ if args.bot==0: tui_opts['bot'] = None
+ if args.bot==1: tui_opts['bot'] = SimpleBot
+ tui_opts['autoplay'] = args.autoplay > 0
+ tui_opts['interactive'] = args.autoplay != 2
tui_opts['suppress'] = args.quiet
- tui_opts['height'] = LevelSpecs[board_opts['level']][1]
self.board = Board(**board_opts)
- tui_opts['level_name']=self.board.get_level_name()
+ tui_opts['level_name'] = self.board.get_level_name()
+ tui_opts['height'] = self.board.get_height()
self.ui = Tui(**tui_opts)
self.game = Game(self.board,self.ui)
diff --git a/tui/__init__.py b/tui/__init__.py
index c1c5b91..0c8d632 100644
--- a/tui/__init__.py
+++ b/tui/__init__.py
@@ -1,3 +1,3 @@
""" tui - hoitaa käyttäjälle katseltavaa ja havaitsee syötteet """
from .tui import Tui
-from .static import Action
+from .static import Action, KEY_DESCRIPTIONS
diff --git a/tui/static.py b/tui/static.py
index fba5525..60442c0 100644
--- a/tui/static.py
+++ b/tui/static.py
@@ -30,24 +30,25 @@ ActionKeys = {
"\033[": Action.NOOP, "\033": Action.QUIT, "t": Action.SAFE,
"w": Action.UP, "a": Action.LEFT, "s": Action.DOWN,
"d": Action.RIGHT, " ": Action.OPEN, "\n": Action.OPEN,
- "f": Action.FLAG, "m": Action.FLAG, "q": Action.QUIT,
- "p": Action.MINE, "x": Action.MINE, "o": Action.SAFE,
- "l": Action.QUIT, "?": Action.HINT, "b": Action.HINT
+ "l": Action.QUIT, "?": Action.HINT, "b": Action.HINT,
+ "f": Action.FLAG, "q": Action.QUIT, "m": Action.MINE,
+ "\t": Action.FLAG, "9": Action.MINE, "0": Action.SAFE
}
-KEY_DESCRIPTIONS = """
-Liikkuminen:
- YLÖS,ALAS,VASEN,OIKEA,PGDN,PGUP,HOME,END,w,a,s,d
-Merkitseminen:
- m - merkitse
- p,x - pommi
- t,o - turvallinen
-Avaaminen:
- ENTER, SPACE
-Vinkki:
- ?, b - pyydä botilta vihje
-Lopetus:
- l,q,ESC
+KEY_DESCRIPTIONS = """Näppäinasettelu:
+
+ YLÖS, ALAS, VASEN, OIKEA, PGDN, PGUP, HOME, END, w, a, s, d
+ Kursorin liikuttaminen pelilaudalla
+
+ ENTER, SPACE Avaa laatta
+
+ f, TAB Vaihda laatan merkintää
+ m, 9 Merkitse miinaksi
+ t, 0 Merkitse turvalliseksi
+
+ ?, b Vihje tekoälyltä
+
+ l, q, ESC Pelin lopetus
"""
@dataclass