侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python使用tkinter库实现五子棋游戏

Python  /  管理员 发布于 7年前   197

本文实例为大家分享了python实现五子棋游戏的具体代码,供大家参考,具体内容如下

一、运行截图:

二、代码

# 用数组定义一个棋盘,棋盘大小为 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("<Button-1>", 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=color)  # 画整个棋盘 def draw_board(self):  [self.draw_mesh(x, y) for y in range(self.column) for x in range(self.row)]  # 在正中间显示文字 def center_show(self, text):  width, height = int(self.c_chess['width']), int(self.c_chess['height'])  self.c_chess.create_text(int(width / 2), int(height / 2), text=text, font=("黑体", 30, "bold"), fill="red")  # 开始的时候设置各个组件,变量的状态,初始化matrix矩阵,初始化棋盘,初始化信息 def bf_start(self):  self.set_btn_state("start")  self.is_start = True  self.is_black = True  self.matrix = [[0 for y in range(self.column)] for x in range(self.row)]  self.draw_board()  self.l_info.config(text="黑方下棋")  # 重来跟开始的效果一样 def bf_restart(self):  self.bf_start()  # 用last_p来标识上一步的位置。先用网格覆盖掉棋子,操作相应的变量,matrix[x][y]要置空,只能悔一次棋 def bf_regret(self):  if not self.last_p:   showinfo("提示", "现在不能悔棋")   return  x, y = self.last_p  self.draw_mesh(x, y)  self.matrix[x][y] = 0  self.last_p = None  self.trans_identify()  # 几个状态改变,还有显示文字,没什么说的 def bf_lose(self):  self.set_btn_state("init")  self.is_start = False  text = self.ternary_operator("黑方认输", "白方认输")  self.l_info.config(text=text)  self.center_show("蔡")  # Canvas的click事件 def cf_board(self, e):  # 找到离点击点最近的坐标  x, y = int((e.y - self.step) / self.mesh), int((e.x - self.step) / self.mesh)  # 找到该坐标的中心点位置  center_x, center_y = self.mesh * (x + 1), self.mesh * (y + 1)  # 计算点击点到中心的距离  distance = ((center_x - e.y) ** 2 + (center_y - e.x) ** 2) ** 0.5  # 如果距离不在规定的圆内,退出//如果这个位置已经有棋子,退出//如果游戏还没开始,退出  if distance > self.step * 0.95 or self.matrix[x][y] != 0 or not self.is_start:   return  # 此时棋子的颜色,和matrix中该棋子的标识。  color = self.ternary_operator("black", "white")  tag = self.ternary_operator(1, -1)  # 先画棋子,在修改matrix相应点的值,用last_p记录本次操作点  self.draw_chess(x, y, color)  self.matrix[x][y] = tag  self.last_p = [x, y]  # 如果赢了,则游戏结束,修改状态,中心显示某方获胜  if self.is_win(x, y, tag):   self.is_start = False   self.set_btn_state("init")   text = self.ternary_operator("黑方获胜", "白方获胜")   self.center_show(text)   return  # 如果游戏继续,则交换棋手  self.trans_identify()  def is_win(self, x, y, tag):  # 获取斜方向的列表  def direction(i, j, di, dj, row, column, matrix):   temp = []   while 0 <= i < row and 0 <= j < column:    i, j = i + di, j + dj   i, j = i - di, j - dj   while 0 <= i < row and 0 <= j < column:    temp.append(matrix[i][j])    i, j = i - di, j - dj   return temp   four_direction = []  # 获取水平和竖直方向的列表  four_direction.append([self.matrix[i][y] for i in range(self.row)])  four_direction.append([self.matrix[x][j] for j in range(self.column)])  # 获取斜方向的列表  four_direction.append(direction(x, y, 1, 1, self.row, self.column, self.matrix))  four_direction.append(direction(x, y, 1, -1, self.row, self.column, self.matrix))   # 一一查看这四个方向,有没有满足五子连珠  for v_list in four_direction:   count = 0   for v in v_list:    if v == tag:     count += 1     if count == 5:      return True    else:     count = 0  return False  # 设置四个按钮是否可以点击 def set_btn_state(self, state):  state_list = [NORMAL, DISABLED, DISABLED, DISABLED] if state == "init" else [DISABLED, NORMAL, NORMAL, NORMAL]  self.b_start.config(state=state_list[0])  self.b_restart.config(state=state_list[1])  self.b_regret.config(state=state_list[2])  self.b_lose.config(state=state_list[3])  # 因为有很多和self.black相关的三元操作,所以就提取出来 def ternary_operator(self, true, false):  return true if self.is_black else false  # 交换棋手 def trans_identify(self):  self.is_black = not self.is_black  text = self.ternary_operator("黑方下棋", "白方下棋")  self.l_info.config(text=text)  if __name__ == '__main__': Chess()

三、增加复盘和保存棋谱功能

直接贴可以运行的源码,添加了两个按键和一个页面。

# 用数组定义一个棋盘,棋盘大小为 15×15# 数组索引代表位置,# 元素值代表该位置的状态:0代表没有棋子,1代表有黑棋,-1代表有白棋。 from tkinter import *from tkinter.messagebox import *import os TAG_BLACK = "1"TAG_EMPTY = "."TAG_WHITE = "0"ROOT_DIR = os.path.abspath(os.path.dirname(os.path.abspath(__file__)) + os.path.sep + ".")  class Chess(object):  def bf_save(self):   path = os.path.join(ROOT_DIR, "record.txt")  file = open(path, "w")  for i in range(len(self.record)):   x, y = self.record[i]   file.write("{}: [{}, {}]\n".format("黑方" if i % 2 == 0 else "白方", x, y))  file.close()  def init_matrix(self):  return [[TAG_EMPTY for y in range(self.column)] for x in range(self.row)]  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 = self.init_matrix()  self.is_start = False  self.is_black = True  self.record = []   ###########  # 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.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.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("<Button-1>", self.cf_board)   self.b_record = Button(self.root, text="复 盘", command=self.bf_record, font=self.btn_font, bg="lightblue")  self.b_save = Button(self.root, text="保 存", command=self.bf_save, font=self.btn_font, bg="lightblue")   self.f_header.pack(side=TOP, fill=BOTH, ipadx=10)  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.pack(side=TOP)   self.b_record.pack(side=TOP, expand=YES, fill=X)  self.b_save.pack(side=TOP, expand=YES, fill=X)   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=color)  # 画整个棋盘 def draw_board(self):  [self.draw_mesh(x, y) for y in range(self.column) for x in range(self.row)]  # 在正中间显示文字 def center_show(self, text):  width, height = int(self.c_chess['width']), int(self.c_chess['height'])  self.c_chess.create_text(int(width / 2), int(height / 2), text=text, font=("黑体", 30, "bold"), fill="red")  def bf_record(self):  Record(self.record)  pass  # 开始的时候设置各个组件,变量的状态,初始化matrix矩阵,初始化棋盘,初始化信息 def bf_start(self):  self.set_btn_state("start")  self.is_start = True  self.is_black = True  self.matrix = self.init_matrix()  self.draw_board()  self.record = []  self.l_info.config(text="黑方下棋")  # 重来跟开始的效果一样 def bf_restart(self):  self.record = []  self.bf_start()  # 用last_p来标识上一步的位置。先用网格覆盖掉棋子,操作相应的变量,matrix[x][y]要置空,只能悔一次棋 def bf_regret(self):  if len(self.record) == 0:   showinfo("提示", "现在不能悔棋")   return  x, y = self.record[-1]  self.draw_mesh(x, y)  self.matrix[x][y] = TAG_EMPTY  self.record = self.record[:-1]  self.trans_identify()  # 几个状态改变,还有显示文字,没什么说的 def bf_lose(self):  self.set_btn_state("init")  self.is_start = False  text = self.ternary_operator("黑方认输", "白方认输")  self.l_info.config(text=text)  self.center_show("蔡")  def go_chess(self, x, y):  # 此时棋子的颜色,和matrix中该棋子的标识。  color = self.ternary_operator("black", "white")  tag = self.ternary_operator(TAG_BLACK, TAG_WHITE)  # 先画棋子,在修改matrix相应点的值,用last_p记录本次操作点  self.draw_chess(x, y, color)  self.matrix[x][y] = tag  self.record.append([x, y])  # 如果赢了,则游戏结束,修改状态,中心显示某方获胜  if self.is_win(x, y, tag):   self.is_start = False   self.set_btn_state("init")   text = self.ternary_operator("黑方获胜", "白方获胜")   self.center_show(text)   return  # 如果游戏继续,则交换棋手  self.trans_identify()  # Canvas的click事件 def cf_board(self, e):  # 找到离点击点最近的坐标  x, y = int((e.y - self.step) / self.mesh), int((e.x - self.step) / self.mesh)  # 找到该坐标的中心点位置  center_x, center_y = self.mesh * (x + 1), self.mesh * (y + 1)  # 计算点击点到中心的距离  distance = ((center_x - e.y) ** 2 + (center_y - e.x) ** 2) ** 0.5  # 如果距离不在规定的圆内,退出//如果这个位置已经有棋子,退出//如果游戏还没开始,退出  if distance > self.step * 0.95 or self.matrix[x][y] != TAG_EMPTY or not self.is_start:   return  self.go_chess(x, y)  def is_win(self, x, y, tag):  # 获取斜方向的列表  def direction(i, j, di, dj, row, column, matrix):   temp = []   while 0 <= i < row and 0 <= j < column:    i, j = i + di, j + dj   i, j = i - di, j - dj   while 0 <= i < row and 0 <= j < column:    temp.append(matrix[i][j])    i, j = i - di, j - dj   return temp   four_direction = []  # 获取水平和竖直方向的列表  four_direction.append([self.matrix[i][y] for i in range(self.row)])  four_direction.append([self.matrix[x][j] for j in range(self.column)])  # 获取斜方向的列表  four_direction.append(direction(x, y, 1, 1, self.row, self.column, self.matrix))  four_direction.append(direction(x, y, 1, -1, self.row, self.column, self.matrix))   # 一一查看这四个方向,有没有满足五子连珠  for v_list in four_direction:   if tag * 5 in "".join(v_list):    return True  return False  # 设置四个按钮是否可以点击 def set_btn_state(self, state):  state_list = [NORMAL, DISABLED, DISABLED, DISABLED] if state == "init" else [DISABLED, NORMAL, NORMAL, NORMAL]  self.b_start.config(state=state_list[0])  self.b_restart.config(state=state_list[1])  self.b_regret.config(state=state_list[2])  self.b_lose.config(state=state_list[3])  # 因为有很多和self.black相关的三元操作,所以就提取出来 def ternary_operator(self, true, false):  return true if self.is_black else false  # 交换棋手 def trans_identify(self):  self.is_black = not self.is_black  text = self.ternary_operator("黑方下棋", "白方下棋")  self.l_info.config(text=text)  def print_process(self):  pass  class Record(object):  def __init__(self, record):  #############  # 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.is_black = True  self.index = -1  self.record = record  ###########  # GUI #  #######################################  self.root = Tk()  self.root.title("复盘")  self.root.resizable(width=False, height=False)  self.root.bind("<Key>", self.kf_step)   self.f_header = Frame(self.root, highlightthickness=0, bg=self.header_bg)  self.l_info = Label(self.f_header, text="未开始", bg=self.header_bg, font=("楷体", 18, "bold"), fg="white")   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.f_header.pack(fill=BOTH, ipadx=10)  self.l_info.pack(side=LEFT, expand=YES, fill=BOTH, pady=10)  self.c_chess.pack()   self.root.mainloop()  def kf_step(self, e):  if e.keycode not in [37, 39]:   return  if e.keycode == 37:   if self.index == -1:    self.l_info.config(text="已经走到最开始了")    return   x, y = self.record[self.index]   self.draw_mesh(x, y)   if self.index == 0:    self.l_info.config(text="未开始")   else:    self.l_info.config(text="黑方走棋" if self.is_black else "白方走棋")   self.is_black = not self.is_black   self.index -= 1   if self.index > 0:    x, y = self.record[self.index]    color = "white" if self.is_black else "black"    self.draw_chess(x, y, color, "red")   elif e.keycode == 39:   if self.index == len(self.record) - 1:    self.l_info.config(text="已经走到最末尾了")    return   self.index += 1   x, y = self.record[self.index]   color = "black" if self.is_black else "white"   self.draw_chess(x, y, color, "red")   if self.index > 0:    x, y = self.record[self.index - 1]    color = "white" if self.is_black else "black"    self.draw_chess(x, y, color)   self.l_info.config(text="黑方走棋" if self.is_black else "白方走棋")   self.is_black = not self.is_black  else:   pass  # 画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, outline="black"):  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=color, outline=outline)  # 画整个棋盘 def draw_board(self):  [self.draw_mesh(x, y) for y in range(self.column) for x in range(self.row)]  # 在正中间显示文字 def center_show(self, text):  width, height = int(self.c_chess['width']), int(self.c_chess['height'])  self.c_chess.create_text(int(width / 2), int(height / 2), text=text, font=("黑体", 30, "bold"), fill="red")  # 开始的时候设置各个组件,变量的状态,初始化matrix矩阵,初始化棋盘,初始化信息  if __name__ == '__main__': Chess()

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    Python弹出输入框并获取输入值的实例
    下一条:
    Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客