any one of a set of parts or units that are made separately and can be joined together to construct a building or piece of furniture.
別個に作られ、組み合わせて建物や家具の一部を構成することができる、パーツ(部品)またはユニット(部材)のセットの任意の1つ。
(Oxford Advanced Learner's Dictionary of Current English, Fifth Edition)
bgmodules
├ bgpieces
├ board.py
├ color.py
├ die.py
├ piece.py
└ worker.py
├ boardgame
├ eventtype.py
├ game.py
├ player.py
├ proc.py
├ procendgame.py
├ procstartgame.py
├ rules.py
└ table.py
├ cardgame ※展開略
└ playingcards ※展開略
class Board():
'''ボードゲームのボードを表すクラス。
大きさは問わない。物を配置するスペースは必須で、名前(種類)は任意で、それぞれ持つ。
:param dict spaces: 物を配置するスペースの辞書。各スペースの型は任意で、デフォルトのコレクションでも独自クラスでもよい。
:param str name: ボードの名前。設定しなくてもよい。'''
def __init__(self, spaces:dict, name:str=None):
'''スペースの辞書と、名前(種類)をセットする。'''
self.spaces:dict = spaces
self.name:str = name
from enum import Enum
class Color(str, Enum):
'''ゲーム内の色を表す、strをmixinした列挙型。コンポーネントやプレイヤーの色に使う。'''
WHITE = 'WHITE'
BLACK = 'BLACK'
BLUE = 'BLUE'
YELLOW = 'YELLOW'
RED = 'RED'
GREEN = 'GREEN'
PINK = 'PINK'
PURPLE = 'PURPLE'
SKYBLUE = 'SKYBLUE'
def names():
'''列挙名の一覧を文字列のイテラブルで返す。'''
return Color.__members__
def items():
'''列挙したEnum値の一覧をイテラブルで返す。'''
return Color._member_map_.values()
def values():
'''列挙したEnum値の、実際の値の一覧をリストで返す。'''
return [c.value for c in Color._member_map_.values()]
# テスト
if __name__ == '__main__':
# Enumオブジェクトの文字列表現と、オブジェクト自体のペアを列挙
# タプルの左側は実際の値ではなく、左辺の変数名がstrになって返されている
for c in Color._member_map_.items():
print(c)
# 文字列表現のみ
for c in Color.names():
print(c)
# Enumオブジェクトのみ
for c in Color.items():
print(c)
# 値のみ
for c in Color.values():
print(c)
from bgpieces.color import Color
class Piece():
'''ボードゲームのコマを表すクラス。
大きさは問わない。色、値、名前(種類)を任意で持ってもよい。値、名前(種類)はどの型でもよい。'''
def __init__(self, color:Color=None, value=None, name=None):
'''色、値、名前(種類)をセットする。'''
self.color:Color = color
self.value = value
self.name = name
import numpy as np
from bgpieces.piece import Piece
from bgpieces.color import Color
class Die(Piece):
'''ダイスのクラス。値、面数、色を持つ。デフォルトでは1~6の6面ダイスになる。'''
def __init__(self, value:int=1, sides:int=6, color:Color=Color.WHITE):
'''初期値を設定し、乱数生成器を初期化する。
:param int value: ダイスの示す値。
:param int sides: ダイスの面数。
:param Color color: ダイスの色。ゲームに使わなければデフォルトのままでよい。'''
super().__init__(color=color, value=value, name='die')
self.sides = sides
self.rng = np.random.default_rng()
def roll(self)->int:
'''ダイスを振り、値を「1~面数のあいだの整数」でランダムに更新して返す。'''
self.value = self.rng.choice(self.sides) + 1
return self.value
def flip(self)->int:
'''ダイスを裏返す。6面ダイスの場合のみ裏返して値を返し、それ以外のダイスではNoneを返す。'''
if self.sides == 6:
self.value = 7 - self.value
return self.value
else:
return None
# テスト
if __name__ == '__main__':
die = Die()
print(f'ROLL: {die.roll()}')
print(f'FLIP: {die.flip()}')
from bgpieces.die import Die
class ChaoChaoDie(Die):
'''チャオチャオのダイスのクラス。6面ダイスで、×の2面が対面、残り4面は1~4で表裏の和が5になる。'''
def roll(self)->int:
'''ダイスを振り、値をランダムに更新して返す。×は0を返す。'''
self.value = self.rng.choice([1, 2, 3, 4, 0, 0])
return self.value
def flip(self)->int:
'''ダイスを裏返し、値を更新して返す。'''
if self.value > 0:
self.value = 5 - self.value
return self.value
# テスト
if __name__ == '__main__':
die = ChaoChaoDie()
print(f'ROLL: {die.roll()}')
print(f'FLIP: {die.flip()}')
from enum import IntEnum
from bgpieces.piece import Piece
from bgpieces.color import Color
class WorkerSize(IntEnum):
'''ワーカーの大小を定義する列挙型。'''
BIG = 3
MEDIUM = 2
SMALL = 1
class Worker(Piece):
'''ワーカーのクラス。色と大きさを持たせる。'''
def __init__(self, color:Color, size:WorkerSize=WorkerSize.SMALL):
super().__init__(color)
self.size = size
←No.55 PC/スマホの一人回し用アプリの作り方(1日目)
コラム一覧へ トップページへ