Nocca NoccaãPythonã§çµã
- 2020.11.22
- ããã°ã©ãã³ã°
- Nocca Nocca, Python, ããŒãã²ãŒã

ãä¹ ãã¶ãã§ãïŒ
æè¿ãå®¶ã«åž°ã£ãŠãNetflixã§éãã©ã°ã£ããèŠãŠããŸããé¢çœãã§ãããéãã©ã
ä»åã¯ããŒãã²ãŒã ãNocca NoccaããPythonã§çµãããšãèããŸãã
Nocca Noccaãšã¯ïŒ
ããããããNocca Noccaãšã¯ãªãããïŒããšãã人ããããšãããŸãã
Nocca Noccaãšã¯ããŒãã²ãŒã ã®äžçš®ã§ããã®ãããªãã®ã§ãïŒããã«ããã«ã®ã«ãŒã«/ã€ã³ã¹ã by ããïœããŒãã²ãŒã æ å ±ããïŒ
ã²ãŒã ã®é²ãæ¹
- ãžã£ã³ã±ã³çãã奜ããªæ¹æ³ã§å æã決ããŸãã
- 亀äºã«1ã³ãã¥ã€ç§»åãããŠãããŸã
ïŒå°æ£ã»ãã§ã¹ãªã©ãšåãããã«ïŒã - ã³ãã¯ãååŸå·Šå³æããžã1ãã¹ç§»åãããããšãã§ããŸãã
- ãã¹ãŠã®ã³ãã¯åãåããåºæ¥ãŸãã
- ç§»åå ã®ãã¹ç®ã«çžæã®ã³ãããããã¯èªåã®ã³ãããããšããçžæã®ã³ãããããã¯èªåã®ã³ãã®äžã«èªåã®ã³ãã眮ãããšãã§ããŸããããããä¹ã£ããããšåŒã³ãŸããïŒãã¡ããä¹ããªããŠãæ§ããŸããïŒ
- ä¹ã£ããããŠããã³ããåããããšã¯ã§ããŸããã
- ä¹ã£ãã£ãŠããã³ãã¯ãéåžžéãé£ã®ãã¹ãžç§»åããããšãã§ããŸãã
- ä¹ã£ãã£ãŠããã³ãã«ä¹ã£ããããšãã§ããŸãã
- ã³ãã®éãªãã¯ïŒæ®µãŸã§ã4段ç®ã«ä¹ã£ããäºã¯ã§ããŸããã
ã²ãŒã ã®ç®çã»çµäº
- èªåã®ã³ãã®ãã¡ã©ãã1ã€ãçžæã®ãŽãŒã«ã«äŸµå ¥ããã°åå©ã§ãã
- ã»ãšãã©ç¡ããã¿ãŒã³ã§ãããå šãŠã®ã³ãã«ä¹ã£ããããŠããŸããåããã³ãããªããã°ããã®æç¹ã§è² ããšãªããŸãã
ãšãããããããå®è£ ããŠãããŸãããïŒ
ãªããã®ã²ãŒã ãªã®ã
ãã®ååäººå® ã§é£²ã¿äŒãéãããšãã«ããã²ãŒã ããæãé¢çœããã ã£ããããçµãã§ã¿ããããšãã軜ãããªã§ãã
å®è£
å¿ èŠãªãã®
- Python 3
ä»åã¯ããã©ç¶æ ã®Pythonã§ãåããŸãããšãããããããªã«é«çŽãªã©ã€ãã©ãªãŒãå°å ¥ããªããŠãçµããŸãã
ãã®ã²ãŒã ã®è»œãã«ãŒã«ãåãã£ãŠããã°ãæèŠæéãšããŠã¯1æéããããããããªãããããã§ããå®éç§ã¯ã«ãŒã«ãææ§ã ã£ãã®ã§ãå ã»ã©ã®ãªã³ã¯ã§èª¿ã¹ãªããæžããŠããŸããç¬
ããŒãã®å®çŸ©
ãŸãã¯ããŒããå®çŸ©ããŠãããŸãã
ããŒãèªäœã¯6è¡5åã§ãããåã»ã«ã«ã¯ç³ãç©ãããšããããšã§ãèŠçŽ èªäœã«é åãçšæããªããšãããŸããã
ãã©ããã¹ã¿ãã¯ã䜿ãããã ãã[None]*3ã®é
åãªããŠçšæããå¿
èŠãªããªããšæã£ãã®ã§ãåèŠçŽ ã«ã¯ç©ºã®é
å[]ãå
¥ããŠããŸãã
BLACK = 0
WHITE = 1
class NoccaNocca(object):
def __init__(self):
self.init_board()
def init_board(self):
self.board = [[[] for _ in range(5)] for _ in range(6)]
for j in range(5):
self.board[0][j].append(BLACK)
self.board[5][j].append(WHITE)
def main():
n = NoccaNocca()
if __name__ == '__main__':
main()
ããŒãã²ãŒã ãPythonã§å®è£
ãããšãã«ããããåé¡ãšããŠãPythonã¯é
åãªã©ãsharrow copyããããªããšããåé¡ã§ãããªã®ã§[[[]*5]*6]ãšã¯ããã«äžã®ã³ãŒãã®ããã«[[[] for _ in range(5)] for _ in range(6)]ãšããå¿
èŠããããŸãã
ãŸããæåã«ç³ãé 眮ããªããšãããªãã®ã§ããã®éšåãforæã§çšæããããšãšããŸãã
ããã«ãå
è¡ãé»ã®ç³BLACKãšããããšã«ããŸãããå¥ã«ã©ã¡ããå
ã§ãåé¡ã¯ãªãã§ãã
ããŒãã®äžèº«ãèŠããããã
ãã®ãŸãŸã ãšself.boardã®äžèº«ãèŠããããªãã®ã§ãprint_board()ãšããŠå®çŸ©ããŸãã
class NoccaNocca(object):
###
def print_board(self):
print('{turn}\'s turn.'.format(
turn={
BLACK: 'BLACK',
WHITE: 'WHITE'
}[self.turn]
))
print('i\j|', end='')
print(' '.join(map(str, range(5))))
print('---+', end='')
print('-' * 5 * 4)
for i in range(6):
print('{i} |'.format(
i=i
), end='')
print(' '.join(map(lambda j: ''.join(map(str, self.board[i][j])) + '_' * (3-len(self.board[i][j])), range(5))))
###
def main():
n = NoccaNocca()
n.print_board()
CUIã§ç³ã3段éãªãããã«èŠããã¯å°ã
倧å€ã§ãããmap()ãšjoin()ãé§äœ¿ããŠå°ãã§ãèŠãããããã«ããŸãã
ãããå®è¡ãããšããã®ããã«ãªããŸãã
BLACK's turn.
i\j|0 1 2 3 4
---+-------------------
0 |0__ 0__ 0__ 0__ 0__
1 |___ ___ ___ ___ ___
2 |___ ___ ___ ___ ___
3 |___ ___ ___ ___ ___
4 |___ ___ ___ ___ ___
5 |1__ 1__ 1__ 1__ 1__ããã£ãœã衚瀺ãããŸããïŒ
座æšã®å ¥å
次ã«å¿ èŠã«ãªãã®ã座æšã®å ¥åéšåã§ãã
import itertools
###
class NoccaNocca(object):
def __init__(self):
self.init_board()
self.is_continuing = True
self.turn = BLACK
self.i = None
self.j = None
self.set_valid_ij_li()
###
def set_valid_ij_li(self):
self.valid_ij_li = [(i, j) for i, j in itertools.product(range(6), range(5)) if len(self.board[i][j]) > 0 and self.board[i][j][-1] == self.turn]
def select_ij(self, i: range(6), j: range(5)) -> bool:
if (i, j) not in self.valid_ij_li:
return False
self.i = i
self.j = j
return True
def main():
n = NoccaNocca()
n.print_board()
while n.is_continuing:
while True:
i, j = map(int, input('which stone? [(i j)â{status}]: '.format(
status=', '.join(map(lambda ij: str(ij).replace(',', ' '), n.valid_ij_li))
)).split(' '))
if n.select_ij(i, j):
break
set_valid_ij_li()ã§æå¹ã§ããåº§æšæå®ãã»ãããããã®äžããéžã°ããããšããŠããŸãã
é©åãªå€ãšãªã£ãŠããªãå Žåã¯ãFalseãè¿ãããã«ãªã£ãŠããŸãã
æå®ãã座æšãæå¹ã§ããå Žåã¯class倿°ã«çµã¿èŸŒã¿ãŸãïŒå¥ã«ããããªããŠãè¯ããããããªãããããããåºåããŠãŸãå ¥åããŠããšããããšã¯ããããªãã®ã§ããããïŒ
æ¹åã®å ¥å
次ã«åº§æšãæå®ããããæ¹åã«é¢ããéšåãå¿ èŠã«ãªã£ãŠããŸãã
Nocca Noccaã§ã¯ç«¯ãé€ãã«8æ¹åã«é²ããŸãããã®ãã端ãé€ãããã«å®è£ ããå¿ èŠããããŸãã
ãŸããNocca Noccaã§ã¯ç³ã3ã€ãŸã§ããç©ããªããšããå¶çŽãããããšãããæå®ãã座æšã«ããç³ã®æ°ã3ãšãªã£ãŠããå Žåã¯ç¡å¹ã«ãªãããã«èšèšããŸãã
###
class NoccaNocca(object):
def __init__(self):
self.init_board()
self.is_continuing = True
self.turn = BLACK
self.i = None
self.j = None
self.direction = None
self.set_valid_ij_li()
###
def select_ij(self, i: range(6), j: range(5)) -> bool:
if (i, j) not in self.valid_ij_li:
return False
self.i = i
self.j = j
self.set_valid_directions()
return True
def select_direction(self, direction: str) -> bool:
if direction not in self.valid_directions:
return False
self.direction = direction
return True
def set_valid_directions(self):
self.valid_directions = 'hjklyubn'
if self.i == 0 and self.turn == BLACK:
self.valid_directions = self.valid_directions.replace('y', '').replace('k', '').replace('u', '')
elif self.i == 5 and self.turn == WHITE:
self.valid_directions = self.valid_directions.replace('b', '').replace('j', '').replace('n', '')
if self.j == 0:
self.valid_directions = self.valid_directions.replace('y', '').replace('h', '').replace('b', '')
elif self.j == 4:
self.valid_directions = self.valid_directions.replace('u', '').replace('l', '').replace('n', '')
for direction, (_i, _j) in {
'y': (-1, -1), 'k': (-1, 0), 'u': (-1, 1),
'h': ( 0, -1), 'l': ( 0, 1),
'b': ( 1, -1), 'j': ( 1, 0), 'n': ( 1, 1)
}.items():
if direction in self.valid_directions and len(self.board[self.i+_i][self.j+_j]) == 3:
self.valid_directions = self.valid_directions.replace(direction, '')
def main():
n = NoccaNocca()
while n.is_continuing:
print('=' * 32)
n.print_board()
while True:
i, j = map(int, input('which stone? [(i j)â{status}]: '.format(
status=', '.join(map(lambda ij: str(ij).replace(',', ' '), n.valid_ij_li))
)).split(' '))
if n.select_ij(i, j):
break
while True:
direction = input('which direction?[{status}]: '.format(
status = n.valid_directions
))
if n.select_direction(direction):
break
replace()ã®éšåãã¡ãã£ãšæ°æã¡æªããŠæžãæããæ¹ãè¯ãã®ãããããŸãããïŒç¬ïŒãé£ã°ããŸãã
æ¹åã¯ãã®ããã«ãªã£ãŠããŸãã
direction:
y k u
\ | /
h - * - l
/ | \
b j nãŸããselect_ij()ã®äžã§æå¹ãªæ¹åãã»ããããset_valid_directions()ãå®è¡ããããã«æžãæããŸããã
ç³ã®ç§»å
æåŸã«ãåããããç³ãšæ¹åãæ±ºãŸã£ãã®ã§ãããšã¯ç³ãåããã ãã§ãã
###
class NoccaNocca(object):
###
def move(self) -> str:
_i, _j = {
'y': (-1, -1), 'k': (-1, 0), 'u': (-1, 1),
'h': ( 0, -1), 'l': ( 0, 1),
'b': ( 1, -1), 'j': ( 1, 0), 'n': ( 1, 1)
}[self.direction]
i_ = self.i + _i
j_ = self.j + _j
if (self.turn == BLACK and i_ == 6) or (self.turn == WHITE and i_ == -1):
self.is_continuing = False
self.winner = self.turn
return 'Won'
self.board[i_][j_].append(self.board[self.i][self.j].pop())
self.turn = BLACK if self.turn == WHITE else WHITE
self.set_valid_ij_li()
if len(self.valid_ij_li) == 0:
self.is_continuing = False
self.winner = BLACK if self.turn == WHITE else WHITE
return 'Moved'
###
def main():
n = NoccaNocca()
while n.is_continuing:
print('=' * 32)
n.print_board()
while True:
i, j = map(int, input('which stone? [(i j)â{status}]: '.format(
status=', '.join(map(lambda ij: str(ij).replace(',', ' '), n.valid_ij_li))
)).split(' '))
if n.select_ij(i, j):
break
while True:
direction = input('which direction?[{status}]: '.format(
status = n.valid_directions
))
if n.select_direction(direction):
break
n.move()
print('=' * 32)
print('{winner} won!'.format(
winner={
BLACK: 'BLACK',
WHITE: 'WHITE'
}[self.winner]
))
ããã§å€§äºãªã®ãçµäºæ¡ä»¶ã®å€å®ã§ãã
Nocca Noccaã«ã¯ãç³ã察岞ã«çœ®ãããããã¹ãŠã®çžæã®ç³ãåãããªããããããšã§åå©ããŸãããªã®ã§ãããã«èŠåãããã«å®è£ ããŸãïŒæåãåŸãã®æ¡ä»¶ãç¡èŠããŠæžããŠããïŒ
ãããã«
ãããã§ããã§ããããïŒ
èªåã§çµãã§ã¿ãæãã§ã¯ãNocca Noccaãå®è£ ããã®ã¯ããªã»ãã»ã©å€§å€ã§ã¯ãããŸããã§ããã
ãŸãä»ã®ããŒãã²ãŒã ã§ããã°ã©ã ããããããªã®ãèŠã€ããããçµãã§ã¿ãŸãç¬
ããã°ã©ã ã®å šäœ
ããã°ã©ã ã®å šäœåã¯ãã®ããã«ãªããŸããã
import itertools
BLACK = 0
WHITE = 1
HEIGHT = 6
WIDTH = 5
class NoccaNocca(object):
def __init__(self):
self.init_board()
self.is_continuing = True
self.turn = BLACK
self.i = None
self.j = None
self.direction = None
self.set_valid_ij_li()
def init_board(self):
self.board = [[[] for _ in range(WIDTH)] for _ in range(HEIGHT)]
for j in range(WIDTH):
self.board[0 ][j].append(BLACK)
self.board[WIDTH][j].append(WHITE)
def select_ij(self, i: range(HEIGHT), j: range(WIDTH)) -> bool:
if (i, j) not in self.valid_ij_li:
return False
self.i = i
self.j = j
self.set_valid_directions()
return True
def select_direction(self, direction: str) -> bool:
if direction not in self.valid_directions:
return False
self.direction = direction
return True
def move(self) -> str:
_i, _j = {
'y': (-1, -1), 'k': (-1, 0), 'u': (-1, 1),
'h': ( 0, -1), 'l': ( 0, 1),
'b': ( 1, -1), 'j': ( 1, 0), 'n': ( 1, 1)
}[self.direction]
i_ = self.i + _i
j_ = self.j + _j
if (self.turn == BLACK and i_ == HEIGHT) or (self.turn == WHITE and i_ == -1):
self.is_continuing = False
self.winner = self.turn
return 'Won'
self.board[i_][j_].append(self.board[self.i][self.j].pop())
self.turn = BLACK if self.turn == WHITE else WHITE
self.set_valid_ij_li()
if len(self.valid_ij_li) == 0:
self.is_continuing = False
self.winner = BLACK if self.turn == WHITE else WHITE
return 'Moved'
def set_valid_ij_li(self):
self.valid_ij_li = [(i, j) for i, j in itertools.product(range(HEIGHT), range(WIDTH)) if len(self.board[i][j]) > 0 and self.board[i][j][-1] == self.turn]
def set_valid_directions(self):
self.valid_directions = 'hjklyubn'
if self.i == 0 and self.turn == BLACK:
self.valid_directions = self.valid_directions.replace('y', '').replace('k', '').replace('u', '')
elif self.i == HEIGHT - 1 and self.turn == WHITE:
self.valid_directions = self.valid_directions.replace('b', '').replace('j', '').replace('n', '')
if self.j == 0:
self.valid_directions = self.valid_directions.replace('y', '').replace('h', '').replace('b', '')
elif self.j == WIDTH - 1:
self.valid_directions = self.valid_directions.replace('u', '').replace('l', '').replace('n', '')
for direction, (_i, _j) in {
'y': (-1, -1), 'k': (-1, 0), 'u': (-1, 1),
'h': ( 0, -1), 'l': ( 0, 1),
'b': ( 1, -1), 'j': ( 1, 0), 'n': ( 1, 1)
}.items():
if direction in self.valid_directions and len(self.board[self.i+_i][self.j+_j]) == 3:
self.valid_directions = self.valid_directions.replace(direction, '')
def print_board(self):
print(r'direction:')
print(r'y k u')
print(r' \ | / ')
print(r'h - * - l')
print(r' / | \ ')
print(r'b j n')
print('-' * 32)
print('{turn}\'s turn.'.format(
turn={
BLACK: 'BLACK',
WHITE: 'WHITE'
}[self.turn]
))
print('i\j|', end='')
print(' '.join(map(str, range(WIDTH))))
print('---+', end='')
print('-' * WIDTH * 4)
for i in range(HEIGHT):
print('{i} |'.format(
i=i
), end='')
print(' '.join(map(lambda j: ''.join(map(str, self.board[i][j])) + '_' * (3-len(self.board[i][j])), range(WIDTH))))
def main():
n = NoccaNocca()
while n.is_continuing:
print('=' * 32)
n.print_board()
while True:
i, j = map(int, input('which stone? [(i j)â{status}]: '.format(
status=', '.join(map(lambda ij: str(ij).replace(',', ' '), n.valid_ij_li))
)).split(' '))
if n.select_ij(i, j):
break
while True:
direction = input('which direction?[{status}]: '.format(
status = n.valid_directions
))
if n.select_direction(direction):
break
n.move()
print('=' * 32)
print('{winner} won!'.format(
winner={
BLACK: 'BLACK',
WHITE: 'WHITE'
}[self.winner]
))
if __name__ == '__main__':
main()- åã®èšäº
ãªã6æ¡ã®ãã¹ã¯ãŒãèšå®ã§5çš®é¡ã®æ°ã䜿ãã®ãè¯ãã®ã 2020.10.20
- 次ã®èšäº
æ¥æ¬èªã°ã©ã€ãå ¥åæ¹åŒjaGlideéçºèš 2021.01.08