Python 围棋

news2024/12/27 16:08:34

效果图

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.coloradmin.cn/o/1855292.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高纯PFA容量瓶PFA试剂瓶在半导体材料的应用

在半导体生产过程中&#xff0c;为避免金属污染对硅器件性能造成不利影响&#xff0c;碳化硅产业链不同阶段产品&#xff08;如衬底、外延、芯片、器件&#xff09;表面的痕量杂质元素浓度表征至关重要。 在实验人员使用质谱法高精度检测第三代半导体碳化硅材料的痕量杂质浓度…

Linux - 探秘 Linux 的 /proc/sys/vm 常见核心配置

文章目录 PreLinux 的 /proc/sys/vm 简述什么是 /proc/sys/vm&#xff1f;主要的配置文件及其用途参数调整对系统的影响dirty_background_ratio 和 dirty_ratioswappinessovercommit_memory 和 overcommit_ratiomin_free_kbytes 实例与使用建议调整 swappiness设置 min_free_kb…

2024.6.23刷题记录

目录 一、P1102 A-B 数对 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 1.hash表-一次遍历 2.双指针&#xff08;同向&#xff0c;可以算滑动窗口&#xff09;-排序 二、P8667 [蓝桥杯 2018 省 B] 递增三元组 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 1.排序指针 2…

C++ | Leetcode C++题解之第187题重复的DNA序列

题目&#xff1a; 题解&#xff1a; class Solution {const int L 10;unordered_map<char, int> bin {{A, 0}, {C, 1}, {G, 2}, {T, 3}}; public:vector<string> findRepeatedDnaSequences(string s) {vector<string> ans;int n s.length();if (n < L…

《AI旋律:创意产业的重塑与共生》

AI乐章&#xff1a;技术革命下的创意产业新生态 在数字化浪潮的推动下&#xff0c;音乐创作领域迎来了前所未有的变革——AI音乐大模型的横空出世&#xff0c;犹如一颗石子投入平静的湖面&#xff0c;激起了层层涟漪。这些模型以令人难以置信的速度和多样性&#xff0c;将音乐…

WinForm 2048

WinForm 2048 是一个基于 Windows 窗体应用程序&#xff08;WinForms&#xff09;实现的经典益智游戏——2048。这个游戏通过简单的滑动或点击操作&#xff0c;将相同数字的方块合并&#xff0c;以生成更大的数字方块&#xff0c;最终目标是创造出一个数字为 2048 的方块。 游…

C++ | Leetcode C++题解之第188题买卖股票的最佳时机IV

题目&#xff1a; 题解&#xff1a; class Solution { public:int maxProfit(int k, vector<int>& prices) {if (prices.empty()) {return 0;}int n prices.size();k min(k, n / 2);vector<int> buy(k 1);vector<int> sell(k 1);buy[0] -prices[0]…

Ubuntu 之Glade图形化设计器

演示环境说明&#xff1a;本机使用Windows 11 家庭版本搭载 Ubuntu 22.04.4 LTS 子系统&#xff0c;同时并安装Ubuntu桌面虚拟化软件XLaunch。 如果没有搭建好上述问题&#xff0c;请参考&#xff1a;windows11子系统Ubuntu 22.04.4子安装图形化界面 Glade是什么&#xff1f;…

驾校预约管理系统

摘 要 随着驾驶技术的普及和交通安全意识的增强&#xff0c;越来越多的人选择参加驾校培训&#xff0c;以获取驾驶执照。然而&#xff0c;驾校管理面临着日益增长的学员数量和繁琐的预约管理工作。为了提高驾校的管理效率和服务质量&#xff0c;驾校预约管理系统成为了必不可少…

[spring] Spring MVC - CRUD 操作

[spring] Spring MVC - CRUD 操作 基础实现源自于这两篇笔记&#xff1a; [spring] Spring Boot REST API - 项目实现[spring] Spring Boot REST API - CRUD 操作 除了 Rest API 部分改成了 Controller 之外&#xff0c;其他没什么变化&#xff0c;还是使用 service --> …

6/23 第四周 python操作excel

excel对于python来说就是一个二维数组&#xff0c;只是多了一个多sheet的index的索引&#xff0c;在确定索引之后&#xff0c;不管是读取还是写入&#xff0c;都是类似于二维数组。对于数据的处理&#xff0c;读取和写入就够了&#xff0c;如果要应用图表&#xff0c;个人觉得还…

nest.js关键笔记

Nest.js 介绍核心功能设计模式&#xff1a;IOC 控制反转 DI 依赖注入前置知识&#xff1a;装饰器前置知识装饰器-实现一个GET请求 Nestjs脚手架Nestjs cli 常用命令 RESTful 风格设计Nestjs 控制器控制器中常见的参数装饰器 Session 实例Nestjs 提供者**工厂模式**异步模式 Nes…

Linux 7种 进程间通信方式

传统进程间通信 通过文件实现进程间通信 必须人为保证先后顺序 A--->硬盘---> B&#xff08;B不知道A什么时候把内容传到硬盘中&#xff09; 1.无名管道 2.有名管道 3.信号 IPC进程间通信 4.消息队列 5.共享内存 6.信号灯集 7.socket通信 一、无名管道&a…

《书生·浦语大模型实战营》第5课 学习笔记:LMDeploy 量化部署 LLM 实践

文章大纲 0.背景知识与简介计算机组成原理&#xff1a;变量的存储参数量与推理的关系 1.LMDeploy环境部署1.1 创建开发机1.2 创建conda环境InternStudio开发机创建conda环境&#xff08;推荐&#xff09;本地环境创建conda环境 1.3 安装LMDeploy 2.LMDeploy模型对话(chat)2.1 H…

Golang | Leetcode Golang题解之第187题重复的DNA序列

题目&#xff1a; 题解&#xff1a; const L 10 var bin map[byte]int{A: 0, C: 1, G: 2, T: 3}func findRepeatedDnaSequences(s string) (ans []string) {n : len(s)if n < L {return}x : 0for _, ch : range s[:L-1] {x x<<2 | bin[byte(ch)]}cnt : map[int]in…

Python | Leetcode Python题解之第187题重复的DNA序列

题目&#xff1a; 题解&#xff1a; L 10 bin {A: 0, C: 1, G: 2, T: 3}class Solution:def findRepeatedDnaSequences(self, s: str) -> List[str]:n len(s)if n < L:return []ans []x 0for ch in s[:L - 1]:x (x << 2) | bin[ch]cnt defaultdict(int)for…

期货交易纪律2024年6月22号

文章目录 期货交易系统构建第一步、选品第二步、开仓纪律第三步、持仓 2024年6月22号&#xff0c;开始写期货交易的第三篇日记。 交易记录&#xff1a;市场继续震荡&#xff0c;这两天无交易&#xff0c;继续梳理一些期货交易选品&#xff0c;周末详细的了解了一下豆粕&#xf…

axure制作菜单下拉、隐藏、点击选中效果

在高保真原型中&#xff0c;制作导航栏菜单时&#xff0c;需要达到点击下拉按钮&#xff0c;子菜单自动弹出&#xff0c;点击其中一个子菜单项可栏目变为选中状态且跳转到对应的子页面。制作材料可以从antdesign中去下载&#xff0c;以下述网络配置菜单为例。在箭头处添加互动效…

Pytest和Unitest框架对比

在学到自动化的时候,很多同学都遇到了Pytest和Unitest框架,有的人是两个都学,但是学的不精只是知道分别怎么用.不了解两个区别是什么.有的是犹豫到底要学习那个框架.其实要做好自动化测试,是有必要了解不同框架之间的差异化的. Pytest 特点: Pytest采用了更简洁、更灵活的语法…

C语言 | Leetcode C语言题解之第187题重复的DNA序列

题目&#xff1a; 题解&#xff1a; #define MAXSIZE 769/* 选取一个质数即可 */ typedef struct Node {char string[101];int index;struct Node *next; //保存链表表头 } List;typedef struct {List *hashHead[MAXSIZE];//定义哈希数组的大小 } MyHashMap;List * …