【Dison夏令营 Day 13】使用 Python 创建扫雷游戏

在本文中,我们将介绍如何使用 Python 语言创建自己的基于终端的扫雷程序。

关于游戏
1992年4月6日,扫雷和纸牌、空当接龙等小游戏搭载在Windows 3.1系统中与用户见面,主要目的是让用户训练使用鼠标。扫雷是一款单人游戏,这个游戏的玩法很简单,有初级、中级、高级和自定义等模式,雷区中随机布置一定数量的地雷,玩家需要清除一个包含地雷和数字的正方形网格。玩家需要借助相邻方格中的数字来防止自己落在地雷上,但不许踩到地雷。

在这里插入图片描述

使用 Python 设计扫雷游戏

在创建游戏逻辑之前,我们需要设计游戏的基本布局。使用 Python 创建正方形网格非常容易:

# Printing the Minesweeper Layout
def print_mines_layout():global mine_valuesglobal nprint()print("\t\t\tMINESWEEPER\n")st = "   "for i in range(n):st = st + "     " + str(i + 1)print(st)   for r in range(n):st = "     "if r == 0:for col in range(n):st = st + "______" print(st)st = "     "for col in range(n):st = st + "|     "print(st + "|")st = "  " + str(r + 1) + "  "for col in range(n):st = st + "|  " + str(mine_values[r][col]) + "  "print(st + "|") st = "     "for col in range(n):st = st + "|_____"print(st + '|')print()

每次迭代显示的网格如下图所示:

在这里插入图片描述
M "符号表示该单元格中存在 “地雷”。我们可以清楚地看到,网格上的任何数字都表示相邻 "8 "单元格中存在的地雷数量。

本教程将进一步解释如何使用 mine_values 等变量。

输入系统

任何游戏最重要的部分之一就是输入法。在我们的扫雷版本中,我们将使用行数和列数作为输入技术。

在开始游戏之前,脚本必须为玩家提供一组指令。我们的游戏会打印以下内容。

在这里插入图片描述
与网格一起显示的行数和列数对我们的输入系统很有帮助。我们知道,在没有任何指示器的情况下追踪地雷是很困难的。因此,扫雷游戏提供了一种使用 "标志 "来标记我们已知含有地雷的单元格的方法。

数据存储

对于一局扫雷游戏,我们需要记录以下信息:

  • 网格大小
  • 地雷数量
  • 实际 "网格值——在游戏开始时,我们需要一个容器来存储玩家未知的游戏实际值。例如,地雷的位置。
  • 表面 "网格值 - 每次移动后,我们都需要更新所有必须显示给玩家的值。
  • 标记位置 - 已标记的单元格。

这些值通过以下数据结构存储

if __name__ == "__main__":# Size of gridn = 8# Number of minesmines_no = 8# The actual values of the gridnumbers = [[0 for y in range(n)] for x in range(n)] # The apparent values of the gridmine_values = [[' ' for y in range(n)] for x in range(n)]# The positions that have been flaggedflags = []

扫雷的游戏逻辑并不复杂。所有的努力都是为了设置扫雷布局。

设置地雷

我们需要随机设置地雷的位置,这样玩家就无法预测它们的位置。这可以通过以下方法实现

# Function for setting up Mines
def set_mines():global numbersglobal mines_noglobal n# Track of number of mines already set upcount = 0while count < mines_no:# Random number from all possible grid positions val = random.randint(0, n*n-1)# Generating row and column from the numberr = val // ncol = val % n# Place the mine, if it doesn't already have oneif numbers[r][col] != -1:count = count + 1numbers[r][col] = -1

在代码中,我们从网格中所有可能的单元格中随机选择一个数字。我们一直这样做,直到得到所述的地雷数量。

注意:地雷的实际值存储为-1,而为显示而存储的值则表示地雷为 “M”。

注意:"randint "函数只能在导入随机库后使用。在程序开始时写入 "import random "即可。

设置网格编号

对于网格中的每个单元格,我们必须检查所有相邻单元格是否存在地雷。具体方法如下

# Function for setting up the other grid values
def set_values():global numbersglobal n# Loop for counting each cell valuefor r in range(n):for col in range(n):# Skip, if it contains a mineif numbers[r][col] == -1:continue# Check up  if r > 0 and numbers[r-1][col] == -1:numbers[r][col] = numbers[r][col] + 1# Check down    if r < n-1  and numbers[r+1][col] == -1:numbers[r][col] = numbers[r][col] + 1# Check leftif col > 0 and numbers[r][col-1] == -1:numbers[r][c] = numbers[r][c] + 1# Check rightif col < n-1 and numbers[r][col+1] == -1:numbers[r][col] = numbers[r][col] + 1# Check top-left    if r > 0 and col > 0 and numbers[r-1][col-1] == -1:numbers[r][col] = numbers[r][col] + 1# Check top-rightif r > 0 and col < n-1 and numbers[r-1][col+1]== -1:numbers[r][col] = numbers[r][col] + 1# Check below-left  if r < n-1 and col > 0 and numbers[r+1][col-1]== -1:numbers[r][col] = numbers[r][col] + 1# Check below-rightif r < n-1 and col< n-1 and numbers[r+1][col+1]==-1:numbers[r][col] = numbers[r][col] + 1

这些值是不对玩家公开的,因此被存储在数字变量中。

游戏循环

游戏循环是游戏中非常关键的一部分。它需要更新玩家的每一步棋以及游戏的结局。

# Set the mines
set_mines()# Set the values
set_values()# Display the instructions
instructions()# Variable for maintaining Game Loop
over = False# The GAME LOOP 
while not over:print_mines_layout()

在循环的每次迭代中,都必须显示扫雷网格并处理玩家的移动。

处理玩家输入

正如我们之前提到的,有两种玩家输入:

# Input from the user
inp = input("Enter row number followed by space and column number = ").split()

标准输入

在普通移动中,会提到行和列的编号。玩家此举的动机是解锁一个没有地雷的单元格。

# Standard Move
if len(inp) == 2:# Try block to handle errant inputtry: val = list(map(int, inp))except ValueError:clear()print("Wrong input!")instructions()continue

旗子输入

在插旗动作中,游戏者会输入三个数值。前两个值表示小区位置,最后一个值表示插旗。

# Flag Input
elif len(inp) == 3:if inp[2] != 'F' and inp[2] != 'f':clear()print("Wrong Input!")instructions()continue# Try block to handle errant input  try:val = list(map(int, inp[:2]))except ValueError:clear()print("Wrong input!")instructions()continue

净化输入

在存储输入后,我们必须进行一些合理性检查,以便游戏顺利运行。

# Sanity checks
if val[0] > n or val[0] < 1 or val[1] > n or val[1] < 1:clear()print("Wrong Input!")instructions()continue# Get row and column numbers
r = val[0]-1
col = val[1]-1

输入过程完成后,行号和列号将被提取并存储在 "r "和 "c "中。

处理标志输入

管理标记输入并不是一个大问题。在标记单元格为地雷之前,需要检查一些先决条件。

必须进行以下检查:

  • 单元格是否已被标记。
  • 要标记的单元是否已经显示给玩家。
  • 标记数量不超过地雷数量。

处理完这些问题后,该单元就会被标记为地雷。

# If cell already been flagged
if [r, col] in flags:clear()print("Flag already set")continue# If cell already been displayed
if mine_values[r][col] != ' ':clear()print("Value already known")continue# Check the number for flags    
if len(flags) < mines_no:clear()print("Flag set")# Adding flag to the listflags.append([r, col])# Set the flag for displaymine_values[r][col] = 'F'continue
else:clear()print("Flags finished")continue    

处理标准输入

标准输入涉及游戏的整体运行。有三种不同的情况:

锚定地雷

一旦玩家选择了有地雷的单元格,游戏就结束了。这可能是运气不好或判断失误造成的。

# If landing on a mine --- GAME OVER    
if numbers[r][col] == -1:mine_values[r][col] = 'M'show_mines()print_mines_layout()print("Landed on a mine. GAME OVER!!!!!")over = Truecontinue

当我们降落到有地雷的单元格后,我们需要显示游戏中的所有地雷,并改变游戏循环后面的变量。

函数 "show_mines() "负责执行此操作。

def show_mines():global mine_valuesglobal numbersglobal nfor r in range(n):for col in range(n):if numbers[r][col] == -1:mine_values[r][col] = 'M'

访问 "0 "值单元格。
创建游戏最棘手的部分就是管理这种情况。每当游戏者访问一个 "0 "值单元格时,所有相邻的元素都必须显示出来,直到访问到一个非零值单元格为止。

# If landing on a cell with 0 mines in neighboring cells
elif numbers[r][n] == 0:vis = []mine_values[r][n] = '0'neighbours(r, col)  

这一目标可以通过递归来实现。递归是一种编程工具,其中的函数会调用自身,直到基本情况得到满足。相邻函数就是一个递归函数,它解决了我们的问题。

def neighbours(r, col):global mine_valuesglobal numbersglobal vis# If the cell already not visitedif [r,col] not in vis:# Mark the cell visitedvis.append([r,col])# If the cell is zero-valuedif numbers[r][col] == 0:# Display it to the usermine_values[r][col] = numbers[r][col]# Recursive calls for the neighbouring cellsif r > 0:neighbours(r-1, col)if r < n-1:neighbours(r+1, col)if col > 0:neighbours(r, col-1)if col < n-1:neighbours(r, col+1)    if r > 0 and col > 0:neighbours(r-1, col-1)if r > 0 and col < n-1:neighbours(r-1, col+1)if r < n-1 and col > 0:neighbours(r+1, col-1)if r < n-1 and col < n-1:neighbours(r+1, col+1)  # If the cell is not zero-valued            if numbers[r][col] != 0:mine_values[r][col] = numbers[r][col]

针对游戏的这一特殊概念,我们使用了一种新的数据结构,即 vis。vis 的作用是在递归过程中跟踪已访问过的单元格。如果没有这些信息,递归将永远持续下去。

在显示所有零值单元格及其相邻单元格后,我们就可以进入最后一个场景了。

选择非零值单元格

处理这种情况无需费力,因为我们只需更改显示值即可。

# If selecting a cell with atleast 1 mine in neighboring cells  
else:   mine_values[r][col] = numbers[r][col]

结束游戏

每次下棋时,都需要检查棋局是否结束。具体做法如下

# Check for game completion 
if(check_over()):show_mines()print_mines_layout()print("Congratulations!!! YOU WIN")over = Truecontinue

函数 check_over()负责检查游戏是否结束。

# Function to check for completion of the game
def check_over():global mine_valuesglobal nglobal mines_no# Count of all numbered valuescount = 0# Loop for checking each cell in the gridfor r in range(n):for col in range(n):# If cell not empty or flaggedif mine_values[r][col] != ' ' and mine_values[r][col] != 'F':count = count + 1# Count comparison          if count == n * n - mines_no:return Trueelse:return False

我们计算没有空格或标记的单元格数量。当这一数字等于除含有地雷的单元格外的所有单元格时,游戏即宣告结束。

每次移动后清除输出

当我们不断在终端上打印内容时,终端就会变得很拥挤。因此,必须不断清除输出。方法如下

# Function for clearing the terminal
def clear():os.system("clear")

完整代码

以下是扫雷游戏的完整代码:

# Importing packages
import random
import os# Printing the Minesweeper Layout
def print_mines_layout():global mine_valuesglobal nprint()print("\t\t\tMINESWEEPER\n")st = "   "for i in range(n):st = st + "     " + str(i + 1)print(st)   for r in range(n):st = "     "if r == 0:for col in range(n):st = st + "______" print(st)st = "     "for col in range(n):st = st + "|     "print(st + "|")st = "  " + str(r + 1) + "  "for col in range(n):st = st + "|  " + str(mine_values[r][col]) + "  "print(st + "|") st = "     "for col in range(n):st = st + "|_____"print(st + '|')print()# Function for setting up Mines
def set_mines():global numbersglobal mines_noglobal n# Track of number of mines already set upcount = 0while count < mines_no:# Random number from all possible grid positions val = random.randint(0, n*n-1)# Generating row and column from the numberr = val // ncol = val % n# Place the mine, if it doesn't already have oneif numbers[r][col] != -1:count = count + 1numbers[r][col] = -1# Function for setting up the other grid values
def set_values():global numbersglobal n# Loop for counting each cell valuefor r in range(n):for col in range(n):# Skip, if it contains a mineif numbers[r][col] == -1:continue# Check up  if r > 0 and numbers[r-1][col] == -1:numbers[r][col] = numbers[r][col] + 1# Check down    if r < n-1  and numbers[r+1][col] == -1:numbers[r][col] = numbers[r][col] + 1# Check leftif col > 0 and numbers[r][col-1] == -1:numbers[r][col] = numbers[r][col] + 1# Check rightif col < n-1 and numbers[r][col+1] == -1:numbers[r][col] = numbers[r][col] + 1# Check top-left    if r > 0 and col > 0 and numbers[r-1][col-1] == -1:numbers[r][col] = numbers[r][col] + 1# Check top-rightif r > 0 and col < n-1 and numbers[r-1][col+1] == -1:numbers[r][col] = numbers[r][col] + 1# Check below-left  if r < n-1 and col > 0 and numbers[r+1][col-1] == -1:numbers[r][col] = numbers[r][col] + 1# Check below-rightif r < n-1 and col < n-1 and numbers[r+1][col+1] == -1:numbers[r][col] = numbers[r][col] + 1# Recursive function to display all zero-valued neighbours  
def neighbours(r, col):global mine_valuesglobal numbersglobal vis# If the cell already not visitedif [r,col] not in vis:# Mark the cell visitedvis.append([r,col])# If the cell is zero-valuedif numbers[r][col] == 0:# Display it to the usermine_values[r][col] = numbers[r][col]# Recursive calls for the neighbouring cellsif r > 0:neighbours(r-1, col)if r < n-1:neighbours(r+1, col)if col > 0:neighbours(r, col-1)if col < n-1:neighbours(r, col+1)    if r > 0 and col > 0:neighbours(r-1, col-1)if r > 0 and col < n-1:neighbours(r-1, col+1)if r < n-1 and col > 0:neighbours(r+1, col-1)if r < n-1 and col < n-1:neighbours(r+1, col+1)  # If the cell is not zero-valued            if numbers[r][col] != 0:mine_values[r][col] = numbers[r][col]# Function for clearing the terminal
def clear():os.system("clear")      # Function to display the instructions
def instructions():print("Instructions:")print("1. Enter row and column number to select a cell, Example \"2 3\"")print("2. In order to flag a mine, enter F after row and column numbers, Example \"2 3 F\"")# Function to check for completion of the game
def check_over():global mine_valuesglobal nglobal mines_no# Count of all numbered valuescount = 0# Loop for checking each cell in the gridfor r in range(n):for col in range(n):# If cell not empty or flaggedif mine_values[r][col] != ' ' and mine_values[r][col] != 'F':count = count + 1# Count comparison          if count == n * n - mines_no:return Trueelse:return False# Display all the mine locations                    
def show_mines():global mine_valuesglobal numbersglobal nfor r in range(n):for col in range(n):if numbers[r][col] == -1:mine_values[r][col] = 'M'if __name__ == "__main__":# Size of gridn = 8# Number of minesmines_no = 8# The actual values of the gridnumbers = [[0 for y in range(n)] for x in range(n)] # The apparent values of the gridmine_values = [[' ' for y in range(n)] for x in range(n)]# The positions that have been flaggedflags = []# Set the minesset_mines()# Set the valuesset_values()# Display the instructionsinstructions()# Variable for maintaining Game Loopover = False# The GAME LOOP while not over:print_mines_layout()# Input from the userinp = input("Enter row number followed by space and column number = ").split()# Standard inputif len(inp) == 2:# Try block to handle errant inputtry: val = list(map(int, inp))except ValueError:clear()print("Wrong input!")instructions()continue# Flag inputelif len(inp) == 3:if inp[2] != 'F' and inp[2] != 'f':clear()print("Wrong Input!")instructions()continue# Try block to handle errant input  try:val = list(map(int, inp[:2]))except ValueError:clear()print("Wrong input!")instructions()continue# Sanity checks if val[0] > n or val[0] < 1 or val[1] > n or val[1] < 1:clear()print("Wrong input!")instructions()continue# Get row and column numbersr = val[0]-1col = val[1]-1 # If cell already been flaggedif [r, col] in flags:clear()print("Flag already set")continue# If cell already been displayedif mine_values[r][col] != ' ':clear()print("Value already known")continue# Check the number for flags    if len(flags) < mines_no:clear()print("Flag set")# Adding flag to the listflags.append([r, col])# Set the flag for displaymine_values[r][col] = 'F'continueelse:clear()print("Flags finished")continue    else: clear()print("Wrong input!")   instructions()continue# Sanity checksif val[0] > n or val[0] < 1 or val[1] > n or val[1] < 1:clear()print("Wrong Input!")instructions()continue# Get row and column numberr = val[0]-1col = val[1]-1# Unflag the cell if already flaggedif [r, col] in flags:flags.remove([r, col])# If landing on a mine --- GAME OVER    if numbers[r][col] == -1:mine_values[r][col] = 'M'show_mines()print_mines_layout()print("Landed on a mine. GAME OVER!!!!!")over = Truecontinue# If landing on a cell with 0 mines in neighboring cellselif numbers[r][col] == 0:vis = []mine_values[r][col] = '0'neighbours(r, col)# If selecting a cell with atleast 1 mine in neighboring cells  else:   mine_values[r][col] = numbers[r][col]# Check for game completion if(check_over()):show_mines()print_mines_layout()print("Congratulations!!! YOU WIN")over = Truecontinueclear() 

结论

我们希望本教程能让大家明白如何创建自己的扫雷游戏,并从中获得乐趣。如有任何疑问,欢迎在下方评论。

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

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

相关文章

Linux系统下anaconda的安装与Pytorch环境的下载

首先&#xff0c;在命令行通过cd命令&#xff0c;进入用户文件夹 cd xxx/xxx/username进入anaconda官网https://repo.anaconda.com/archive/&#xff0c;寻找anaconda下载包资源&#xff0c;这里选择最新的anaconda下载包 Anaconda3-2024.06-1-Linux-x86_64.sh 在命令行执行安…

气膜建筑如何在文化旅游行业中应用—轻空间

一、气膜建筑简介 气膜建筑是一种新型建筑形式&#xff0c;其主要结构由高强度膜材、空气支撑系统和固定系统组成。通过不断向膜体内部充气&#xff0c;使其形成稳定的内部压力来支撑整个建筑结构。气膜建筑因其建设速度快、成本相对较低、环保节能等优点&#xff0c;近年来在各…

阶段三:项目开发---大数据开发运行环境搭建:任务3:安装配置Hadoop集群

任务描述 知识点&#xff1a;安装配置Hadoop 重 点&#xff1a; 安装配置Hadoop 难 点&#xff1a;无 内 容&#xff1a; Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下&#xff0c;开发分布式程序。充分利用集群的威…

Linux系统编程——线程控制

目录 一&#xff0c;关于线程控制 二&#xff0c;线程创建 2.1 pthread_create函数 2.2 ps命令查看线程信息 三&#xff0c;线程等待 3.1 pthread_join函数 3.2 创建多个线程 3.3 pthread_join第二个参数 四&#xff0c;线程终止 4.1 关于线程终止 4.2 pthread_exit…

提示词工程课程,白嫖A100活动课程

扫下面二维码即可参加 免费使用A100&#xff0c;学习大模型相关知识&#xff01; 前置知识&#xff1a; 内容来源&#xff1a;Docs 模型设置 在使用提示词的时候&#xff0c;您会通过 API 或者网页版与大语言模型进行交互&#xff0c;将这些参数、设置调整到最佳程度会提高使…

14-47 剑和诗人21 - 2024年如何打造AI创业公司

​​​​​ 2024 年&#xff0c;随着人工智能继续快速发展并融入几乎所有行业&#xff0c;创建一家人工智能初创公司将带来巨大的机遇。然而&#xff0c;在吸引资金、招聘人才、开发专有技术以及将产品推向市场方面&#xff0c;人工智能初创公司也面临着相当大的挑战。 让我来…

UML中用例和用例图的概念

用例 用例模型的基本组成部分有用例、参与者&#xff08;或角色&#xff09;和系统。用例用于描述系统的功能&#xff0c;也就是从用户的角度来说&#xff0c;系统具体应包含哪些功能&#xff0c;从而帮助分析人员理解系统的行为。它是对系统功能的宏观的、整体的描述。一个完…

idea中的块映射中的子元素无效

在yml文件中&#xff0c;出现块映射中的子元素无效&#xff0c;如图&#xff1a; 在YAML文件中&#xff0c;通常需要在键和值之间添加空格&#xff0c;以确保文件的可读性和正确解析。一些YAML解析器可能要求在冒号后面必须有空格才能正确解析文件。如果不加空格&#xff0c;解…

变长输入神经网络设计

我对使用 PyTorch 可以轻松构建动态神经网络的想法很感兴趣&#xff0c;因此我决定尝试一下。 我脑海中的应用程序具有可变数量的相同类型的输入。对于可变数量的输入&#xff0c;已经使用了循环或递归神经网络。但是&#xff0c;这些结构在给定行的输入之间施加了一些顺序或层…

Hugging Face使用笔记

1. HuggingFace简介 Hugging Face Hub和 Github 类似&#xff0c;都是Hub(社区)。Hugging Face可以说的上是机器学习界的Github。Hugging Face为用户提供了以下主要功能&#xff1a; 模型仓库&#xff08;Model Repository&#xff09;&#xff1a;Git仓库可以让你管理代码版…

kei5l中不能跳转到函数定义的原因和个人遇到的问题

快捷键 CTRLK或F12&#xff0c;在选择要查看的函数定义时按下可以查看到&#xff08;文件没问题的情况下&#xff09; 出现不能查看的原因 1&#xff0c;没有设置生成文件信息&#xff08;第一次打开工程常遇到问题&#xff09; 2, 定义函数的代码没有加入工程 解决方式如下…

南大通用数据库-Gbase-8a-学习-44-DDLEVENT恢复

目录 一、环境信息 二、前景提要 1、情况描述 2、3号节点gc_recover日志截图 3、3号节点express日志截图 4、ddlevent截图 5、报错赋权语句分别在1节点和4节点执行 6、gcadmin 三、解决方法 1、描述 2、清理系统user表DDLEVENT 3、拷贝系统user表数据 &#xff08;…

3.js - 灯光与阴影 - 聚光灯

// ts-nocheckimport * as THREE from three // 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls // 导入hdr加载器 import { RGBELoader } from three/examples/jsm/loaders/RGBELoader.js // 导入lil.gui import { GUI } from thre…

数据库之索引(三)

目录 一、简述索引实现的原理 二、简述数据库索引的重构过程 三、为什么MySQL的索引使用B树 四、简述联合索引的存储结构及其有效方式 五、MySQL的Hash索引和B树索引有何区别 一、简述索引实现的原理 在MySQL中&#xff0c;索引是在存储引擎层实现的&#xff0c;不同存储引…

Echarts:渲染成Canvas还是SVG,该如何抉择?

ECharts 从初始一直使用 Canvas 绘制图表。而 ECharts v4.0 发布了 SVG 渲染器&#xff0c;从而提供了一种新的选择。在初始化图表实例时&#xff0c;只需设置 renderer 参数 为 canvas 或 svg 即可指定渲染器&#xff0c;比较方便。贝格前端工场带领大家看下如何选择。 一、C…

如何使用HTML和JavaScript读取文件夹中的所有图片并显示RGB范围

如何使用HTML和JavaScript读取文件夹中的所有图片并显示RGB范围 在这篇博客中&#xff0c;我将介绍如何使用HTML和JavaScript读取文件夹中的所有图片&#xff0c;并显示这些图片以及它们的RGB范围。这个项目使用现代浏览器提供的<input type"file" webkitdirecto…

苹果电脑为什么要清理软件?

你有没有想过&#xff0c;你的苹果电脑也许是一个秘密的收藏家&#xff1f;没错&#xff0c;你的Mac可能在悄悄收集那些你曾经用过的每一个字节&#xff0c;从那次偶然下载的应用到你已经忘记了的各种文件。久而久之&#xff0c;这些“收藏品”就会堆积成山&#xff0c;让你的苹…

智能电表在碳中和实现过程中发挥什么作用

智能电表在碳中和实现过程中发挥着至关重要的作用&#xff0c;这些作用主要体现在提高碳排放计量的精准度、推动绿色能源转型、促进电力领域低碳发展等方面&#xff1b;随着技术的不断发展和应用的不断深入相信智能电表将在碳中和实现过程中发挥更加重要的作用。以下是对智能电…

开始尝试从0写一个项目--前端(二)

修改请求路径的位置 将后续以及之前的所有请求全都放在同一个文件夹里面 定义axios全局拦截器 为了后端每次请求都需要向后端传递jwt令牌检验 ps&#xff1a;愁死了&#xff0c;翻阅各种资料&#xff0c;可算是搞定了&#xff0c;哭死~~ src\utils\request.js import axio…

【最新鸿蒙应用开发】——Router页面路由

Router路由 页面路由指的是在应用程序中实现不同页面之间的跳转&#xff0c;以及数据传递。通过 Router 模块就可以实现这个功能. 1. 创建页面 之前是创建的文件&#xff0c;使用路由的时候需要创建页面&#xff0c;步骤略有不同 方法 1&#xff1a;直接右键新建Page&#xf…