【Dison夏令营 Day 12】如何用 Python 构建数独游戏

通过本综合教程,学习如何使用 Pygame 在 Python 中创建自己的数独游戏。本指南涵盖安装、游戏逻辑、用户界面和计时器功能,是希望创建功能性和可扩展性数独益智游戏的爱好者的理想之选。

数独是一种经典的数字谜题,多年来一直吸引着谜题爱好者。在本教程中,我们将介绍使用 Python 创建数独游戏的过程。本指南结束时,您将拥有一个功能齐全的数独游戏,您可以玩这个游戏,甚至可以进一步扩展。

安装和设置

让我们先确保 Pygame 已安装在电脑上;前往终端,使用 pip 安装 pygame 模块。

$ pip install pygame

然后,为游戏创建一个目录,并在其中创建以下 .py 文件:settings.pymain.pysudoku.pycell.pytable.pyclock.py

在这里插入图片描述

让我们在 settings.py 中定义游戏变量和有用的外部函数:

# setting.py
from itertools import isliceWIDTH, HEIGHT = 450, 450
N_CELLS = 9
CELL_SIZE = (WIDTH // N_CELLS, HEIGHT // N_CELLS)# Convert 1D list to 2D list
def convert_list(lst, var_lst):it = iter(lst)return [list(islice(it, i)) for i in var_lst]

接下来,让我们创建游戏的主类。该类将负责调用游戏和运行游戏循环:

# main.py
import pygame, sys
from settings import WIDTH, HEIGHT, CELL_SIZE
from table import Tablepygame.init()screen = pygame.display.set_mode((WIDTH, HEIGHT + (CELL_SIZE[1] * 3)))
pygame.display.set_caption("Sudoku")pygame.font.init()class Main:def __init__(self, screen):self.screen = screenself.FPS = pygame.time.Clock()self.lives_font = pygame.font.SysFont("monospace", CELL_SIZE[0] // 2)self.message_font = pygame.font.SysFont('Bauhaus 93', (CELL_SIZE[0]))self.color = pygame.Color("darkgreen")def main(self):table = Table(self.screen)while True:self.screen.fill("gray")for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.MOUSEBUTTONDOWN:if not table.game_over:table.handle_mouse_click(event.pos)# lower screen displayif not table.game_over:my_lives = self.lives_font.render(f"Lives Left: {table.lives}", True, pygame.Color("black"))self.screen.blit(my_lives, ((WIDTH // table.SRN) - (CELL_SIZE[0] // 2), HEIGHT + (CELL_SIZE[1] * 2.2)))else:if table.lives <= 0:message = self.message_font.render("GAME OVER!!", True, pygame.Color("red"))self.screen.blit(message, (CELL_SIZE[0] + (CELL_SIZE[0] // 2), HEIGHT + (CELL_SIZE[1] * 2)))elif table.lives > 0:message = self.message_font.render("You Made It!!!", True, self.color)self.screen.blit(message, (CELL_SIZE[0] , HEIGHT + (CELL_SIZE[1] * 2)))table.update()pygame.display.flip()self.FPS.tick(30)if __name__ == "__main__":play = Main(screen)play.main()

从名称本身来看,Main 类将是我们游戏的主类。它的参数 screen 将作为游戏窗口,用于制作游戏动画。

main() 函数将运行并更新我们的游戏。它将首先初始化 Table(作为谜题表)。为了保持游戏运行而不故意退出,我们在其中设置了一个 while 循环。在循环内部,我们还将设置另一个循环(for 循环),它将捕捉游戏窗口内发生的所有事件,如按键、鼠标移动、鼠标按键点击或玩家点击退出键等事件。

main() 还负责显示玩家的 "剩余生命 "和游戏结束信息,无论玩家是赢还是输。为了更新游戏,我们调用 table.update() 来更新游戏表中的变化。然后,pygame.display.flip() 会呈现这些变化。self.FPS.tick(30) 控制帧频更新速度。

生成数独谜题

sudoku() 类将负责为我们随机生成数独谜题。在 sudoku.py 中创建一个类并命名为 Sudoku。首先导入必要的模块:random, mathcopy

# sudoku.py
import random
import math
import copyclass Sudoku:def __init__(self, N, E):self.N = Nself.E = E# compute square root of Nself.SRN = int(math.sqrt(N))self.table = [[0 for x in range(N)] for y in range(N)]self.answerable_table = Noneself._generate_table()def _generate_table(self):# fill the subgroups diagonally table/matricesself.fill_diagonal()# fill remaining empty subgroupsself.fill_remaining(0, self.SRN)# Remove random Key digits to make gameself.remove_digits()

该类有一个初始化方法(__init__()),需要两个参数NE,分别代表数独网格的大小和创建谜题时需要移除的单元格数。类属性包括 N(网格大小)、E(需要删除的单元格数)、SRN(N 的平方根)、table(数独网格)和 answerable_table(删除部分单元格后的网格副本)。在创建对象时,会立即调用 _generate_table() 方法来设置数独谜题。

主要数字填充:

    def fill_diagonal(self):for x in range(0, self.N, self.SRN):self.fill_cell(x, x)def not_in_subgroup(self, rowstart, colstart, num):for x in range(self.SRN):for y in range(self.SRN):if self.table[rowstart + x][colstart + y] == num:return Falsereturn Truedef fill_cell(self, row, col):num = 0for x in range(self.SRN):for y in range(self.SRN):while True:num = self.random_generator(self.N)if self.not_in_subgroup(row, col, num):breakself.table[row + x][col + y] = num

fill_diagonal() 方法通过调用每个子组的 fill_cell() 方法对角填充子组。fill_cell() 方法会在每个子组单元格中生成并放置一个唯一的数字。

    def random_generator(self, num):return math.floor(random.random() * num + 1)def safe_position(self, row, col, num):return (self.not_in_row(row, num) and self.not_in_col(col, num) and self.not_in_subgroup(row - row % self.SRN, col - col % self.SRN, num))def not_in_row(self, row, num):for col in range(self.N):if self.table[row][col] == num:return Falsereturn Truedef not_in_col(self, col, num):for row in range(self.N):if self.table[row][col] == num:return Falsereturn Truedef fill_remaining(self, row, col):# check if we have reached the end of the matrixif row == self.N - 1 and col == self.N:return True# move to the next row if we have reached the end of the current rowif col == self.N:row += 1col = 0# skip cells that are already filledif self.table[row][col] != 0:return self.fill_remaining(row, col + 1)# try filling the current cell with a valid valuefor num in range(1, self.N + 1):if self.safe_position(row, col, num):self.table[row][col] = numif self.fill_remaining(row, col + 1):return Trueself.table[row][col] = 0# no valid value was found, so backtrackreturn False

定义了几个辅助方法(random_generator()safe_position()not_in_row()not_in_col()not_in_subgroup())。这些方法有助于生成随机数、检查放置数字的位置是否安全,以及确保行、列或子群中没有已存在的数字。

    def remove_digits(self):count = self.E# replicates the table so we can have a filled and pre-filled copyself.answerable_table = copy.deepcopy(self.table)# removing random numbers to create the puzzle sheetwhile (count != 0):row = self.random_generator(self.N) - 1col = self.random_generator(self.N) - 1if (self.answerable_table[row][col] != 0):count -= 1self.answerable_table[row][col] = 0

remove_digits() 方法会从填满的网格中移除指定数量的随机数字来创建谜题。在移除数字之前,它还会创建一个网格副本(answerable_table)。

    def puzzle_table(self):return self.answerable_tabledef puzzle_answers(self):return self.tabledef print_sudoku(self):for row in range(self.N):for col in range(self.N):print(self.table[row][col], end=" ")print()print("")for row in range(self.N):for col in range(self.N):print(self.answerable_table[row][col], end=" ")print()if __name__ == "__main__":N = 9E = (N * N) // 2sudoku = Sudoku(N, E)sudoku.print_sudoku()

最后 3 个方法负责返回并打印谜题和/或答案。puzzle_table() 返回答案表(去掉部分单元格的谜题)。puzzle_answers() 返回完整的数独表格。print_sudoku() 同时打印完整的数独网格和答案网格。

创建游戏表

在创建游戏网格之前,我们先创建表格单元。在 cell.py 中,创建函数 Cell()

# cell.py
import pygame
from settings import convert_listpygame.font.init()class Cell:def __init__(self, row, col, cell_size, value, is_correct_guess = None):self.row = rowself.col = colself.cell_size = cell_sizeself.width = self.cell_size[0]self.height = self.cell_size[1]self.abs_x = row * self.widthself.abs_y = col * self.heightself.value = valueself.is_correct_guess = is_correct_guessself.guesses = None if self.value != 0 else [0 for x in range(9)]self.color = pygame.Color("white")self.font = pygame.font.SysFont('monospace', self.cell_size[0])self.g_font = pygame.font.SysFont('monospace', (cell_size[0] // 3))self.rect = pygame.Rect(self.abs_x,self.abs_y,self.width,self.height)def update(self, screen, SRN = None):pygame.draw.rect(screen, self.color, self.rect)if self.value != 0:font_color = pygame.Color("black") if self.is_correct_guess else pygame.Color("red")num_val = self.font.render(str(self.value), True, font_color)screen.blit(num_val, (self.abs_x, self.abs_y))elif self.value == 0 and self.guesses != None:cv_list = convert_list(self.guesses, [SRN, SRN, SRN])for y in range(SRN):for x in range(SRN):num_txt = " "if cv_list[y][x] != 0:num_txt = cv_list[y][x]num_txt = self.g_font.render(str(num_txt), True, pygame.Color("orange"))abs_x = (self.abs_x + ((self.width // SRN) * x))abs_y = (self.abs_y + ((self.height // SRN) * y))abs_pos = (abs_x, abs_y)screen.blit(num_txt, abs_pos)

Cell() 类的属性包括:rowcol(单元格在表格中的位置)、cell_sizewidthheightabs_xabs_y(单元格在屏幕上的绝对 x 坐标和 y 坐标)、value(数值,空单元格为 0)、is_correct_guess(表示当前值是否为正确的猜测值)和 guesses(列表,表示空单元格的可能猜测值,如果单元格已填充,则表示无)。

update() 方法负责更新屏幕上单元格的图形表示。它使用 pygame.draw.rect 绘制一个指定颜色的矩形。根据单元格是填充的(value != 0)还是空的(value ==0),它要么在填充的单元格中绘制数值,要么在空的单元格中绘制可能的猜测。

如果单元格为空并且有可能的猜测,则使用 convert_list() 函数将猜测列表转换为二维列表。然后遍历转换后的列表,并在单元格的相应位置绘制每个猜测。它会使用小字体 (g_font) 将每个猜测渲染为文本。根据二维列表中的位置,计算每个猜测在单元格中的绝对位置。然后,在计算出的位置将文本显示(绘制)到屏幕上。

现在,让我们继续创建游戏表格。在 table.py 中创建一个类并命名为 Table。它使用 Pygame 库创建数独网格,处理用户输入,并显示谜题、数字选择、按钮和计时器。

import pygame
import math
from cell import Cell
from sudoku import Sudoku
from clock import Clockfrom settings import WIDTH, HEIGHT, N_CELLS, CELL_SIZEpygame.font.init()class Table:def __init__(self, screen):self.screen = screenself.puzzle = Sudoku(N_CELLS, (N_CELLS * N_CELLS) // 2)self.clock = Clock()self.answers = self.puzzle.puzzle_answers()self.answerable_table = self.puzzle.puzzle_table()self.SRN = self.puzzle.SRNself.table_cells = []self.num_choices = []self.clicked_cell = Noneself.clicked_num_below = Noneself.cell_to_empty = Noneself.making_move = Falseself.guess_mode = Trueself.lives = 3self.game_over = Falseself.delete_button = pygame.Rect(0, (HEIGHT + CELL_SIZE[1]), (CELL_SIZE[0] * 3), (CELL_SIZE[1]))self.guess_button = pygame.Rect((CELL_SIZE[0] * 6), (HEIGHT + CELL_SIZE[1]), (CELL_SIZE[0] * 3), (CELL_SIZE[1]))self.font = pygame.font.SysFont('Bauhaus 93', (CELL_SIZE[0] // 2))self.font_color = pygame.Color("white")self._generate_game()self.clock.start_timer()def _generate_game(self):# generating sudoku tablefor y in range(N_CELLS):for x in range(N_CELLS):cell_value = self.answerable_table[y][x]is_correct_guess = True if cell_value != 0 else Falseself.table_cells.append(Cell(x, y, CELL_SIZE, cell_value, is_correct_guess))# generating number choicesfor x in range(N_CELLS):self.num_choices.append(Cell(x, N_CELLS, CELL_SIZE, x + 1))

Table 类的 __init__() 方法(构造函数)初始化了各种属性,如 Pygame 屏幕、数独谜题、时钟、答案、可回答的表格以及其他与游戏相关的变量。

    def _draw_grid(self):grid_color = (50, 80, 80)pygame.draw.rect(self.screen, grid_color, (-3, -3, WIDTH + 6, HEIGHT + 6), 6)i = 1while (i * CELL_SIZE[0]) < WIDTH:line_size = 2 if i % 3 > 0 else 4pygame.draw.line(self.screen, grid_color, ((i * CELL_SIZE[0]) - (line_size // 2), 0), ((i * CELL_SIZE[0]) - (line_size // 2), HEIGHT), line_size)pygame.draw.line(self.screen, grid_color, (0, (i * CELL_SIZE[0]) - (line_size // 2)), (HEIGHT, (i * CELL_SIZE[0]) - (line_size // 2)), line_size)i += 1def _draw_buttons(self):# adding delete button detailsdl_button_color = pygame.Color("red")pygame.draw.rect(self.screen, dl_button_color, self.delete_button)del_msg = self.font.render("Delete", True, self.font_color)self.screen.blit(del_msg, (self.delete_button.x + (CELL_SIZE[0] // 2), self.delete_button.y + (CELL_SIZE[1] // 4)))# adding guess button detailsgss_button_color = pygame.Color("blue") if self.guess_mode else pygame.Color("purple")pygame.draw.rect(self.screen, gss_button_color, self.guess_button)gss_msg = self.font.render("Guess: On" if self.guess_mode else "Guess: Off", True, self.font_color)self.screen.blit(gss_msg, (self.guess_button.x + (CELL_SIZE[0] // 3), self.guess_button.y + (CELL_SIZE[1] // 4)))

_draw_grid() 方法负责绘制数独网格;它使用 Pygame 函数根据单元格的大小绘制网格线。_draw_buttons() 方法负责绘制删除和猜测按钮;它使用 Pygame 函数绘制带有适当颜色和信息的矩形按钮。

    def _get_cell_from_pos(self, pos):for cell in self.table_cells:if (cell.row, cell.col) == (pos[0], pos[1]):return cell

_get_cell_from_pos() 方法返回数独表中给定位置(行、列)上的单元格对象。

    # checking rows, cols, and subgroups for adding guesses on each celldef _not_in_row(self, row, num):for cell in self.table_cells:if cell.row == row:if cell.value == num:return Falsereturn Truedef _not_in_col(self, col, num):for cell in self.table_cells:if cell.col == col:if cell.value == num:return Falsereturn Truedef _not_in_subgroup(self, rowstart, colstart, num):for x in range(self.SRN):for y in range(self.SRN):current_cell = self._get_cell_from_pos((rowstart + x, colstart + y))if current_cell.value == num:return Falsereturn True# remove numbers in guess if number already guessed in the same row, col, subgroup correctlydef _remove_guessed_num(self, row, col, rowstart, colstart, num):for cell in self.table_cells:if cell.row == row and cell.guesses != None:for x_idx,guess_row_val in enumerate(cell.guesses):if guess_row_val == num:cell.guesses[x_idx] = 0if cell.col == col and cell.guesses != None:for y_idx,guess_col_val in enumerate(cell.guesses):if guess_col_val == num:cell.guesses[y_idx] = 0for x in range(self.SRN):for y in range(self.SRN):current_cell = self._get_cell_from_pos((rowstart + x, colstart + y))if current_cell.guesses != None:for idx,guess_val in enumerate(current_cell.guesses):if guess_val == num:current_cell.guesses[idx] = 0

方法 _not_in_row()_not_in_col()_not_in_subgroup()_remove_guessed_num() 负责检查数字在行、列或子群中是否有效,并在正确放置后删除猜测的数字。

    def handle_mouse_click(self, pos):x, y = pos[0], pos[1]# getting table cell clickedif x <= WIDTH and y <= HEIGHT:x = x // CELL_SIZE[0]y = y // CELL_SIZE[1]clicked_cell = self._get_cell_from_pos((x, y))# if clicked empty cellif clicked_cell.value == 0:self.clicked_cell = clicked_cellself.making_move = True# clicked unempty cell but with wrong number guesselif clicked_cell.value != 0 and clicked_cell.value != self.answers[y][x]:self.cell_to_empty = clicked_cell# getting number selectedelif x <= WIDTH and y >= HEIGHT and y <= (HEIGHT + CELL_SIZE[1]):x = x // CELL_SIZE[0]self.clicked_num_below = self.num_choices[x].value# deleting numberselif x <= (CELL_SIZE[0] * 3) and y >= (HEIGHT + CELL_SIZE[1]) and y <= (HEIGHT + CELL_SIZE[1] * 2):if self.cell_to_empty:self.cell_to_empty.value = 0self.cell_to_empty = None# selecting modeselif x >= (CELL_SIZE[0] * 6) and y >= (HEIGHT + CELL_SIZE[1]) and y <= (HEIGHT + CELL_SIZE[1] * 2):self.guess_mode = True if not self.guess_mode else False# if making a moveif self.clicked_num_below and self.clicked_cell != None and self.clicked_cell.value == 0:current_row = self.clicked_cell.rowcurrent_col = self.clicked_cell.colrowstart = self.clicked_cell.row - self.clicked_cell.row % self.SRNcolstart = self.clicked_cell.col - self.clicked_cell.col % self.SRNif self.guess_mode:# checking the vertical group, the horizontal group, and the subgroupif self._not_in_row(current_row, self.clicked_num_below) and self._not_in_col(current_col, self.clicked_num_below):if self._not_in_subgroup(rowstart, colstart, self.clicked_num_below):if self.clicked_cell.guesses != None:self.clicked_cell.guesses[self.clicked_num_below - 1] = self.clicked_num_belowelse:self.clicked_cell.value = self.clicked_num_below# if the player guess correctlyif self.clicked_num_below == self.answers[self.clicked_cell.col][self.clicked_cell.row]:self.clicked_cell.is_correct_guess = Trueself.clicked_cell.guesses = Noneself._remove_guessed_num(current_row, current_col, rowstart, colstart, self.clicked_num_below)# if guess is wrongelse:self.clicked_cell.is_correct_guess = Falseself.clicked_cell.guesses = [0 for x in range(9)]self.lives -= 1self.clicked_num_below = Noneself.making_move = Falseelse:self.clicked_num_below = None

handle_mouse_click() 方法根据鼠标在屏幕上的位置来处理鼠标点击。它会相应地更新游戏变量,如 clicked_cellclicked_num_belowcell_to_empty

    def _puzzle_solved(self):check = Nonefor cell in self.table_cells:if cell.value == self.answers[cell.col][cell.row]:check = Trueelse:check = Falsebreakreturn check

_puzzle_solved() 方法通过比较每个单元格中的值与正确答案,检查数独谜题是否已解。

    def update(self):[cell.update(self.screen, self.SRN) for cell in self.table_cells][num.update(self.screen) for num in self.num_choices]self._draw_grid()self._draw_buttons()if self._puzzle_solved() or self.lives == 0:self.clock.stop_timer()self.game_over = Trueelse:self.clock.update_timer()self.screen.blit(self.clock.display_timer(), (WIDTH // self.SRN,HEIGHT + CELL_SIZE[1]))

update 方法负责更新显示内容。它更新单元格和数字的图形表示,绘制网格和按钮,检查谜题是否已解开或游戏是否已结束,以及更新计时器。

添加游戏计时器

在代码的最后一部分,我们要为计时器创建一个类。在 clock.py 中创建时钟类:

import pygame, time
from settings import CELL_SIZEpygame.font.init()class Clock:def __init__(self):self.start_time = Noneself.elapsed_time = 0self.font = pygame.font.SysFont("monospace", CELL_SIZE[0])self.message_color = pygame.Color("black")# Start the timerdef start_timer(self):self.start_time = time.time()# Update the timerdef update_timer(self):if self.start_time is not None:self.elapsed_time = time.time() - self.start_time# Display the timerdef display_timer(self):secs = int(self.elapsed_time % 60)mins = int(self.elapsed_time / 60)my_time = self.font.render(f"{mins:02}:{secs:02}", True, self.message_color)return my_time# Stop the timerdef stop_timer(self):self.start_time = None

start_timer() 方法在调用时使用 time.time() 将 start_time 属性设置为当前时间。这标志着计时器的开始。

update_timer() 方法计算定时器开始后的耗时。如果 start_time 属性不是 None,则用 start_time 减去当前时间来更新 elapsed_time

display_timer() 方法会将已用时间转换为分钟和秒。然后使用 Pygame 字体以 "MM:SS "格式创建时间的文本表示。渲染后的文本将被返回。

stop_timer() 方法将 start_time 重置为 None,从而有效地停止计时器。

现在,我们的编码工作完成了要体验我们的游戏,只需在进入项目目录后在终端运行 python main.py 或 python3 main.py。下面是一些游戏快照:

在这里插入图片描述

在这里插入图片描述

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

结论

最后,本教程概述了使用 Pygame 库在 Python 中开发数独游戏的过程。实现过程涵盖了数独谜题生成、图形表示、用户交互和计时器功能等关键方面。通过将代码分解为模块化类(如数独、单元格、表格和时钟),本教程强调了一种结构化和有组织的游戏开发方法。对于那些希望创建自己的数独游戏或加深对使用 Pygame 开发 Python 游戏的理解的人来说,本教程是一个宝贵的资源。

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

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

相关文章

昇思MindSpore25天学习Day19:CycleGAN图像风格迁移互换

(TOC)[CycleGAN图像风格迁移呼唤] 模型介绍 模型简介 CycleGAN(Cycle Generative Adversaial Network)即循环对抗生成网络&#xff0c;来自论文Link:Unpaired lmage-to-mage Translation using Cycle-Consistent AdvesairalNetworks该模型实现了—种在没有配对示例的情况下学…

从nginx返回404来看http1.0和http1.1的区别

序言 什么样的人可以称之为有智慧的人呢&#xff1f;如果下一个定义&#xff0c;你会如何来定义&#xff1f; 所谓智慧&#xff0c;就是能区分自己能改变的部分&#xff0c;自己无法改变的部分&#xff0c;努力去做自己能改变的&#xff0c;而不要天天想着那些无法改变的东西&a…

麒麟桌面操作系统上网络设置界面消失的解决方法

原文链接&#xff1a;麒麟桌面操作系统上网络设置界面消失的解决方法 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于麒麟桌面操作系统上网络设置界面消失解决方法的文章。在使用麒麟桌面操作系统时&#xff0c;可能会遇到网络设置界面突然消失的情况&#xff…

斯坦福CS224n深度学习培训营课程

自然语言处理领域的经典课程涵盖了从基础知识到最新研究的全面内容。本培训营将精选课程内容&#xff0c;结合实际案例和项目实践&#xff0c;带领学员深入探索自然语言处理的前沿&#xff0c;学习最先进的深度学习技术。 课程大小&#xff1a;2.6G 课程下载&#xff1a;http…

四自由度SCARA机器人的运动学和动力学matlab建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 针对SCARA 机器人系统进行了深入研究与探讨&#xff0c;提出SCARA机器人的动力学模型和运动学模型&#xff0c;并以MATLAB软件为仿真平台&#xff0c;通过MATLAB Robotics Too…

java核心-泛型

目录 概述什么是泛型分类泛型类泛型接口泛型方法 泛型通配符分类 泛型类型擦除分类无限制类型擦除有限制类型擦除 问题需求第一种第二种 概述 了解泛型有利于学习 jdk 、中间件的源码&#xff0c;提升代码抽象能力&#xff0c;封装通用性更强的组件。 什么是泛型 在定义类、接…

二手闲置平台小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;卖家管理&#xff0c;商品分类管理&#xff0c;商品信息管理&#xff0c;商品购买管理&#xff0c;商品配送管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;商品信息&a…

【linux服务器】大语言模型实战教程:LLMS大模型部署到个人服务器或嵌入式开发板(保姆级教学)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 说到大语言模型相信大家都不会陌生&#xff0c;大型语言模型(LLMs)是人工智能文本处理的主要类型,也现在最流行的人工智能…

基于Java+SpringMvc+Vue技术智慧校园系统设计与实现--60页及以上论文参考

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…

网络基础:园区网络架构

园区网络 园区网络&#xff08;Campus Network&#xff09;是指在一个相对较大的区域内&#xff0c;如大学校园、企业园区或政府机关等&#xff0c;建立的计算机网络系统。园区网络根据规模的不同&#xff0c;可以分为以下几种类型&#xff1a; ①小型园区网络&#xff1a;通常…

【系统架构设计师】八、系统工程基础知识(系统工程|系统性能)

目录 一、系统工程 1.1 系统工程的方法 1.1.1 霍尔的三维结构 1.1.2 切克兰德方法 1.1.3 并行工程方法 1.1.4 综合集成法 1.1.5.WSR 系统方法。 二、系统工程生命周期 2.1 系统工程生命周期7阶段 2.2 生命周期方法 三、基于模型的系统工程(MBSE) 四、系统性能 4.1…

vb.netcad二开自学笔记6:第一个绘制线段命令

.net编写绘制直线已完全不同于ActiveX的&#xff08;VBA&#xff09;的方式&#xff0c;过程更类似于arx程序&#xff0c;需要通过操作AutoCAD 数据库添加对象&#xff01;下面的代码是在以前代码基础上添加了一个新myline命令。 AutoCAD 数据库结构 myline命令代码 Imports A…

YoloV9改进策略:Block改进|轻量实时的重参数结构|最新改进|即插即用(全网首发)

摘要 本文使用重参数的Block替换YoloV9中的RepNBottleneck&#xff0c;GFLOPs从239降到了227&#xff1b;同时&#xff0c;map50从0.989涨到了0.99&#xff08;重参数后的结果&#xff09;。 改进方法简单&#xff0c;只做简单的替换就行&#xff0c;即插即用&#xff0c;非常…

使用ndoe实现自动化完成增删改查接口

使用ndoe实现自动化完成增删改查接口 最近工作内容比较繁琐&#xff0c;手里需要开发的项目需求比较多&#xff0c;常常在多个项目之间来回切换&#xff0c;有时候某些分支都不知道自己开发了什么、做了哪些需求&#xff0c; 使用手写笔记的方式去记录分支到头来也是眼花缭乱&a…

vscode调试教程

VSCode调试 VSCode Debuggers VSCode使用launch.json进行细粒度的控制&#xff0c;可以启动程序或将其附加到复杂的调试场景中 打开Run and Debug视图Ctrl Shift D 点击create a launch.json file&#xff0c;选择C(GDB/LLDB) 会在工作目录自动创建.vscode/launch.json文…

【Python】已解决:(MongoDB安装报错)‘mongo’ 不是内部或外部命令,也不是可运行的程序

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例及解决方案五、注意事项 已解决&#xff1a;&#xff08;MongoDB安装报错&#xff09;‘mongo’ 不是内部或外部命令,也不是可运行的程序 一、分析问题背景 在安装和配置MongoDB时&#xff0c;有…

怎样在 PostgreSQL 中优化对 UUID 数据类型的索引和查询?

文章目录 一、UUID 数据类型概述二、UUID 索引和查询的性能问题三、优化方案&#xff08;一&#xff09;选择合适的索引类型&#xff08;二&#xff09;压缩 UUID&#xff08;三&#xff09;拆分 UUID&#xff08;四&#xff09;使用覆盖索引&#xff08;五&#xff09;优化查询…

一二三应用开发平台应用开发示例(6)——代码生成、权限配置、运行效果查看

生成代码 完成配置工作&#xff0c;接下来就是见证奇迹的时刻~ 返回到实体列表&#xff0c;选中“文件夹”记录&#xff0c;点击“生成代码”按钮&#xff0c;提示成功后&#xff0c;在项目的output目录下输出了平台基于配置模板产生的各层代码&#xff0c;在原有后端的基础上…

Pyserial设置缓冲区大小失败

文章目录 问题描述原因分析解决方案 问题描述 使用set_buffer_size()设置缓冲区大小后&#xff0c;buffer size仍为默认的4096 import time import serial ser serial.Serial(baudrate9600, timeout0.5) ser.port COM1 ser.set_buffer_size(rx_size8192) ser.open() while …

windows上部署python3.11

hello&#xff0c;大家好&#xff0c;我是一名测试开发工程师&#xff0c;至今已在自动化测试领域深耕9个年头&#xff0c;现已将本人实战多年的多终端自动化测试框架【wyTest】开源啦&#xff0c;在接下来的一个月里&#xff0c;我将免费指导大家使用wyTest&#xff0c;请大家…