python五子棋游戏from tkinter import_使用Python的tkinter库,做简单的五子棋游戏

初学tkinter,感觉功能还是太少了,建议想要深入研究用户界面的话,还是选QT,VB之类的吧。要是跟我一样平时随便玩玩,就图个方便,那就将就着用吧。

2019-05-20:之前的版本是刚学python时候写的,回头看了看代码,写的真实惨不忍睹,变量的名称一点都不符合规范。所以删除重新写了一份,这个版本思路更清晰一些。

一、运行截图:

e41cb6c7485551305787860425f34628.png

c75167a2d76860bb20dccea6735002b1.png

8febe80ec6f308092da3525c196bfb01.png

9392dce5fcdb1f604b1e4e5516dad1db.png

二、代码

# 用数组定义一个棋盘,棋盘大小为 15×15

# 数组索引代表位置,

# 元素值代表该位置的状态:0代表没有棋子,1代表有黑棋,-1代表有白棋。

from tkinter import *

from tkinter.messagebox import *

class Chess(object):

def __init__(self):

#############

# param #

#######################################

self.row, self.column = 15, 15

self.mesh = 25

self.ratio = 0.9

self.board_color = "#CDBA96"

self.header_bg = "#CDC0B0"

self.btn_font = ("黑体", 12, "bold")

self.step = self.mesh / 2

self.chess_r = self.step * self.ratio

self.point_r = self.step * 0.2

self.matrix = [[0 for y in range(self.column)] for x in range(self.row)]

self.is_start = False

self.is_black = True

self.last_p = None

###########

# GUI #

#######################################

self.root = Tk()

self.root.title("Gobang By Young")

self.root.resizable(width=False, height=False)

self.f_header = Frame(self.root, highlightthickness=0, bg=self.header_bg)

self.f_header.pack(fill=BOTH, ipadx=10)

self.b_start = Button(self.f_header, text="开始", command=self.bf_start, font=self.btn_font)

self.b_restart = Button(self.f_header, text="重来", command=self.bf_restart, state=DISABLED, font=self.btn_font)

self.l_info = Label(self.f_header, text="未开始", bg=self.header_bg, font=("楷体", 18, "bold"), fg="white")

self.b_regret = Button(self.f_header, text="悔棋", command=self.bf_regret, state=DISABLED, font=self.btn_font)

self.b_lose = Button(self.f_header, text="认输", command=self.bf_lose, state=DISABLED, font=self.btn_font)

self.b_start.pack(side=LEFT, padx=20)

self.b_restart.pack(side=LEFT)

self.l_info.pack(side=LEFT, expand=YES, fill=BOTH, pady=10)

self.b_lose.pack(side=RIGHT, padx=20)

self.b_regret.pack(side=RIGHT)

self.c_chess = Canvas(self.root, bg=self.board_color, width=(self.column + 1) * self.mesh,

height=(self.row + 1) * self.mesh, highlightthickness=0)

self.draw_board()

self.c_chess.bind("", self.cf_board)

self.c_chess.pack()

self.root.mainloop()

# 画x行y列处的网格

def draw_mesh(self, x, y):

# 一个倍率,由于tkinter操蛋的GUI,如果不加倍率,悔棋的时候会有一点痕迹,可以试试把这个改为1,就可以看到

ratio = (1 - self.ratio) * 0.99 + 1

center_x, center_y = self.mesh * (x + 1), self.mesh * (y + 1)

# 先画背景色

self.c_chess.create_rectangle(center_y - self.step, center_x - self.step,

center_y + self.step, center_x + self.step,

fill=self.board_color, outline=self.board_color)

# 再画网格线,这里面a b c d是不同的系数,根据x,y不同位置确定,需要一定推导。

a, b = [0, ratio] if y == 0 else [-ratio, 0] if y == self.row - 1 else [-ratio, ratio]

c, d = [0, ratio] if x == 0 else [-ratio, 0] if x == self.column - 1 else [-ratio, ratio]

self.c_chess.create_line(center_y + a * self.step, center_x, center_y + b * self.step, center_x)

self.c_chess.create_line(center_y, center_x + c * self.step, center_y, center_x + d * self.step)

# 有一些特殊的点要画小黑点

if ((x == 3 or x == 11) and (y == 3 or y == 11)) or (x == 7 and y == 7):

self.c_chess.create_oval(center_y - self.point_r, center_x - self.point_r,

center_y + self.point_r, center_x + self.point_r, fill="black")

# 画x行y列处的棋子,color指定棋子颜色

def draw_chess(self, x, y, color):

center_x, center_y = self.mesh * (x + 1), self.mesh * (y + 1)

# 就是画个圆

self.c_chess.create_oval(center_y - self.chess_r, center_x - self.chess_r,

center_y + self.chess_r, center_x + self.chess_r,

fill=

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值