前端技术搭建弹珠小游戏(内附源码)

news2024/12/23 10:30:19

The sand accumulates to form a pagoda

  • ✨ 写在前面
  • ✨ 功能介绍
  • ✨ 页面搭建
  • ✨ 样式设置
  • ✨ 逻辑部分


✨ 写在前面

上周我们实通过前端基础实现了小人逃脱,当然很多伙伴再评论区提出了想法,后续我们会考虑实现的,今天还是继续按照我们原定的节奏来带领大家完成一个弹珠游戏,功能也比较简单简单,也是想借助这样一个简单的功能,然后来帮助大家了解我们JavaScript在前端中的作用, 在前面的文章当中我们也提及到我们在本系列的专栏是循序渐进从简单到复杂的过程,后续会带领大家用前端实现翻卡片、扫雷、贪吃蛇等有趣的小游戏,纯前端语言实现,都会陆续带给大家。欢迎大家订阅我们这份前端小游戏的专栏。


✨ 功能介绍

在这里插入图片描述

当玩家进入游戏页面后,可以看到一个有趣的弹珠游戏。玩家需要使用左右箭头键控制下方的挡板,以便接住从上方掉落的小球。如果球触碰到下方的边界线,游戏就结束了。玩家的目标是尽可能多地接住小球,并通过撞击顶部的砖块来获得高分。每次成功接住小球都会获得10分,每次碰撞砖块都会获得20分。玩家可以通过页面上的得分区域实时查看自己的得分。如果玩家成功消除所有的砖块,就会获得游戏胜利,并获得最终得分。当然你也可以通过修改游戏的参数来控制难度等级!


✨ 页面搭建

创建文件

首先呢我们创建我们的HTML文件,这里我就直接命名为 弹珠游戏.html 了,大家可以随意命名, 文件创建生成后我们通过编辑器打开,这里我用的是VScode, 然后初始化我们的代码结构,那在这里告诉大家一个快捷键,就是我们敲上我们英文的一个 ! 我们敲击回车直接就会给我们生成基础版本的前端代码结构。

在这里插入图片描述

文档声明和编码设置: 在HTML文档的头部,使用<!DOCTYPE>声明HTML文档类型,确保浏览器以正确的方式渲染网页内容。同时,设置UTF-8编码,以确保浏览器能够正确地解析和显示中文字符。下面我就开始搭建我们的DOM结构了!

DOM结构搭建

  1. <h1>弹珠游戏</h1>:这是一个页面标题,显示在页面的最上方,用于告诉用户这是一个弹珠游戏页面。
  2. <div id="board">...</div>:这是一个游戏主板区域,游戏中所有的元素都会在这个区域内展示。其中包括了一个挡板、一个弹珠和一个砖块容器。
  3. <div id="paddle"></div>:这是一个挡板,用于接住从上方掉落的小球。玩家可以通过左右箭头键控制挡板的移动。
  4. <div id="ball"></div>:这是一个弹珠,会从上方掉落到挡板下方。玩家需要使用挡板接住弹珠,否则游戏就会结束。
  5. <div id="brick-container"></div>:这是一个砖块容器,用于展示顶部的砖块。玩家需要通过撞击顶部的砖块来获得高分。
  6. <div id="score">0</div>:这是一个得分区域,用于实时展示玩家的得分。当玩家成功接住小球或者碰撞砖块时,得分会随之增加,并在这个区域中实时更新。
<h1>弹珠游戏</h1>
<div id="board">
  <div id="paddle"></div>
  <div id="ball"></div>
  <div id="brick-container"></div>
</div>
<div id="score">0</div>

在这里插入图片描述


✨ 样式设置

我们看到了上面的的DOM已经搭建好了,但是很显然样式比较随意了,我们简单的来配置一下样式吧,其实我们本专栏也是想带领大家掌握一些逻辑所以样式方面我们就一切从简;这段CSS代码定义了弹珠游戏中各个元素的样式:

  • #board 定义了游戏面板的样式,包括宽度、高度、边框、相对定位和水平居中对齐。
  • #paddle 定义了球拍的样式,包括宽度、高度、背景颜色、绝对定位和贴着游戏面板底部。
  • #ball 定义了球的样式,包括宽度、高度、背景颜色和绝对定位。
  • .brick 定义了砖块的样式,包括宽度、高度、背景颜色、边框和绝对定位。
  • #brick-container 定义了砖块容器的样式,包括与游戏面板顶部的距离。
  • #score 定义了分数的样式,包括字体大小和居中对齐。
<style>
    #board {
        width: 480px;
        height: 320px;
        border: 1px solid black;
        position: relative;
        margin: 0 auto;
    }

    #paddle {
        width: 80px;
        height: 10px;
        background-color: black;
        position: absolute;
        bottom: 0;
    }

    #ball {
        width: 10px;
        height: 10px;
        background-color: red;
        position: absolute;
    }

    .brick {
        width: 75px;
        height: 20px;
        background-color: blue;
        border: 1px solid black;
        position: absolute;
    }

    #brick-container {
        margin-top: 30px;
    }

    #score {
        font-size: 24px;
        text-align: center;
    }
</style>

在这里插入图片描述

✨ 逻辑部分

上面我们搭建了基本的样式,下面呢我们就通过js代码,实现我们游戏的功能吧;我们首先呢 定义了一些变量,包括游戏板(board)、球拍(paddle)、弹珠(ball)、砖块数量(brickCount)、球拍的初始位置(paddleX)、弹珠的初始位置(ballX和ballY)等。定义了砖块的宽度、高度、边距以及偏移量等参数,以及砖块的行数(brickRowCount)和列数(brickColumnCount)。初始化了游戏板、球拍和弹珠的位置,并将球拍放在游戏板的底部,将弹珠放在游戏板的中央。初始化了砖块,通过循环创建砖块,并设置砖块的位置和样式。初始化了键盘事件,用于控制球拍的移动。开始游戏循环,每20毫秒执行一次update函数,用于更新游戏状态。下面我们就来编写update等几个函数;

let board, paddle, ball, brickCount;
let paddleX, ballX, ballY;
let brickWidth = 75, brickHeight = 20, brickPadding = 10, brickOffsetTop = 30, brickOffsetLeft = 30;
let brickRowCount = 3, brickColumnCount = 5;
let x = 3, y = -3;
let leftPressed, rightPressed;
let score = 0; // 定义分数

let gameLoop; // 定义全局变量gameLoop

function startGame() {
    // 初始化分数为0
    score = 0;
    document.getElementById("score").innerHTML = score;

    // 初始化游戏板和弹球
    board = document.getElementById("board");
    paddle = document.getElementById("paddle");
    ball = document.getElementById("ball");
    paddleX = board.offsetWidth / 2 - paddle.offsetWidth / 2;
    ballX = board.offsetWidth / 2 - ball.offsetWidth / 2;
    ballY = board.offsetHeight / 2 - ball.offsetHeight / 2;
    ball.style.left = ballX + "px";
    ball.style.top = ballY + "px";

    // 初始化砖块
    const brickContainer = document.getElementById("brick-container");
    brickContainer.innerHTML = "";
    brickCount = 0;
    for (let i = 0; i < brickRowCount; i++) {
        for (let j = 0; j < brickColumnCount; j++) {
            const brick = document.createElement("div");
            brick.className = "brick";
            brick.style.left = j * (brickWidth + brickPadding) + brickOffsetLeft + "px";
            brick.style.top = i * (brickHeight + brickPadding) + brickOffsetTop + "px";
            brickContainer.appendChild(brick);
            brickCount++;
        }
    }

    // 初始化键盘事件
    leftPressed = false;
    rightPressed = false;
    document.addEventListener("keydown", keyDownHandler, false);
    document.addEventListener("keyup", keyUpHandler, false);

    // 开始
    gameLoop = setInterval(update, 20);
}

下面我们要编写的代码就是游戏的核心代码,定义了三个函数:keyDownHandlerkeyUpHandlerupdate,分别对应键盘按下、键盘松开以及游戏状态的更新。这些函数都在 startGame 函数中被调用,用于初始化游戏并启动游戏循环。

keyDownHandlerkeyUpHandler 函数监听键盘事件。当键盘按下时,会检测按下的键是否是左箭头或右箭头,如果是则将相应的标志变量(leftPressedrightPressed)设置为 true。当键盘松开时,同样会检测松开的键是否是左箭头或右箭头,如果是则将相应的标志变量设置为 false

update 函数是游戏循环中最重要的函数之一,用于更新游戏状态并检测碰撞。在每次更新时,会首先更新球的位置,并检测球是否与边界相撞。如果球碰到了左右边界,则将其速度反向;如果球碰到了上边界,则将其纵向速度反向。如果球碰到了底部,则游戏结束。

接下来,该函数将检测球是否与挡板相撞。如果球碰到了挡板,则将其纵向速度反向,并将分数加10分。然后会实时更新分数。该函数也会检测球是否与砖块相撞。如果球碰到了砖块,则将其纵向速度反向,并将相应的砖块从游戏区域中移除,并将分数加20分。同样会实时更新分数。如果所有砖块都被消除,则游戏结束,弹出一个提示框,显示获得的分数,并重新开始游戏。

function keyDownHandler(e) {
    if (e.keyCode === 37) {
        leftPressed = true;
    } else if (e.keyCode === 39) {
        rightPressed = true;
    }
}

function keyUpHandler(e) {
    if (e.keyCode === 37) {
        leftPressed = false;
    } else if (e.keyCode === 39) {
        rightPressed = false;
    }
}

function update() {
    // 更新球的位置
    ballX += x;
    ballY += y;
    ball.style.left = ballX + "px";
    ball.style.top = ballY + "px";

    // 判断球是否碰到边界
    if (ballX < 0 || ballX + ball.offsetWidth > board.offsetWidth) {
        x = -x;
    }
    if (ballY < 0) {
        y = -y;
    } else if (ballY + ball.offsetHeight > board.offsetHeight) {
        // 判断球是否碰到底部,游戏结束
        clearInterval(gameLoop);
        alert("游戏结束,你的得分是:" + score);
        startGame();
    }

    // 判断球是否碰到挡板
    if (ballY + ball.offsetHeight > board.offsetHeight - paddle.offsetHeight && ballX + ball.offsetWidth > paddleX && ballX < paddleX + paddle.offsetWidth) {
        y = -y;
        score += 10; // 碰到挡板加10分
        document.getElementById("score").innerHTML = score; // 实时更新分数
    }

    // 更新挡板位置
    if (leftPressed && paddleX > 0) {
        paddleX -= 5;
    } else if (rightPressed && paddleX + paddle.offsetWidth < board.offsetWidth) {
        paddleX += 5;
    }
    paddle.style.left = paddleX + "px";
    console.log(brickCount, 'hasdjhsdaf')
    // 判断球是否碰到砖块
    const bricks = document.getElementsByClassName("brick");
    for (let i = 0; i < bricks.length; i++) {
        const brick = bricks[i];
        if (ballY < brick.offsetTop + brickHeight && ballY + ball.offsetHeight > brick.offsetTop && ballX + ball.offsetWidth > brick.offsetLeft && ballX < brick.offsetLeft + brickWidth) {
            y = -y;
            brick.style.display = "none";
            brickCount--;
            score += 20; // 碰到砖块加20分
            document.getElementById("score").innerHTML = score; // 实时更新分数
            if (brickCount === 0) {
                clearInterval(gameLoop);
                alert("恭喜你赢得了游戏,你的得分是:" + score);
                startGame();
            }
        }
    }

}

startGame();

完整代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #board {
            width: 480px;
            height: 320px;
            border: 1px solid black;
            position: relative;
            margin: 0 auto;
        }

        #paddle {
            width: 80px;
            height: 10px;
            background-color: black;
            position: absolute;
            bottom: 0;
        }

        #ball {
            width: 10px;
            height: 10px;
            background-color: red;
            position: absolute;
        }

        .brick {
            width: 75px;
            height: 20px;
            background-color: blue;
            border: 1px solid black;
            position: absolute;
        }

        #brick-container {
            margin-top: 30px;
        }

        #score {
            font-size: 24px;
            text-align: center;
        }
    </style>
</head>

<body>
    <h1>弹珠游戏</h1>
    <div id="board">
        <div id="paddle"></div>
        <div id="ball"></div>
        <div id="brick-container"></div>
    </div>
    <div id="score">0</div>
</body>

<script>
    let board, paddle, ball, brickCount;
    let paddleX, ballX, ballY;
    let brickWidth = 75, brickHeight = 20, brickPadding = 10, brickOffsetTop = 30, brickOffsetLeft = 30;
    let brickRowCount = 3, brickColumnCount = 5;
    let x = 3, y = -3;
    let leftPressed, rightPressed;
    let score = 0; // 定义分数

    let gameLoop; // 定义全局变量gameLoop

    function startGame() {
        // 初始化分数为0
        score = 0;
        document.getElementById("score").innerHTML = score;

        // 初始化游戏板和弹球
        board = document.getElementById("board");
        paddle = document.getElementById("paddle");
        ball = document.getElementById("ball");
        paddleX = board.offsetWidth / 2 - paddle.offsetWidth / 2;
        ballX = board.offsetWidth / 2 - ball.offsetWidth / 2;
        ballY = board.offsetHeight / 2 - ball.offsetHeight / 2;
        ball.style.left = ballX + "px";
        ball.style.top = ballY + "px";

        // 初始化砖块
        const brickContainer = document.getElementById("brick-container");
        brickContainer.innerHTML = "";
        brickCount = 0;
        for (let i = 0; i < brickRowCount; i++) {
            for (let j = 0; j < brickColumnCount; j++) {
                const brick = document.createElement("div");
                brick.className = "brick";
                brick.style.left = j * (brickWidth + brickPadding) + brickOffsetLeft + "px";
                brick.style.top = i * (brickHeight + brickPadding) + brickOffsetTop + "px";
                brickContainer.appendChild(brick);
                brickCount++;
            }
        }

        // 初始化键盘事件
        leftPressed = false;
        rightPressed = false;
        document.addEventListener("keydown", keyDownHandler, false);
        document.addEventListener("keyup", keyUpHandler, false);

        // 开始
        gameLoop = setInterval(update, 20);
    }

    function keyDownHandler(e) {
        if (e.keyCode === 37) {
            leftPressed = true;
        } else if (e.keyCode === 39) {
            rightPressed = true;
        }
    }

    function keyUpHandler(e) {
        if (e.keyCode === 37) {
            leftPressed = false;
        } else if (e.keyCode === 39) {
            rightPressed = false;
        }
    }

    function update() {
        // 更新球的位置
        ballX += x;
        ballY += y;
        ball.style.left = ballX + "px";
        ball.style.top = ballY + "px";

        // 判断球是否碰到边界
        if (ballX < 0 || ballX + ball.offsetWidth > board.offsetWidth) {
            x = -x;
        }
        if (ballY < 0) {
            y = -y;
        } else if (ballY + ball.offsetHeight > board.offsetHeight) {
            // 判断球是否碰到底部,游戏结束
            clearInterval(gameLoop);
            alert("游戏结束,你的得分是:" + score);
            startGame();
        }

        // 判断球是否碰到挡板
        if (ballY + ball.offsetHeight > board.offsetHeight - paddle.offsetHeight && ballX + ball.offsetWidth > paddleX && ballX < paddleX + paddle.offsetWidth) {
            y = -y;
            score += 10; // 碰到挡板加10分
            document.getElementById("score").innerHTML = score; // 实时更新分数
        }

        // 更新挡板位置
        if (leftPressed && paddleX > 0) {
            paddleX -= 5;
        } else if (rightPressed && paddleX + paddle.offsetWidth < board.offsetWidth) {
            paddleX += 5;
        }
        paddle.style.left = paddleX + "px";
        console.log(brickCount, 'hasdjhsdaf')
        // 判断球是否碰到砖块
        const bricks = document.getElementsByClassName("brick");
        for (let i = 0; i < bricks.length; i++) {
            const brick = bricks[i];
            if (ballY < brick.offsetTop + brickHeight && ballY + ball.offsetHeight > brick.offsetTop && ballX + ball.offsetWidth > brick.offsetLeft && ballX < brick.offsetLeft + brickWidth) {
                y = -y;
                brick.style.display = "none";
                brickCount--;
                score += 20; // 碰到砖块加20分
                document.getElementById("score").innerHTML = score; // 实时更新分数
                if (brickCount === 0) {
                    clearInterval(gameLoop);
                    alert("恭喜你赢得了游戏,你的得分是:" + score);
                    startGame();
                }
            }
        }

    }

    startGame();
</script>

</html>

本期推荐

原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下

👍 点赞,你的认可是我创作的动力! \textcolor{green}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向! \textcolor{green}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富! \textcolor{green}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!

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

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

相关文章

sentinel 随笔 3-降级处理

0. 像喝点东西&#xff0c;但不知道喝什么 先来段源码&#xff0c;看一下 我们在dashboard 录入的降级规则&#xff0c;都映射到哪些字段上 package com.alibaba.csp.sentinel.slots.block.degrade;public class DegradeRule extends AbstractRule {public DegradeRule(String…

redis(1)---redis的安装以及五大基本类型的使用

一)认识NoSQL 格式化数据VS格式化 1)SQL关系型数据库&#xff0c;在关系型数据库里面表中的字段是有限制的&#xff0c;况且最好不要随意删除修改表结构&#xff0c;存入到关系型数据库中的数据&#xff0c;都是结构化的数据&#xff0c;对于这些数据都是必须要有格式化的要求&…

sentinel 随笔 2-流控

0. 想要个半个月的旅游 最近发现算法比较有意思一些&#xff0c;什么企业框架都是看不完的… 书接 FlowSlot 1. FlowRuleChecker.checkFlow() : 配置的规则校验类 sentinel 并没有对这个Checker进行抽象的设计&#xff0c;第一次看有些别扭… package com.alibaba.csp.sent…

01- 综述 (目标检测)

要点&#xff1a; 区分One-stage detector 和 Two-stage detector 参考链接&#xff1a;深度学习目标检测最全综述 - 爱码网 详细模型解读参考&#xff1a;目标检测简介 - 知乎 一 目标检测分类 1.1 发展历程 检测网络发布历程&#xff1a; 1.2 检测模型分类 2014年后目标…

C嘎嘎~~ [类 下篇之运算符重载]

类 下篇 之运算符重载 5.赋值运算符重载5.1运算符重载5.1.1 运算符的概念5..1.2 重载运费符的位置5.1.3运算符重载的实质 5.2 赋值运算符重载5.2.1深刻理解---编译器生成的默认赋值运算符重载5.2.2深刻理解---拷贝构造和赋值运算符重载5.2.3深刻理解---传参和返回值用引用修饰…

CUDA error: device-side assert triggered CUDA kernel errors might be asynchronously reported at some

问题描述&#xff1a; 在修改代码时&#xff0c;出现入下报错。 发生异常: RuntimeError CUDA error: device-side assert triggered CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect. For debuggi…

Android Switch开关按钮使用和自定义样式(系列教程五)

Switch开关按钮简介 Switch开关按钮是Android中的基本控件之一&#xff0c;其本质上也是一个按钮&#xff0c;具有开和关两种展示状态。 Switch开关按钮基本使用 在布局文件中定义开关按钮&#xff1a; <LinearLayoutandroid:layout_width"300dp"android:layo…

Vivado安装后添加器件库

1.前言 通常安装Vivado时&#xff0c;由于软件完整安装的空间需求过于庞大&#xff0c;一般只会选择一部分器件进行安装。而随着学习和工作的进展&#xff0c;遇到新的赛灵思朋友是成长的里程碑&#xff0c;也是综合不能通过的绊脚石。 今天有幸认识了一位新的赛灵思朋友——…

云原生: istio+dapr构建多运行时服务网格

2020 年&#xff0c;Bilgin Ibryam 提出了 Multi-Runtime&#xff08;多运行时&#xff09;的理念&#xff0c;对基于 Sidecar 模式的各种产品形态进行了实践总结和理论升华。那到底什么是多运行时呢&#xff1f;首先还是得从分布式应用的四大类基本需求讲起。简单来讲任何分布…

刷题练习3

文章目录 题目一分析题解 题目二分析第一种第二种 题解第一种方法代码第二种方法代码 题目一 题目链接 描述 读入一个字符串str&#xff0c;输出字符串str中的连续最长的数字串 输入描述&#xff1a; 个测试输入包含1个测试用例&#xff0c;一个字符串str&#xff0c;长度不超…

牛顿迭代法解超越方程

牛顿迭代法解超越方程 L g T 2 2 π t a n h ( 2 π L d ) L\frac{gT^2}{2\pi}tanh(\frac{2\pi}{L}d) L2πgT2​tanh(L2π​d) 方程&#xff1a; f ( L ) L − g T 2 2 π t a n h ( 2 π L d ) 0 f(L)L-\frac{gT^2}{2\pi}tanh(\frac{2\pi}{L}d)0 f(L)L−2πgT2​tanh(L2π…

~项目启动~

rmq是什么&#xff1f; "rmq" 可能指的是 "RabbitMQ"&#xff0c;它是一种开源消息队列软件&#xff0c;采用 AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;协议&#xff0c;可以用于支持异步处理、任务分发、解耦合等应用场景。Rabbit…

仪表检测与读数(一):仪表检测

基于YOLOv4的仪表检测 前言YOLOv4源码下载数据集处理与模型训练模型性能测试 前言 本系列是想记录一下自己实现的一种用于仪表检测与读数的方法&#xff0c;首先方法仅针对于单指针仪表和单行显示的数字仪表进行了检测与读数方法的设计。方法的整体思路是&#xff1a;第一步对拍…

[ 云计算 | Azure ] Chapter 06 | 计算服务之虚拟机、虚拟机规模集、Azure 容器、Azure App 与 Azure Functions

本系列已经更新文章列表&#xff08;已更新&#xff09;&#xff1a; [ Azure 云计算从业者 ] Chapter 03 | 描述云计算运营中的 CapEx 与 OpEx&#xff0c;如何区分 CapEx 与 OpEx[ Azure 云计算从业者 ] Chapter 04 | Azure核心体系结构组件之数据中心、区域与区域对、可用区…

【Qt】插件Plugin入门之Q_PLUGIN_METADATA()宏【2023.05.07】

摘要 分析Q_PLUGIN_METADATA宏的设计意图&#xff0c;站在设计者的意图进行插件的高屋建瓴式学习。 Meta-Object Compiler 简称MOC Qt 的 Meta-Object Compiler&#xff08;MOC&#xff09;是一个预处理器&#xff0c;用于处理带有特殊关键字的 C 文件&#xff0c;并生成用于…

Linux命令·netstat

netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据&#xff0c;一般用于检验本机各端口的网络连接情况。netstat是在内核中访问网络及相关信息的程序&#xff0c;它能提供TCP连接&#xff0c;TCP和UDP监听&#xff0c;进程内存管理的相关报告。 如果你的计算机有时候…

详细版简单易学版TypeScript各类型声明

假如本地新建了一个b.ts文件 安装TypeScript&#xff1a;npm install -g typescript 编译代码&#xff1a;tsc b.ts 运行js&#xff1a;node b.js 在终端输入 tsc -init 生成 tsconfig.json 文件 类型注解&#xff1a;TypeScript里的类型注解是一种轻量级的为函数或变量添加约束…

Python中模块和包基础学习

目录 模块 引入模块 使用from...import语句引入模块中的指定变量或函数 使用import...as语句给模块起别名 使用dir()函数查看模块中的所有变量和函数 使用__name__变量判断模块是被导入还是直接执行 包 注意 示例 模块 Python中的模块是指一个文件&#xff0c;可以包…

2.1 掌握NumPy数组对象ndarray

2.1 掌握NumPy数组对象ndarray 2.2.1 创建数组对象1&#xff0e;数组创建2&#xff0e;数组属性&#xff1a;ndarray&#xff08;数组&#xff09;是存储单一数据类型的多维数组。3&#xff0e;数组数据类型 2.1.2 生成随机数random模块常用随机数生成函数 2.1.3 通过索引访问数…

Python中异常处理的学习

目录 异常的基本介绍 异常处理语句 抛出异常 异常的基本介绍 在Python中&#xff0c;如果程序出现错误&#xff0c;会抛出异常。异常是一种Python对象&#xff0c;它封装了错误的信息&#xff0c;并提供了一种处理错误的机制。Python中内置了很多异常类型&#xff0c;包括但…