python——井字棋游戏——代码(全)

文章下面有井字棋全部代码和如何与上一篇登入界面进行连接

1.绘制九宫格窗口

我们先设置两个函数,一个函数里面储存九宫格,另一个函数储存主程序,之后我们调用主程序进行实现。

(1)设置窗口九宫格窗口

代码:
import tkinter as tk

def main():
    root = tk.Tk()
    root.title("九宫格")
    root.geometry("500x600")

if __name__ == "__main__":

    main()

(2)画九宫格

canvas:可以在窗口中创建各种图形。
create:create 是 tkinter 中 Canvas 组件的方法之一,用于在画布上创建不同类型的图形。通过 create 方法,可以创建并添加各种图形对象到画布上,如矩形、椭圆、文本、线条等。

代码:
def draw_grid(canvas):
    # 画外边框线
    canvas.create_line(2, 2, 300, 2, width=2)  # 上
    canvas.create_line(2, 2, 2, 300, width=2)  # 左
    canvas.create_line(2, 300, 300, 300, width=2)  # 下
    canvas.create_line(300, 2, 300, 300, width=2)  # 右
    # 画横线
    canvas.create_line(100, 0, 100, 300)
    canvas.create_line(200, 0, 200, 300)
    # 画竖线
    canvas.create_line(0, 100, 300, 100)
    canvas.create_line(0, 200, 300, 200)
global canvas
canvas = tk.Canvas(root, width=350, height=350,)
canvas.pack()
draw_grid(canvas)
root.mainloop()

(3)在格子里输入数字

我们使用for循环在格子里面输入数字。

代码:
#初始化变量 num 为1,用于存储将要显示的数字。
num = 1
# 外层循环,变量 i 从0到2循环,共执行3次。
for i in range(3):
    #内层循环,变量 j 从0到2循环,共执行3次。
    for j in range(3):
        #计算每个格子中心点的 y 坐标。当 i 为0时,y 为50;当 i 为1时,y 为150;当 i 为2时,y 为250。
        y = i * 100 + 50
        #计算每个格子中心点的 x 坐标。当 j 为0时,x 为50;当 j 为1时,x 为150;当 j 为2时,x 为250。
        x = j * 100 + 50
        #在坐标 (x, y) 处创建一个文本对象,显示的内容为 num 的字符串形式,即当前数字。设置文本的字体为 Arial,大小为24。
        canvas.create_text(x, y, text=str(num), font=("Arial", 24))
        #每次内循环结束后,将 num 的值加1,以便显示下一个数字。
        num += 1

运行结果如下:
在这里插入图片描述

代码位置:

在这里插入图片描述

2.绘制输入框和按钮

代码:
lb1 = tk.Label(root, text='请要输入落子的位置(1~9):')
lb1.place(x=150, y=350)
global e1
e1 = tk.Entry(root, bd=5, width=20)
e1.place(x=150, y=380)
button1 = tk.Button(root, text="按下落子", width=10, height=2, fg='black')
button1.place(x=180, y=420)
button2 = tk.Button(root, text="重新开始", width=10, height=2, fg='black')
button2.place(x=180, y=480)
运行结果图:

在这里插入图片描述

代码位置:

在这里插入图片描述

3.实现输入数字进行下棋

定义一个函数,使得在输入框输入对应的九宫格数字,点击按下落子按钮,实现在格子里面画叉,如果重复一个数字输入,则会弹出警告框。
我们先在最上方导入一个包:from tkinter import messagebox
然后在主程序中写着:board = [’ '] * 9,这个代码表示创建了一个包含9个元素的列表 board,并将每个元素初始化为一个空格 ’ '。
再在主程序中定义初始步数为0:step = 0

isdigit() 是 Python 字符串对象的一个方法,用于判断字符串是否只包含数字字符。具体来说,isdigit() 方法会遍历字符串中的每个字符,如果所有字符都是数字字符(0-9),则返回 True;否则返回 False。

代码:
def on_click():
    global board
    global step
    position = e1.get()

    if position.isdigit() and 1 <= int(position) <= 9:
        number = int(position)
        index = number - 1
        if board[index] == ' ':
            board[index] = 'x'
            x = ((int(position) - 1) % 3) * 100 + 50
            y = ((int(position) - 1) // 3) * 100 + 50
            canvas.create_line(x - 20, y - 20, x + 20, y + 20, fill='black', width=2)
            canvas.create_line(x + 20, y - 20, x - 20, y + 20, fill='black', width=2)


        else:
            messagebox.showerror("错误", "该位置已经落子,请选择其他位置")
运行结果

在这里插入图片描述

代码位置:

在这里插入图片描述
在这里插入图片描述

4.异常输入显示弹出窗

设置一个函数,使得输入1~9以外的数字会弹出弹窗警告,如果输入其他也会弹出弹出警告。

代码:
def problem():
    try:
        input_value = int(e1.get())
        if input_value < 1 or input_value > 9:
            messagebox.showerror("错误", "请输入1到9之间的数字")
        else:
            print("输入正确")
    except ValueError:
        messagebox.showerror("错误", "请输入一个有效的数字")

    on_click()

如果要想实现此功能,我们还需要把bullon1里面调用的函数改为problem
如下:

button1 = tk.Button(root, text="按下落子", width=10, height=2, fg='black', command=problem)
    button1.place(x=180, y=420)
运行结果:

在这里插入图片描述

代码位置如下:

在这里插入图片描述

5.检测赢和平局

设置一个函数,里面设置一个二维数组,把所有赢的可能设置在里面,然后判断是否赢,超过5步则平局。

代码:
def iswins():
    global gameover,step
    wins = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]]
    for w in wins:
        if (board[w[0]]!=" " and board[w[0]]==board[w[1]]==board[w[2]]):
            gameover = True
            messagebox.showinfo(title="shuchu",message="我赢了")
            return
    if step>5:
        gameover = True
        messagebox.showinfo(title="shuchu",message="都没有赢了")
    return

要想实现此代码,还需要在on_click函数的步数后面加上此函数,这样每下完一步都会进行判断。

运行结果:

在这里插入图片描述

代码位置:

在这里插入图片描述

5.重新开始游戏

定义一个函数,链接重新开始按钮,使点击主窗口的重新开始按钮,九宫格内所有叉消失,重新开始游戏。
我们要在主循环中设置gameover=False

代码:
def again():
    global board, step, gameover
    board = [' '] * 9
    step = 0
    gameover = False
#删除画布上的所有元素。
    canvas.delete('all')
#再一次绘制九宫格棋盘
    draw_grid(canvas)
代码位置:

在这里插入图片描述

6.实现AI和玩家交替下棋

定义一个函数,代表AI下棋,在里面随机生成0~8的整数,用于表示AI在棋盘上的位置,然后让AI落子时不落在已经落子的地方,然后画圈。
在写代码前,我们先要在最上方导入import random
还要在主循环中写如AI的步数foot=0
写完AI落子,我们还需要在on_click函数中添加AI落子,实现玩家与AI交替落子。

代码:
def ai_move():
    global board, foot
    index = random.randint(0, 8)

    while board[index] != ' ':
        index = random.randint(0, 8)

    x = ((index) % 3) * 100 + 50
    y = ((index) // 3) * 100 + 50

    canvas.create_oval(x - 20, y - 20, x + 20, y + 20, fill='red')
    board[index] = 'AI'
    foot += 1
    iswins()
运行结果:

在这里插入图片描述

代码位置:

在这里插入图片描述
到这里我们的代码基本就结束啦,但是还有最后一步,就是把登入界面和井字棋游戏界面进行链接起来。

7.链接登入界面和井字棋界面

登入界面在上一篇文章
首先确保我们的登入界面和井字棋界面在一个文件下,我们需要先在登入界面最上方添加一个包:import subprocess
再在usr_login函数里面加入:

window.destroy()
subprocess.Popen(["python", "demo3.py"])

上面的"demo3.py"是我井字棋游戏的文件名

代码位置:

在这里插入图片描述

8.井字棋游戏全部代码

import random
import tkinter as tk
from tkinter import messagebox


def draw_grid(canvas):
    # 画外边框线
    canvas.create_line(2, 2, 300, 2, width=2)  # 上
    canvas.create_line(2, 2, 2, 300, width=2)  # 左
    canvas.create_line(2, 300, 300, 300, width=2)  # 下
    canvas.create_line(300, 2, 300, 300, width=2)  # 右
    # 画横线
    canvas.create_line(100, 0, 100, 300)
    canvas.create_line(200, 0, 200, 300)
    # 画竖线
    canvas.create_line(0, 100, 300, 100)
    canvas.create_line(0, 200, 300, 200)

    num = 1
    for i in range(3):
        for j in range(3):
            y = i * 100 + 50
            x = j * 100 + 50
            canvas.create_text(x, y, text=str(num), font=("Arial", 24))

            num += 1


def on_click():
    global board
    global step
    position = e1.get()

    if position.isdigit() and 1 <= int(position) <= 9:
        number = int(position)
        index = number - 1
        if board[index] == ' ':
            board[index] = 'x'
            x = ((int(position) - 1) % 3) * 100 + 50
            y = ((int(position) - 1) // 3) * 100 + 50
            canvas.create_line(x - 20, y - 20, x + 20, y + 20, fill='black', width=2)
            canvas.create_line(x + 20, y - 20, x - 20, y + 20, fill='black', width=2)
            step += 1
            iswins()
            if not gameover:
                ai_move()
        else:
            messagebox.showerror("错误", "该位置已经落子,请选择其他位置")



    

def ai_move():
    global board, foot
    index = random.randint(0, 8)

    while board[index] != ' ':
        index = random.randint(0, 8)

    x = ((index) % 3) * 100 + 50
    y = ((index) // 3) * 100 + 50

    canvas.create_oval(x - 20, y - 20, x + 20, y + 20, fill='red')
    board[index] = 'AI'
    foot += 1
    iswins()


def problem():
    try:
        input_value = int(e1.get())
        if input_value < 1 or input_value > 9:
            messagebox.showerror("错误", "请输入1到9之间的数字")
        else:
            print("输入正确")
    except ValueError:
        messagebox.showerror("错误", "请输入一个有效的数字")

    on_click()


def iswins():
    global gameover,step
    wins = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]]
    for w in wins:
        if (board[w[0]]!=" " and board[w[0]]==board[w[1]]==board[w[2]]):
            gameover = True
            messagebox.showinfo(title="shuchu",message="赢家是"+board[w[0]])
            return
    if step>5:
        gameover = True
        messagebox.showinfo(title="shuchu",message="都没有赢了")
    return

def again():
    global board, step, gameover
    board = [' '] * 9
    step = 0
    gameover = False
    canvas.delete('all')
    draw_grid(canvas)



def main():
    root = tk.Tk()
    root.title("九宫格")
    root.geometry("500x600")

    lb1 = tk.Label(root, text='请要输入落子的位置(1~9):')
    lb1.place(x=150, y=350)
    global e1
    e1 = tk.Entry(root, bd=5, width=20)
    e1.place(x=150, y=380)
    button1 = tk.Button(root, text="按下落子", width=10, height=2, fg='black', command=problem)
    button1.place(x=180, y=420)
    button2 = tk.Button(root, text="重新开始", width=10, height=2, fg='black', command=again)
    button2.place(x=180, y=480)

    global canvas
    canvas = tk.Canvas(root, width=350, height=350,)
    canvas.pack()

    draw_grid(canvas)

    root.mainloop()

if __name__ == "__main__":
    board = [' '] * 9
    gameover = False
    step = 0

    foot =0
    main()



  • 39
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值