第一个小游戏:井字棋

若有转载请注明出处!
先介绍一下吧,本人现在还在上大二,博客更多的是记录自己跟随课程的学习成果,其中也会有一些老师的印记,但更多的都是自己课下花了大量时间和心血的结果,所以希望各位看官转载注明出处,真的谢谢!

昨天用python实现了自己第一个有界面的小游戏,虽然用java也可以做出来,但之前没有去想这件事情,而且由于个人原因,使用java写的图形界面都用于实验课了(若你是东大软件人,东软云医院,你懂得),
昨天实验课上将自己的原来的逻辑稍微优化了下,并添加了图形界面,初步完成了井字棋的功能(其实就是三字连线),有兴趣的可以自己运行一遍,看自己能不能下过电脑吧!

# 不谷尉
from tkinter import *
from tkinter import messagebox as msgbox


def luozi0():
    global human, BOARD
    B0['text'] = human
    BOARD[0] = human
    Over = winner()
    if not Over:
        computer_move()
        winner()


def luozi1():
    global human, BOARD
    B1['text'] = human
    BOARD[1] = human
    Over = winner()
    if not Over:
        computer_move()
        winner()


def luozi2():
    global human, BOARD
    B2['text'] = human
    BOARD[2] = human
    Over = winner()
    if not Over:
        computer_move()
        winner()


def luozi3():
    global human, BOARD
    B3['text'] = human
    BOARD[3] = human
    Over = winner()
    if not Over:
        computer_move()
        winner()


def luozi4():
    global human, BOARD
    B4['text'] = human
    BOARD[4] = human
    Over = winner()
    if not Over:
        computer_move()
        winner()


def luozi5():
    global human, BOARD
    B5['text'] = human
    BOARD[5] = human
    Over = winner()
    if not Over:
        computer_move()
        winner()


def luozi6():
    global human, BOARD
    B6['text'] = human
    BOARD[6] = human
    Over = winner()
    if not Over:
        computer_move()
        winner()


def luozi7():
    global human, BOARD
    B7['text'] = human
    BOARD[7] = human
    Over = winner()
    if not Over:
        computer_move()
        winner()


def luozi8():
    global human, BOARD
    B8['text'] = human
    BOARD[8] = human
    Over = winner()
    if not Over:
        computer_move()
        winner()


def restart():
    global BOARD, computer, human
    computer = ' '
    human = ' '
    for i in range(9):
        BOARD[i] = EMPTY
        Bus[i]['text'] = EMPTY
    winnerlabel['text'] = '未知'
    if not askyesno():
        computer_move()


def askyesno():
    global human, computer
    bl = msgbox.askyesno("YesNo", "是否选择先手?")
    if bl:
        human, computer = O, X
        return True
    else:
        computer, human = O, X
        return False


X = "X"
O = "O"
EMPTY = " "
WAYS_TO_WIN = ((0, 1, 2), (3, 4, 5), (6, 7, 8), (0, 3, 6),
               (1, 4, 7), (2, 5, 8), (0, 4, 8), (2, 4, 6))
BEST_MOVES = (4, 0, 2, 6, 8, 1, 3, 5, 7)

BOARD = []  # 棋盘
for i in range(9):
    BOARD.append(EMPTY)

root = Tk()
root.title('井字棋')
root.geometry('240x350')
Bus = []
computer = ' '
human = ' '
Label(root, text='赢家:', width=6, height=3).grid(row=4, column=1)
winnerlabel = Label(root, text='未知', width=6, height=3)
winnerlabel.grid(row=4, column=2)
winnerlabel.pack
reButton = Button(root, text='重新开始', width=6, height=2, bg='red', fg='blue', command=restart).grid(row=4, column=0)
B0 = Button(root, text=EMPTY, width=10, height=5, bg='green', fg='black', command=luozi0)
B1 = Button(root, text=EMPTY, width=10, height=5, bg='yellow', fg='black', command=luozi1)
B2 = Button(root, text=EMPTY, width=10, height=5, bg='green', fg='black', command=luozi2)
B3 = Button(root, text=EMPTY, width=10, height=5, bg='yellow', fg='black', command=luozi3)
B4 = Button(root, text=EMPTY, width=10, height=5, bg='green', fg='black', command=luozi4)
B5 = Button(root, text=EMPTY, width=10, height=5, bg='yellow', fg='black', command=luozi5)
B6 = Button(root, text=EMPTY, width=10, height=5, bg='green', fg='black', command=luozi6)
B7 = Button(root, text=EMPTY, width=10, height=5, bg='yellow', fg='black', command=luozi7)
B8 = Button(root, text=EMPTY, width=10, height=5, bg='green', fg='black', command=luozi8)
Bus.append(B0)
Bus.append(B1)
Bus.append(B2)
Bus.append(B3)
Bus.append(B4)
Bus.append(B5)
Bus.append(B6)
Bus.append(B7)
Bus.append(B8)

for Bi in range(0, 9):
    Bus[Bi].grid(row=Bi//3, column=Bi % 3)


# 产生合法走棋位置序列,即未落子的位置序列
def legal_moves():
    global BOARD
    moves = []
    for square in range(0, 9):
        if BOARD[square] == EMPTY:
            moves.append(square)
    return moves


def winner():
    global BOARD
    for row in WAYS_TO_WIN:
        if BOARD[row[0]] == BOARD[row[1]] == BOARD[row[2]] != EMPTY:
            winner = BOARD[row[0]]
            print("胜利者是" + winner)
            if human == winner:
                winnerlabel['text'] = '玩家'
            elif computer == winner:
                winnerlabel['text'] = '电脑'
            return winner
    if EMPTY not in BOARD:
        print("平局")
        winnerlabel['text'] = '平局'
        return 'TIE'


def isFull():
    for i in BOARD:
        if i == EMPTY:
            return False
    return True


# 电脑下棋
def computer_move():
    global computer, human
    for move in legal_moves():
        BOARD[move] = computer
        Bus[move]['text'] = computer
        if winner() == computer:
            print("电脑下棋位置。。。", move)
            return True
        # 取消走棋方案
        BOARD[move] = EMPTY
        Bus[move]['text'] = EMPTY

    for move in legal_moves():
        BOARD[move] = human
        Bus[move]['text'] = human
        if winner() == human:
            print("电脑下棋位置。。。", move)
            BOARD[move] = computer
            Bus[move]['text'] = computer
            return True
        # 取消走棋方案
        BOARD[move] = EMPTY
        Bus[move]['text'] = EMPTY

    for move in BEST_MOVES:
        if move in legal_moves():
            BOARD[move] = computer
            Bus[move]['text'] = computer
            return True


if not askyesno():
    computer_move()
root.mainloop()


猜你喜欢

转载自www.cnblogs.com/bu-5-gu-2-wei-0/p/12041909.html