python reversi模块_Reversi.py

import random

import sys

def drawBoard(board):

HLINE = ' +---+---+---+---+---+---+---+---+'

VLINE = ' | | | | | | | | |'

print(' 1 2 3 4 5 6 7 8')

print(HLINE)

for y in range(8):

print(VLINE)

print(y+1, end=' ')

for x in range(8):

print('| %s' % (board[x][y]), end=' ')

print('|')

print(VLINE)

print(HLINE)

def resetBoard(board):

for x in range(8):

for y in range(8):

board[x][y] = ' '

board[3][3] = 'X'

board[3][4] = 'O'

board[4][3] = 'O'

board[4][4] = 'X'

def getNewBoard():

board = []

for i in range(8):

board.append([' '] * 8)

return board

def isValidMove(board, tile, xstart, ystart):

if board[xstart][ystart] != ' ' or not isOnBoard(xstart, ystart):

return False

board[xstart][ystart] = tile

if tile == 'X':

otherTile = 'O'

else:

otherTile = 'X'

tileToFlip = []

for xdirection, ydirection in [[0, 1], [1, 1], [1, 0], [1, -1], [0, -1], [-1, -1], [-1, 0], [-1, 1]]:

x, y = xstart, ystart

x += xdirection

y += ydirection

if isOnBoard(x, y) and board[x][y] == otherTile:

x += xdirection

y += ydirection

if not isOnBoard(x, y):

continue

while board[x][y] == otherTile:

x += xdirection

y += ydirection

if not isOnBoard(x, y):

break

if not isOnBoard(x, y):

continue

if board[x][y] == tile:

while True:

x -= xdirection

y -= ydirection

if x == xstart and y == ystart:

break

tileToFlip.append([x, y])

board[xstart][ystart] = ' '

if len(tileToFlip) == 0:

return False

return tileToFlip

def isOnBoard(x, y):

return x >= 0 and x <= 7 and y >= 0 and y <= 7

def getBoardWithValidMoves(board, tile):

dupeBoard = getBoardCopy(board)

for x, y in getValidMoves(board, tile):

dupeBoard[x][y] = '.'

return dupeBoard

def getValidMoves(board, tile):

validMoves = []

for x in range(8):

for y in range(8):

if isValidMove(board, tile, x, y) != False:

validMoves.append([x, y])

return validMoves

def getScoreOfBoard(board):

xscore = 0

oscore = 0

for x in range(8):

for y in range(8):

if board[x][y] == 'X':

xscore += 1

if board[x][y]:

oscore += 1

return {'X':xscore, 'O':oscore}

def enterPlayerTile():

tile = ''

while not (tile == 'X' or tile == 'O'):

print('Do you want to be X or O?')

tile = input().upper()

if tile == 'X':

return ['X', 'O']

else:

return ['O', 'X']

def whoGoesFirst():

if random.randint(0, 1) == 0:

return 'computer'

else:

return 'player'

def playAgain():

print('Do you want to play again? (yes or no)')

return input().lower().startswith('y')

def makeMove(board, tile, xstart, ystart):

tilesToFlip = isValidMove(board, tile, xstart, ystart)

if tilesToFlip == False:

return False

board[xstart][ystart] = tile

for x, y in tilesToFlip:

board[x][y] = tile

return True

def getBoardCopy(board):

dupeBoard = getNewBoard()

for x in range(8):

for y in range(8):

dupeBoard[x][y] = board[x][y]

return dupeBoard

def isOnCorner(x, y):

return (x == 0 and y == 0) or (x == 7 and y == 0) or (x == 0 and y == 7) or (x == 7 and y ==7)

def getPlayerMove(board, playerTile):

DIGITS1TO8 = '1 2 3 4 5 6 7 8'.split()

while True:

print('Enter your move, or type quit to end the game, or hints to turn off/on hints.')

move = input().lower()

if move == 'quit':

return 'quit'

if move == 'hints':

return 'hints'

if len(move) == 2 and move[0] in DIGITS1TO8 and move[1] in DIGITS1TO8:

x = int(move[0]) - 1

y = int(move[1]) - 1

if isValidMove(board, playerTile, x, y) == False:

continue

else:

break

else:

print('That is not a valid move. Type the x digit (1-8), then the y digit (1-8).')

print('For example, 81 will be the top-right corner.')

return [x, y]

def getComputerMove(board, computerTile):

possibleMoves = getValidMoves(board, computerTile)

random.shuffle(possibleMoves)

for x, y in possibleMoves:

if isOnCorner(x, y):

return [x, y]

bestScore = -1

for x, y in possibleMoves:

dupeBoard = getBoardCopy(board)

makeMove(dupeBoard, computerTile, x, y)

score = getScoreOfBoard(dupeBoard)[computerTile]

if score > bestScore:

bestMove = [x, y]

bestScore = score

return bestMove

def showPoints(playerTile, computerTile):

scores = getScoreOfBoard(mainBoard)

print('You have %s points. The computer has %s points.' % (scores[playerTile], scores[computerTile]))

print('Welcome to Reversi!')

while True:

mainBoard = getNewBoard()

resetBoard(mainBoard)

playerTile, computerTile = enterPlayerTile()

showHints = False

turn = whoGoesFirst()

print('The '+ turn +' will go first.')

while True:

if turn == 'player':

if showHints:

validMovesBoard = getBoardWithValidMoves(mainBoard, playerTile)

drawBoard(validMovesBoard)

else:

drawBoard(mainBoard)

showPoints(playerTile, computerTile)

move = getPlayerMove(mainBoard, playerTile)

if move == 'quie':

print('Thanks for playing!')

sys.exit()

elif move == 'hints':

showHints = not showHints

continue

else:

makeMove(mainBoard, playerTile, move[0], move[1])

if getValidMoves(mainBoard, computerTile) == []:

break

else:

turn = 'computer'

else:

drawBoard(mainBoard)

showPoints(playerTile, computerTile)

input('Press Enter to see the computer\'s move.')

x, y = getComputerMove(mainBoard, computerTile)

makeMove(mainBoard, computerTile, x, y)

if getValidMoves(mainBoard, playerTile) == []:

break

else:

turn = 'player'

drawBoard(mainBoard)

scores = getScoreOfBoard(mainBoard)

print('X scored %s points. 0 scored %s points.' % (scores['X'], scores['O']))

if scores[playerTile] > scores[computerTile]:

print('You beat the computer by %s points! Congratulations!' % (scores[playerTile] - scores[computerTile]))

elif scores[playerTile] < scores[computerTile]:

print('You lost. The computer beat you by %s points.' % (scores[computerTile] - scores[playerTile]))

else:

print('The game was a tie!')

if not playAgain():

break

一键复制

编辑

Web IDE

原始数据

按行查看

历史

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值