python_9宫格的井字棋

979 查看

实现功能:


井字棋.PNG


在图中的9宫格里,玩家1、玩家2使用‘X’or‘O’作为棋子,先连成3个的一方获胜。
主要涉及的函数:
1.选择先走符号的函数:
inputPlayerLetter
2.打印棋盘:
drawBoard
3.轮流输入要走的位置:
playerMove
4.胜利判断:
isWinner
5.棋盘填满:
isBoardFull
6.一盘结束时,是否还要继续
playAgain

函数分解:
1.选择先走符号的函数:inputPlayerLetter
返回:下棋顺序的list
可以选择'X'or'O'代表你的棋子

def inputPlayerLetter():
    input_letter=""
    while not (input_letter =='X' or input_letter =='O'):
        print u'你想使用X,还是O'
        input_letter=raw_input().upper()
        if input_letter=='X':
            return ['X','O']
        else:
            return ['O','X']

注解:
1.在选择棋子时,可能输入的不是符合要求的棋子,这时需要重新输入,所以程序应含有while循环体
2.玩家在选择棋子时,可能输入的是小写x,o,在判断输入正确与否是,应统一成大写,使用input_letter=raw_input().upper()语句
3.判断玩家所做的选择,返回值是把玩家1、2对应的棋子按照先后顺序放入一个list中

2..打印棋盘:drawBoard(棋盘编号)

def drawBoard(board):    
    # board=[0,1,2,3,4,5,6,7,8,9],为了将board[1]=1,对应所以在list中加入了0)
    blank_board = '|     '*3+'|'
    edge_board = '+-----'*3+'+'
    def boardNum(board_num):
        print blank_board
        print '|%3s%3s%3s%3s%3s  |'%(board_num[0],'|',board_num[1],'|',board_num[2])
        print blank_board
        print edge_board
    print edge_board
    boardNum(board[7:10])
    boardNum(board[4:7])
    boardNum(board[1:4])

注解:
1.画出边框+-----+-----+-----+,对应的语句

edge_board = '+-----'*3+'+'

2.画出分界| | | |,对应的语句

blank_board = '|     '*3+'|'

3.棋盘数字| 7 | 8 | 9 |,对应的语句

'|%3s%3s%3s%3s%3s  |'%(board_num[0],'|',board_num[1],'|',board_num[2])

4.


井字棋棋盘


画出棋盘的逻辑先一层边框,再一层分界,一层棋盘数字,一层分界,一层边框。循环3次。在棋盘数字那层每次传人的数字不一样,可以采用调用三次函数,每次传人参数不同

    boardNum(board[7:10])
    boardNum(board[4:7])
    boardNum(board[1:4])

3.轮流输入要走的位置:playerMove(棋盘编好信息和玩家顺序list)

def playerMove(board_num,letter):
    player=[player1letter,player2letter]=letter
    print player1letter+u'先'
    turn=0
    while True:        
        current_player=player[turn]
        print u'玩家'+current_player+u'输入你要放置棋子的格数'
        stepin=raw_input()
        if stepin in ['1','2','3','4','5','6','7','8','9']:
            step=int(stepin)
            if board_num[step]== 'X' or board_num[step] =='O':
                print u'你选择的格子上已经有棋子了,请重新选择'
                continue
            board_num[step]=current_player
            drawBoard(board_num)
            if isWinner(board_num,current_player):
                print current_player+ u'赢了'
                break
            if isBoardFull(board_num):
                print u"棋盘已满,平局"
                break
            turn=(turn+1)%2            
        else:
            print u'你的输入不正确,请重新输入(1-9)'

注解:
1.两个之间的轮流,可以创建一个变量通过轮换一次,变量加一对2取余

turn=0
current_player=player[turn]
turn=(turn+1)%2

2.玩家输入所要走的位置,需要判断输入是否符合条件。
(a)输入是否在1-9中,raw_input采集到的输入是str型,所以应判断

stepin=raw_input()
        if stepin in ['1','2','3','4','5','6','7','8','9']:

为了将棋盘上board_num的值变为输入的值,需要将输入的值变为int型

     step=int(stepin)

(b)需要判断所走的位置是否已经有棋子

     if board_num[step]== 'X' or board_num[step] =='O':
                print u'你选择的格子上已经有棋子了,请重新选择'
                continue

continue不再执行下面的语句,跳入循环体开头,重新执行
(c)需要判断是否有一方获胜
调用判断获胜的isWinner函数,需要向函数传入的参数是当前的棋盘信息和当前的玩家是哪一方,如果返回为True,则说明当前玩家赢了,break退出循环体

     if isWinner(board_num,current_player): 
            print current_player+ u'赢了' break

(d)需要判断棋盘是否被走满
调用棋盘是否满函数isBoardFull,传人的参数是棋盘信息,如果走满,则输出平局,如果没有走满继续

if isBoardFull(board_num):
                print u"棋盘已满,平局"
                break

4.胜利判断:isWinner(当前的棋盘信息和当前的玩家是哪一方)
返回:true\false
罗列出所有赢得情况相交集,只要有一种情况发生,则返回true

def isWinner(bo,le):
    return ((bo[7] == le and bo[8] == le and bo[9] == le) or # across the top
    (bo[4] == le and bo[5] == le and bo[6] == le) or # across the middle
    (bo[1] == le and bo[2] == le and bo[3] == le) or # across the bottom
    (bo[7] == le and bo[4] == le and bo[1] == le) or # down the left side
    (bo[8] == le and bo[5] == le and bo[2] == le) or # down the middle
    (bo[9] == le and bo[6] == le and bo[3] == le) or # down the right side
    (bo[7] == le and bo[5] == le and bo[3] == le) or # diagonal
    (bo[9] == le and bo[5] == le and bo[1] == le)) # diagonal

5.棋盘填满:isBoardFull(当前的棋盘信息)
返回:true\false

def isBoardFull(board_num):
    n=0
    for x in xrange(1,10):
        if not board_num[x] in [1,2,3,4,5,6,7,8,9]:
            n=n+1
    if n==9:
        return True
    else:
        return False

6.一盘结束时,是否还要继续: playAgain()
返回:true\false

def tryAgain():
    print u'还想再玩一把么?(yes or no)'
    return raw_input().lower().startswith('y')#startswith()函数是监测是否字符串以y开头,如果是返回ture,不是返回false