Python 围棋

效果图

python 围棋

完整代码

源码地址:Python 围棋

# 使用Python内置GUI模块tkinter  
from tkinter import *  
# ttk覆盖tkinter部分对象,ttk对tkinter进行了优化  
from tkinter.ttk import *  
# 深拷贝时需要用到copy模块  
import copy  
import tkinter.messagebox  # 默认9路  
MODE_NUM = 9  
NEW_APP = False  # 围棋应用对象定义  
class Application(Tk):  # 初始化棋盘,默认九路棋盘  def __init__(self, my_mode_num=9):  Tk.__init__(self)  # 模式,九路棋:9,十三路棋:13,十九路棋:19  self.mode_num = my_mode_num  # 窗口尺寸设置,默认:1.8  self.size = 1.8  # 棋盘每格的边长  self.dd = 360 * self.size / (self.mode_num - 1)  # 相对九路棋盘的矫正比例  self.p = 1 if self.mode_num == 9 else (2 / 3 if self.mode_num == 13 else 4 / 9)  # 定义棋盘阵列,超过边界:-1,无子:0,黑棋:1,白棋:2  self.positions = [[0 for i in range(self.mode_num + 2)] for i in range(self.mode_num + 2)]  # 初始化棋盘,所有超过边界的值置-1  for m in range(self.mode_num + 2):  for n in range(self.mode_num + 2):  if m * n == 0 or m == self.mode_num + 1 or n == self.mode_num + 1:  self.positions[m][n] = -1  # 拷贝三份棋盘“快照”,悔棋和判断“打劫”时需要作参考  self.last_3_positions = copy.deepcopy(self.positions)  self.last_2_positions = copy.deepcopy(self.positions)  self.last_1_positions = copy.deepcopy(self.positions)  # 记录鼠标经过的地方,用于显示shadow时  self.cross_last = None  # 当前轮到的玩家,黑:0,白:1,执黑先行  self.present = 0  # 设置先手  self.fm = -1  # 棋子阴影  self.cross = None  # 记录空位置  self.image_added = None  self.image_added_sign = None  # 初始停止运行,点击“开始游戏”运行游戏  self.stop = True  # 悔棋次数,次数大于0才可悔棋,初始置0(初始不能悔棋),悔棋后置0,下棋或弃手时恢复为1,以禁止连续悔棋  self.regret_chance = 0  # 图片资源,存放在当前目录下的/images/中  self.image_W = PhotoImage(file="./images/WD-9.png")  self.image_B = PhotoImage(file="./images/BD-9.png")  self.image_BD = PhotoImage(file="./images/" + "BD" + "-" + str(self.mode_num) + ".png")  self.image_WD = PhotoImage(file="./images/" + "WD" + "-" + str(self.mode_num) + ".png")  self.image_BU = PhotoImage(file="./images/" + "BU" + "-" + str(self.mode_num) + ".png")  self.image_WU = PhotoImage(file="./images/" + "WU" + "-" + str(self.mode_num) + ".png")  # 用于黑白棋子图片切换的列表  self.chequer_wbu_list = [self.image_BU, self.image_WU]  self.chequer_wbd_list = [self.image_BD, self.image_WD]  # 窗口大小  self.geometry(str(int(600 * self.size)) + 'x' + str(int(400 * self.size)))  # 画布控件,作为容器  self.canvas_bottom = Canvas(self, bg='#585858', bd=0, width=600 * self.size, height=400 * self.size)  self.canvas_bottom.place(x=0, y=0)  # 几个功能按钮  self.startButton = Button(self, text='开始游戏', command=self.start)  self.startButton.place(x=480 * self.size, y=200 * self.size)  self.giveUpButton = Button(self, text='弃一手', command=self.give_up)  self.giveUpButton.place(x=480 * self.size, y=225 * self.size)  self.regretButton = Button(self, text='悔棋', command=self.regret_chess)  self.regretButton.place(x=480 * self.size, y=250 * self.size)  # 初始悔棋按钮禁用  self.regretButton['state'] = DISABLED  self.replayButton = Button(self, text='重新开始', command=self.reload)  self.replayButton.place(x=480 * self.size, y=275 * self.size)  self.newGameButton1 = Button(self, text=('十三' if self.mode_num == 9 else '九') + '路棋', command=self.new_game_one)  self.newGameButton1.place(x=480 * self.size, y=300 * self.size)  self.newGameButton2 = Button(self, text=('十三' if self.mode_num == 19 else '十九') + '路棋',  command=self.new_game_second)  self.newGameButton2.place(x=480 * self.size, y=325 * self.size)  self.quitButton = Button(self, text='退出游戏', command=self.quit)  self.quitButton.place(x=480 * self.size, y=350 * self.size)  # 画棋盘,填充颜色  self.canvas_bottom.create_rectangle(0 * self.size, 0 * self.size, 400 * self.size, 400 * self.size, fill='#d0892e')  # 刻画棋盘线及九个点  # 先画外框粗线  self.canvas_bottom.create_rectangle(20 * self.size, 20 * self.size, 380 * self.size, 380 * self.size, width=3)  # 棋盘上的九个定位点,以中点为模型,移动位置,以作出其余八个点  for m in [-1, 0, 1]:  for n in [-1, 0, 1]:  self.original = self.canvas_bottom.create_oval(  200 * self.size - self.size * 2,  200 * self.size - self.size * 2,  200 * self.size + self.size * 2,  200 * self.size + self.size * 2, fill='#000')  self.canvas_bottom.move(  self.original,  m * self.dd * (2 if self.mode_num == 9 else (3 if self.mode_num == 13 else 6)),  n * self.dd * (2 if self.mode_num == 9 else (3 if self.mode_num == 13 else 6)))  # 画中间的线条  for i in range(1, self.mode_num - 1):  self.canvas_bottom.create_line(20 * self.size, 20 * self.size + i * self.dd, 380 * self.size,  20 * self.size + i * self.dd, width=2)  self.canvas_bottom.create_line(20 * self.size + i * self.dd, 20 * self.size, 20 * self.size + i * self.dd,  380 * self.size, width=2)  # 放置右侧初始图片  self.pW = None  # 默认黑棋先手  self.pB = self.canvas_bottom.create_image(500 * self.size + 11, 65 * self.size, image=self.image_B)  # 每张图片都添加image标签,方便reload函数删除图片  self.canvas_bottom.addtag_withtag('image', self.pB)  self.bButton = Button(self, text='黑棋先手', command=self.first_b)  self.bButton.place(x=480 * self.size, y=100 * self.size)  self.wButton = Button(self, text='白棋先手', command=self.first_w)  self.wButton.place(x=480 * self.size, y=120 * self.size)  # 鼠标移动时,调用shadow函数,显示随鼠标移动的棋子  self.canvas_bottom.bind('<Motion>', self.shadow)  # 鼠标左键单击时,调用get_down函数,放下棋子  self.canvas_bottom.bind('<Button-1>', self.get_down)  # 设置退出快捷键<Ctrl>+<D>,快速退出游戏  self.bind('<Control-KeyPress-d>', self.keyboard_quit)  def first_b(self):  """  @summary: 黑棋先手  :return:  """        self.present = 0  self.create_pb()  self.del_pw()  if self.stop:  self.bButton['state'] = DISABLED  self.wButton['state'] = NORMAL  else:  self.bButton['state'] = DISABLED  self.wButton['state'] = DISABLED  def first_w(self):  """  @summary: 白棋先手  :return:  """        self.present = 1  self.create_pw()  self.del_pb()  if self.stop:  self.wButton['state'] = DISABLED  self.bButton['state'] = NORMAL  else:  self.bButton['state'] = DISABLED  self.wButton['state'] = DISABLED  # 开始游戏函数,点击“开始游戏”时调用  def start(self):  # 禁止选先手  self.bButton['state'] = DISABLED  self.wButton['state'] = DISABLED  # 利用右侧图案提示开始时谁先落子  if self.present == 0:  self.create_pb()  self.del_pw()  else:  self.create_pw()  self.del_pb()  # 开始标志,解除stop  self.stop = None  # 放弃一手函数,跳过落子环节  def give_up(self):  # 悔棋恢复  if not self.regret_chance == 1:  self.regret_chance += 1  else:  self.regretButton['state'] = NORMAL  # 拷贝棋盘状态,记录前三次棋局  self.last_3_positions = copy.deepcopy(self.last_2_positions)  self.last_2_positions = copy.deepcopy(self.last_1_positions)  self.last_1_positions = copy.deepcopy(self.positions)  self.canvas_bottom.delete('image_added_sign')  # 轮到下一玩家  if self.present == 0:  self.create_pw()  self.del_pb()  self.present = 1  else:  self.create_pb()  self.del_pw()  self.present = 0  # 悔棋函数,可悔棋一回合,下两回合不可悔棋  def regret_chess(self):  # 判定是否可以悔棋,以前第三盘棋局复原棋盘  if self.regret_chance == 1:  self.regret_chance = 0  self.regretButton['state'] = DISABLED  list_of_b = []  list_of_w = []  self.canvas_bottom.delete('image')  if self.present == 0:  self.create_pb()  else:  self.create_pw()  for m in range(1, self.mode_num + 1):  for n in range(1, self.mode_num + 1):  self.positions[m][n] = 0  for m in range(len(self.last_3_positions)):  for n in range(len(self.last_3_positions[m])):  if self.last_3_positions[m][n] == 1:  list_of_b += [[n, m]]  elif self.last_3_positions[m][n] == 2:  list_of_w += [[n, m]]  self.recover(list_of_b, 0)  self.recover(list_of_w, 1)  self.last_1_positions = copy.deepcopy(self.last_3_positions)  for m in range(1, self.mode_num + 1):  for n in range(1, self.mode_num + 1):  self.last_2_positions[m][n] = 0  self.last_3_positions[m][n] = 0  # 重新加载函数,删除图片,序列归零,设置一些初始参数,点击“重新开始”时调用  def reload(self):  if self.stop == 1:  self.stop = 0  self.canvas_bottom.delete('image')  self.regret_chance = 0  self.present = 0  self.create_pb()  for m in range(1, self.mode_num + 1):  for n in range(1, self.mode_num + 1):  self.positions[m][n] = 0  self.last_3_positions[m][n] = 0  self.last_2_positions[m][n] = 0  self.last_1_positions[m][n] = 0  # 以下四个函数实现了右侧太极图的动态创建与删除  def create_pw(self):  """  @summary: 创建白棋  :return:  """        self.pW = self.canvas_bottom.create_image(500 * self.size + 11, 65 * self.size, image=self.image_W)  self.canvas_bottom.addtag_withtag('image', self.pW)  def create_pb(self):  """  @summary: 创建黑棋  :return:  """        self.pB = self.canvas_bottom.create_image(500 * self.size + 11, 65 * self.size, image=self.image_B)  self.canvas_bottom.addtag_withtag('image', self.pB)  def del_pw(self):  if self.pW:  self.canvas_bottom.delete(self.pW)  def del_pb(self):  if self.pB:  self.canvas_bottom.delete(self.pB)  # 显示鼠标移动下棋子的移动  def shadow(self, event):  if not self.stop:  # 找到最近格点,在当前位置靠近的格点出显示棋子图片,并删除上一位置的棋子图片  if (20 * self.size < event.x < 380 * self.size) and (20 * self.size < event.y < 380 * self.size):  dx = (event.x - 20 * self.size) % self.dd  dy = (event.y - 20 * self.size) % self.dd  self.cross = self.canvas_bottom.create_image(  event.x - dx + round(dx / self.dd) * self.dd + 22 * self.p,  event.y - dy + round(dy / self.dd) * self.dd - 27 * self.p,  image=self.chequer_wbu_list[self.present])  self.canvas_bottom.addtag_withtag('image', self.cross)  if self.cross_last is not None:  self.canvas_bottom.delete(self.cross_last)  self.cross_last = self.cross  # 落子,并驱动玩家的轮流下棋行为  def get_down(self, event):  if not self.stop:  # 先找到最近格点  if (20 * self.size - self.dd * 0.4 < event.x < self.dd * 0.4 + 380 * self.size) and \  (20 * self.size - self.dd * 0.4 < event.y < self.dd * 0.4 + 380 * self.size):  dx = (event.x - 20 * self.size) % self.dd  dy = (event.y - 20 * self.size) % self.dd  x = int((event.x - 20 * self.size - dx) / self.dd + round(dx / self.dd) + 1)  y = int((event.y - 20 * self.size - dy) / self.dd + round(dy / self.dd) + 1)  # 判断位置是否已经被占据  if self.positions[y][x] == 0:  # 未被占据,则尝试占据,获得占据后能杀死的棋子列表  self.positions[y][x] = self.present + 1  self.image_added = self.canvas_bottom.create_image(  event.x - dx + round(dx / self.dd) * self.dd + 4 * self.p,  event.y - dy + round(dy / self.dd) * self.dd - 5 * self.p,  image=self.chequer_wbd_list[self.present])  self.canvas_bottom.addtag_withtag('image', self.image_added)  # 棋子与位置标签绑定,方便“杀死”  self.canvas_bottom.addtag_withtag('position' + str(x) + str(y), self.image_added)  dead_list = self.get_dead_list(x, y)  self.kill(dead_list)  # 判断是否重复棋局  if not self.last_2_positions == self.positions:  # 判断是否属于有气和杀死对方其中之一  if len(dead_list) > 0 or self.if_dead([[x, y]], self.present + 1, [x, y]) == False:  # 当不重复棋局,且属于有气和杀死对方其中之一时,落下棋子有效  if not self.regret_chance == 1:  self.regret_chance += 1  else:  self.regretButton['state'] = NORMAL  self.last_3_positions = copy.deepcopy(self.last_2_positions)  self.last_2_positions = copy.deepcopy(self.last_1_positions)  self.last_1_positions = copy.deepcopy(self.positions)  # 删除上次的标记,重新创建标记  self.canvas_bottom.delete('image_added_sign')  self.image_added_sign = self.canvas_bottom.create_oval(  event.x - dx + round(dx / self.dd) * self.dd + 0.5 * self.dd,  event.y - dy + round(dy / self.dd) * self.dd + 0.5 * self.dd,  event.x - dx + round(dx / self.dd) * self.dd - 0.5 * self.dd,  event.y - dy + round(dy / self.dd) * self.dd - 0.5 * self.dd, width=3, outline='#3ae')  self.canvas_bottom.addtag_withtag('image', self.image_added_sign)  self.canvas_bottom.addtag_withtag('image_added_sign', self.image_added_sign)  if self.present == 0:  self.create_pw()  self.del_pb()  self.present = 1  else:  self.create_pb()  self.del_pw()  self.present = 0  else:  # 不属于杀死对方或有气,则判断为无气,警告并弹出警告框  self.positions[y][x] = 0  self.canvas_bottom.delete('position' + str(x) + str(y))  self.bell()  self.show_warning_box('无气', "你被包围了!")  else:  # 重复棋局,警告打劫  self.positions[y][x] = 0  self.canvas_bottom.delete('position' + str(x) + str(y))  self.recover(dead_list, (1 if self.present == 0 else 0))  self.bell()  self.show_warning_box("打劫", "此路不通!")  else:  # 覆盖,声音警告  self.bell()  else:  # 超出边界,声音警告  self.bell()  def if_dead(self, dead_list, your_chess, your_position):  """  判断棋子(种类为 your_chess,位置为 your_position)是否无气(死亡)。  如果棋子有气,则返回 False,表示棋子存活。  如果棋子无气,则返回包含所有无气棋子位置的列表。  参数:  - dead_list: 一个列表,初始时包含当前正在检查的棋子的位置。  - your_chess: 当前正在检查的棋子的种类。  - your_position: 当前正在检查的棋子的位置。  返回值:  - 如果棋子有气,返回 False。  - 如果棋子无气,返回包含所有无气棋子位置的列表。  函数逻辑:  1. 检查当前棋子周围是否有空位,如果有,则棋子有气,返回 False。  2. 如果周围没有空位,检查周围是否有同类棋子,如果有,则递归调用 if_dead 函数检查这些棋子是否有气。  3. 如果递归调用返回 False,表示至少有一个同类棋子有气,当前棋子也有气,返回 False。  4. 如果递归调用返回一个列表,表示所有检查的同类棋子都无气,将这些棋子的位置添加到 dead_list 中。  5. 如果所有周围的同类棋子都检查完毕且都无气,返回 dead_list,表示当前棋子无气。  """        # 检查上下左右四个方向是否有空位  for i in [-1, 1]:  # 检查上方和下方  if [your_position[0] + i, your_position[1]] not in dead_list:  if self.positions[your_position[1]][your_position[0] + i] == 0:  return False  # 如果有空位,当前棋子有气  # 检查左侧和右侧  if [your_position[0], your_position[1] + i] not in dead_list:  if self.positions[your_position[1] + i][your_position[0]] == 0:  return False  # 如果有空位,当前棋子有气  # 检查四个方向上是否有同类棋子,并递归检查这些棋子是否有气  # 上方的同类棋子  if ([your_position[0] + 1, your_position[1]] not in dead_list) and (  self.positions[your_position[1]][your_position[0] + 1] == your_chess):  mid = self.if_dead(dead_list + [[your_position[0] + 1, your_position[1]]], your_chess,  [your_position[0] + 1, your_position[1]])  if not mid:  return False  # 如果上方同类棋子有气,则当前棋子也有气  else:  dead_list += copy.deepcopy(mid)  # 如果无气,将棋子位置添加到列表中  # 下方的同类棋子,逻辑同上  # ...  # 左侧的同类棋子,逻辑同上  # ...  # 右侧的同类棋子,逻辑同上  # ...  # 如果所有检查都完成,没有找到有气的同类棋子,则当前棋子无气,返回包含所有无气棋子位置的列表  return dead_list  # 警告消息框,接受标题和警告信息  def show_warning_box(self, title, message):  self.canvas_bottom.delete(self.cross)  tkinter.messagebox.showwarning(title, message)  # 落子后,依次判断四周是否有棋子被杀死,并返回死棋位置列表  def get_dead_list(self, x, y):  dead_list = []  for i in [-1, 1]:  if self.positions[y][x + i] == (2 if self.present == 0 else 1) and ([x + i, y] not in dead_list):  kill = self.if_dead([[x + i, y]], (2 if self.present == 0 else 1), [x + i, y])  if kill:  dead_list += copy.deepcopy(kill)  if self.positions[y + i][x] == (2 if self.present == 0 else 1) and ([x, y + i] not in dead_list):  kill = self.if_dead([[x, y + i]], (2 if self.present == 0 else 1), [x, y + i])  if kill:  dead_list += copy.deepcopy(kill)  return dead_list  # 恢复位置列表list_to_recover为b_or_w指定的棋子  def recover(self, list_to_recover, b_or_w):  if len(list_to_recover) > 0:  for i in range(len(list_to_recover)):  self.positions[list_to_recover[i][1]][list_to_recover[i][0]] = b_or_w + 1  self.image_added = self.canvas_bottom.create_image(  20 * self.size + (list_to_recover[i][0] - 1) * self.dd + 4 * self.p,  20 * self.size + (list_to_recover[i][1] - 1) * self.dd - 5 * self.p,  image=self.chequer_wbd_list[b_or_w])  self.canvas_bottom.addtag_withtag('image', self.image_added)  self.canvas_bottom.addtag_withtag('position' + str(list_to_recover[i][0]) + str(list_to_recover[i][1]),  self.image_added)  # 杀死位置列表killList中的棋子,即删除图片,位置值置0  def kill(self, kill_list):  if len(kill_list) > 0:  for i in range(len(kill_list)):  self.positions[kill_list[i][1]][kill_list[i][0]] = 0  self.canvas_bottom.delete('position' + str(kill_list[i][0]) + str(kill_list[i][1]))  # 键盘快捷键退出游戏  def keyboard_quit(self, event):  self.quit()  # 以下两个函数修改全局变量值,newApp使主函数循环,以建立不同参数的对象  def new_game_one(self):  global MODE_NUM, NEW_APP  MODE_NUM = (13 if self.mode_num == 9 else 9)  NEW_APP = True  self.quit()  def new_game_second(self):  global MODE_NUM, NEW_APP  MODE_NUM = (13 if self.mode_num == 19 else 19)  NEW_APP = True  self.quit()  # 声明全局变量,用于新建Application对象时切换成不同模式的游戏  if __name__ == '__main__':  # 循环,直到不切换游戏模式  while True:  NEW_APP = False  app = Application(MODE_NUM)  app.title('围棋')  app.mainloop()  if NEW_APP:  app.destroy()  else:  break

源码地址:Python 围棋

在这里插入图片描述

实现思路

这段 Python 代码实现了一个基于 tkinter 的围棋游戏 GUI。以下是实现的主要思路:

  1. 初始化界面:创建一个 Tk 窗口,设置窗口大小,并加载所需的图片资源。

  2. 棋盘和棋子:初始化一个二维数组来表示棋盘,数组中的元素表示棋盘上的位置状态(空、黑棋、白棋)。使用 Canvas 控件绘制棋盘和棋子。

  3. 棋子下法:通过鼠标点击画布来放置棋子。棋子的放置逻辑包括判断位置是否有效、是否被占据,以及放置后是否形成打劫(即重复之前的局面)。

  4. 悔棋功能:允许玩家悔棋,即撤销上一步操作。悔棋后棋盘状态回退到前一次的状态。

  5. 重新开始游戏:允许玩家重新开始游戏,重置棋盘状态和界面元素。

  6. 切换棋盘大小:支持 9 路、13 路和 19 路棋盘,玩家可以通过按钮切换棋盘大小。

  7. 玩家交替落子:通过变量 present 来记录当前轮到哪个玩家落子,0 表示黑棋,1 表示白棋。

  8. 判断死活:实现了一个递归函数 if_dead 来判断棋子是否被完全包围(即无气),如果是,则认为该棋子死亡。

  9. 界面交互:包括开始游戏、弃一手(跳过当前回合)、悔棋、重新开始、切换棋盘大小和退出游戏等按钮。

  10. 图形用户界面元素:使用 tkinter 的 ButtonCanvas 等组件来构建用户界面。

  11. 事件绑定:通过绑定鼠标事件和键盘事件来响应用户的交互操作。

  12. 辅助功能:包括显示警告框、声音提示等,以增强用户体验。

整体上,这段代码通过 tkinter 模块实现了一个基本的围棋游戏,包括棋盘的绘制、棋子的下法、悔棋功能以及基本的用户交互。代码结构清晰,功能模块化,易于理解和扩展。

源码地址:Python 围棋

Python 爱心代码:https://stormsha.blog.csdn.net/article/details/138199890
Python 植物大战僵尸:https://stormsha.blog.csdn.net/article/details/138405944
Python 开心消消乐:https://stormsha.blog.csdn.net/article/details/139220748

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/360367.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

性能测试(五)—— 数据库性能测试-mysql

1 mysql性能测试的主要内容 MySQL数据库介绍MySQL数据库监控指标MySQL慢查询工作原理及操作SQL的分析与调优方法MySQL索引的概念及作用MySQL索引的工作原理与设计规范MySQL存储引擎MySQL实时监控MySQL集群监控方案MySQL性能测试的用例准备使用Jmeter开发MySQL性能测试脚本执行…

鸿蒙NEXT实战开发: 依据前端对http请求进行二次简单封装

一、为什么要对http请求进行封装&#xff1f; 在我看来二次封装有一下几点好处 代码封装之后&#xff0c;开发人员只用关注业务层面的东西&#xff0c;不用去过多浪费时间在接口请求数据处理上。封装之后代码更加简洁&#xff0c;通俗易懂&#xff0c;方便后期维护&#xff0…

微服务中的相关概念

Eureka Eureka 是由 Netflix 开发的一个服务发现和注册中心&#xff0c;广泛应用于微服务架构中。Eureka 主要用于管理和协调分布式服务的注册和发现&#xff0c;确保各个服务之间能够方便地找到并通信。它是 Netflix OSS&#xff08;Netflix Open Source Software&#xff09…

OpenAI突然宣布停止向中国提供API服务!

标题 &#x1f31f; OpenAI突然宣布停止向中国提供API服务! &#x1f31f;摘要 &#x1f4dc;引言 &#x1f4e2;正文 &#x1f4dd;1. OpenAI API的重要性2. 停止服务的原因分析3. 对中国市场的影响4. 应对措施代码案例 &#x1f4c2;常见问题解答&#xff08;QA&#xff09;❓…

OpenAI禁止国区使用:免费国产大模型等你体验!

OpenAI中国停服 国产大模型免费使用 前言 OpenAI不支持中国区域访问 从6月25日开始&#xff0c;OpenAI 宣布了对中国停止提供 API 服务&#xff0c;毫无疑问的说这给国内的开发者带来了很大的不便&#xff0c;之后他们怎么去使用GPT 这类先进大模型方面遇到了难题。不过近期我们…

【ARMv8/ARMv9 硬件加速系列 3.4 -- SVE 复制指令CPY 使用介绍】

文章目录 SVE 复制指令CPYSVE 指令格式SVE 使用语法SVE CPY 使用示例SVE CPY 小结SVE 复制指令CPY CPY <Zd>.<T>, <Pg>/M, #<imm>{, <shift>}cpy 指令在 ARMv9 的

让我们聊聊网络安全中会涉及到的IP地址(IP协议)、MAC地址、路由、DNS协议(域名系统)、NAT技术(协议)、以太网帧、ARP协议

网络安全中会涉及到的IP地址&#xff08;IP协议&#xff09;、MAC地址、路由、DNS协议&#xff08;域名系统&#xff09;、NAT技术&#xff08;协议&#xff09;、以太网帧、ARP协议 一.IP地址&#xff08;IP协议&#xff09;1.IP地址&#xff08;IP协议&#xff09;的作用2.IP…

C语言·动态内存管理

1. 为什么要有动态内存管理&#xff1f; 例1&#xff1a; //固定的向内存申请4个字节 int a 10;//申请连续的一块空间 int arr[10]; 这些数据一旦声明定义之后就会在内存中有一块空间&#xff0c;这些空间都是固定的&#xff0c;为了让内存使用更加灵活&#xff0c;这时我们…

Python火焰锋动力学和浅水表面波浪偏微分方程

&#x1f3af;要点 &#x1f3af;流图可视化正弦余弦矢量场 | &#x1f3af;解空间变化边界条件二维拉普拉斯方程 | &#x1f3af;解圆柱坐标系标量场 | &#x1f3af;解一维泊松方程 | &#x1f3af;解二维扩散方程 | &#x1f3af;解火焰锋的动力学偏微分方程 | &#x1f3a…

[C#]winform基于opencvsharp实现黑白图像上色

【算法简介】 技术有时会提高艺术&#xff0c;但有时也会破坏艺术。着色黑白电影是一个可以追溯到1902年的古老想法。几十年来&#xff0c;许多电影创作者反对将黑白电影着色的想法&#xff0c;并将其视为对艺术的破坏。但今天它被接受为艺术形式的增强。该技术本身已经从艰苦…

2024年最新机动车签字授权人考试题库。

31."简易瞬态工况法"所使用的五气分析仪的温度范图:分析系统及相关部件应在&#xff08; &#xff09;。 A.0-40℃ B.0-50℃ C.0-60℃ D.-10-40℃ 答案:A 32.稀释氧传感器环境空气量程检测时的读数值位于&#xff08; &#xff09;%vol范围之外时&#xff0c;应…

[word] Word如何删除所有的空行? #职场发展#学习方法

Word如何删除所有的空行&#xff1f; 很多网友从网页复制文字粘贴到word文档后发现段落之间有空行&#xff0c;如果文字不多&#xff0c;手动删除这些空行也没有多少工作量&#xff0c;但是如果文字的字数达到成千上万&#xff0c;一个个手动删除这些空行还是很繁琐的。那么&a…

【Docker】Consul 和API

目录 一、Consul 1. 拉取镜像 2. 启动第一个consul服务&#xff1a;consul1 3. 查看consul service1 的ip地址 4. 启动第二个consul服务&#xff1a;consul2&#xff0c; 并加入consul1&#xff08;使用join命令&#xff09; 5. 启动第三个consul服务&#xff1a;consul3&…

解决ubuntu18.04 安装vscode 报依赖库错误,以及打不开终端的问题。

其实很简单&#xff0c;ubuntu18.04太老了&#xff0c;官网最新版本的vscode对ubuntu18.04会有些依赖库的问题。 一顿查资料后发现2023.11月的1.85版本正常使用&#xff0c;于是完美解决。 下载链接 Visual Studio Code November 2023 点击这里下载。 下载完成&#xff0c;…

iptables配置NAT实现端口转发

加载防火墙的内核模块 modprobe ip_tables modprobe ip_nat_ftp modprobe ip_conntrack 1.开启路由转发功能 echo net.ipv4.ip_forward 1 >> /etc/sysctl.conf sysctl -p2、将本地的端口转发到本机端口 将本机的 7777 端口转发到 6666 端口。 iptables -t nat -A PR…

MATLAB算法实战应用案例精讲-【数模应用】线性判别分析(附MATLAB、python和R语言代码实现)

目录 前言 算法原理 什么是判别分析 线性判别分析(LDA) 数学模型 二分类 多分类LDA ​编辑 算法思想: 费歇(FISHER)判别思想 贝叶斯(BAYES)判别思想 LDA算法流程 LDA与PCA对比 SPSSPRO 1、作用 2、输入输出描述 3、案例示例 4、案例数据 5、案例操作 …

java编写的界面可以调用python吗

如何使用Java调用Python程序 本文为大家介绍如何java调用python方法&#xff0c;供大家参考。 实际工程项目中可能会用到Java和python两种语言结合进行&#xff0c;这样就会涉及到一个问题&#xff0c;就是怎么用Java程序来调用已经写好的python脚本呢&#xff0c;一共有三种…

【ai】tx2 nx: trition client安装nvidia-pyindex 一直失败

系统版本的pip和python虚拟环境的pipyolov4-triton-tensorrt的master分支 官方client jetson:pip3 install --user nvidia-pyindex 不成功啊 这个是让nvidia-pyindex 拉取nvidia@tx2-nx:~$ pip3 install --user nvidia-pyindex Collecting nvidia-pyindexDownloading https://…

Elasticsearch:倒数排序融合 - Reciprocal rank fusion - 8.14

警告&#xff1a;此功能处于技术预览阶段&#xff0c;可能会在未来版本中更改或删除。语法可能会在正式发布之前发生变化。Elastic 将努力修复任何问题&#xff0c;但技术预览中的功能不受官方正式发布功能的支持 SLA 约束。 倒数排序融合 (reciprocal rank fusion - RRF) 是一…

APP软件系统的开发流程

APP软件系统的开发是一个复杂的过程&#xff0c;需要多方面的知识和技能。建议选择专业的开发团队进行开发&#xff0c;以确保APP的质量和成功。APP软件系统的开发流程通常包括以下几个阶段。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合…