二、初识rocky linux

1.进入Rocky_Linux虚拟机,按Win键,点击下方的终端

2.熟悉命令

  • ls --- 查看当前目录下的文件
  • pwd --- 查看当前目录的绝对路径
  • cd --- 切换到指定目录

3.熟悉命令

  • vi --- 打开文本文件,若不存在则创建

4.熟悉命令

  • mkdir --- 创建文件夹

5.演示系统管理登录,如图点击登出

6.点击未列出

7.使用管理员账号,输入root

8.输入密码

9.演示网页服务,yum安装http服务

  • yum -y install --- 用于安装服务,-y是安装过程中默认确认

10.启动http服务

  • systemctl start --- 启动服务

11.打开火狐浏览器

12.访问本地localhost,可以看到服务打开

13.关闭http服务

  • systemctl stop --- 关闭服务

14.刷新可以看到连接失败

15.熟悉命令

  • systemctl restart --- 重启服务,常用于修改了服务参数后重启
  • systemctl enable --- 开启服务开机自启
  • systemctl disable --- 关闭服务开机自启

16.打开文本编辑器

17.将以下贪吃蛇代码复制到文本中,并且保存

bash 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>经典贪吃蛇</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: 'Arial', sans-serif;
        }

        body {
            background: linear-gradient(135deg, #1a2a6c 0%, #b21f1f 50%, #1a2a6c 100%);
            min-height: 100vh;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            color: #fff;
            padding: 20px;
        }

        .game-container {
            background: rgba(0, 0, 0, 0.7);
            backdrop-filter: blur(8px);
            border-radius: 16px;
            padding: 20px;
            box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
            text-align: center;
        }

        .game-header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            margin-bottom: 20px;
            gap: 30px;
        }

        .info-panel {
            background: rgba(255, 255, 255, 0.1);
            padding: 10px 20px;
            border-radius: 8px;
            min-width: 100px;
        }

        .info-panel h3 {
            font-size: 16px;
            margin-bottom: 5px;
            opacity: 0.8;
        }

        #score, #speed {
            font-size: 24px;
            font-weight: bold;
            color: #ffd700;
        }

        .btn {
            background: #ff6b6b;
            color: #fff;
            border: none;
            padding: 10px 20px;
            border-radius: 8px;
            font-size: 16px;
            cursor: pointer;
            transition: all 0.3s ease;
        }

        .btn:hover {
            background: #ff4949;
            transform: translateY(-2px);
        }

        /* 游戏网格 */
        .game-grid {
            display: grid;
            grid-template-columns: repeat(20, 1fr);
            gap: 1px;
            background: #333;
            border: 2px solid #fff;
            border-radius: 8px;
            overflow: hidden;
        }

        .grid-cell {
            width: 20px;
            height: 20px;
            background: #111;
        }

        .grid-cell.snake {
            background: #00ff00;
            border-radius: 3px;
        }

        .grid-cell.food {
            background: #ff0000;
            border-radius: 50%;
        }

        /* 游戏结束弹窗 */
        .game-over {
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background: rgba(0, 0, 0, 0.85);
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            z-index: 100;
            display: none;
        }

        .game-over h2 {
            font-size: 48px;
            margin-bottom: 20px;
            color: #ff6b6b;
            text-shadow: 0 0 10px rgba(255, 107, 107, 0.5);
        }

        .game-over p {
            font-size: 28px;
            margin-bottom: 30px;
        }

        .game-over .btn {
            font-size: 18px;
            padding: 12px 24px;
        }

        /* 响应式调整 */
        @media (max-width: 500px) {
            .grid-cell {
                width: 15px;
                height: 15px;
            }
            .game-header {
                flex-direction: column;
                gap: 10px;
            }
            .game-over h2 {
                font-size: 36px;
            }
            .game-over p {
                font-size: 24px;
            }
        }
    </style>
</head>
<body>
    <div class="game-container">
        <div class="game-header">
            <div class="info-panel">
                <h3>得分</h3>
                <p id="score">0</p>
            </div>
            <div class="info-panel">
                <h3>速度</h3>
                <p id="speed">1</p>
            </div>
            <button class="btn" id="restart-btn">重新开始</button>
        </div>
        <div class="game-grid" id="game-grid"></div>
    </div>

    <div class="game-over" id="game-over">
        <h2>游戏结束!</h2>
        <p>最终得分:<span id="final-score">0</span></p>
        <button class="btn" id="replay-btn">再来一局</button>
    </div>

    <script>
        // 游戏配置
        const config = {
            gridSize: 20,        // 网格尺寸(20x20)
            initialSpeed: 200,   // 初始移动间隔(毫秒)
            speedStep: 10,       // 每吃一次食物加速(毫秒)
            minSpeed: 80         // 最小移动间隔(最快速度)
        };

        // 游戏状态
        let gameState = {
            snake: [              // 蛇身(坐标数组,头部在前)
                { x: 10, y: 10 }  // 初始位置
            ],
            direction: 'right',   // 初始方向
            nextDirection: 'right',// 下一个方向(解决方向切换冲突)
            food: { x: 5, y: 5 }, // 食物位置
            score: 0,             // 得分
            speed: 1,             // 速度等级
            moveInterval: null,   // 移动定时器
            isPaused: false       // 是否暂停
        };

        // DOM 元素
        const gameGrid = document.getElementById('game-grid');
        const scoreEl = document.getElementById('score');
        const speedEl = document.getElementById('speed');
        const gameOverEl = document.getElementById('game-over');
        const finalScoreEl = document.getElementById('final-score');
        const restartBtn = document.getElementById('restart-btn');
        const replayBtn = document.getElementById('replay-btn');

        // 初始化游戏
        function initGame() {
            // 重置游戏状态
            gameState = {
                snake: [{ x: 10, y: 10 }],
                direction: 'right',
                nextDirection: 'right',
                food: generateFood(),
                score: 0,
                speed: 1,
                moveInterval: null,
                isPaused: false
            };

            // 更新 UI
            scoreEl.textContent = gameState.score;
            speedEl.textContent = gameState.speed;
            gameOverEl.style.display = 'none';

            // 创建网格
            createGrid();

            // 启动游戏
            startGame();

            // 绑定键盘事件
            bindKeyboardEvents();
        }

        // 创建游戏网格
        function createGrid() {
            gameGrid.innerHTML = '';
            gameGrid.style.gridTemplateColumns = `repeat(${config.gridSize}, 1fr)`;

            // 创建网格单元格
            for (let y = 0; y < config.gridSize; y++) {
                for (let x = 0; x < config.gridSize; x++) {
                    const cell = document.createElement('div');
                    cell.className = 'grid-cell';
                    cell.dataset.x = x;
                    cell.dataset.y = y;
                    gameGrid.appendChild(cell);
                }
            }

            // 渲染蛇和食物
            renderSnake();
            renderFood();
        }

        // 生成随机食物(不与蛇身重叠)
        function generateFood() {
            let food;
            do {
                food = {
                    x: Math.floor(Math.random() * config.gridSize),
                    y: Math.floor(Math.random() * config.gridSize)
                };
            } while (
                // 检查食物是否在蛇身上
                gameState.snake.some(segment => segment.x === food.x && segment.y === food.y)
            );
            return food;
        }

        // 渲染蛇
        function renderSnake() {
            // 清除之前的蛇
            document.querySelectorAll('.grid-cell.snake').forEach(cell => {
                cell.classList.remove('snake');
            });

            // 渲染新蛇身
            gameState.snake.forEach(segment => {
                const cell = document.querySelector(`.grid-cell[data-x="${segment.x}"][data-y="${segment.y}"]`);
                if (cell) cell.classList.add('snake');
            });
        }

        // 渲染食物
        function renderFood() {
            // 清除之前的食物
            document.querySelectorAll('.grid-cell.food').forEach(cell => {
                cell.classList.remove('food');
            });

            // 渲染新食物
            const cell = document.querySelector(`.grid-cell[data-x="${gameState.food.x}"][data-y="${gameState.food.y}"]`);
            if (cell) cell.classList.add('food');
        }

        // 移动蛇
        function moveSnake() {
            if (gameState.isPaused) return;

            // 更新方向(避免180度转弯)
            const directionMap = {
                up: { dx: 0, dy: -1, opposite: 'down' },
                down: { dx: 0, dy: 1, opposite: 'up' },
                left: { dx: -1, dy: 0, opposite: 'right' },
                right: { dx: 1, dy: 0, opposite: 'left' }
            };

            // 确保不能反向移动
            if (gameState.nextDirection !== directionMap[gameState.direction].opposite) {
                gameState.direction = gameState.nextDirection;
            }

            const { dx, dy } = directionMap[gameState.direction];
            const head = { x: gameState.snake[0].x + dx, y: gameState.snake[0].y + dy };

            // 检查碰撞(边界或自身)
            if (
                head.x < 0 || head.x >= config.gridSize || // 边界碰撞
                head.y < 0 || head.y >= config.gridSize ||
                gameState.snake.some(segment => segment.x === head.x && segment.y === head.y) // 自身碰撞
            ) {
                gameOver();
                return;
            }

            // 添加新头部
            gameState.snake.unshift(head);

            // 检查是否吃到食物
            if (head.x === gameState.food.x && head.y === gameState.food.y) {
                // 加分
                gameState.score += 10;
                scoreEl.textContent = gameState.score;

                // 加速
                gameState.speed++;
                speedEl.textContent = gameState.speed;
                restartMoveInterval();

                // 生成新食物
                gameState.food = generateFood();
                renderFood();
            } else {
                // 没吃到食物,移除尾部
                gameState.snake.pop();
            }

            // 重新渲染蛇
            renderSnake();
        }

        // 启动游戏(设置移动定时器)
        function startGame() {
            // 清除之前的定时器
            if (gameState.moveInterval) {
                clearInterval(gameState.moveInterval);
            }

            // 计算当前速度(初始速度 - 加速步数 * 速度步长,不低于最小速度)
            const currentSpeed = Math.max(
                config.initialSpeed - (gameState.speed - 1) * config.speedStep,
                config.minSpeed
            );

            // 设置新定时器
            gameState.moveInterval = setInterval(moveSnake, currentSpeed);
        }

        // 重启移动定时器(加速时调用)
        function restartMoveInterval() {
            startGame();
        }

        // 游戏结束
        function gameOver() {
            clearInterval(gameState.moveInterval);
            finalScoreEl.textContent = gameState.score;
            gameOverEl.style.display = 'flex';
        }

        // 绑定键盘事件
        function bindKeyboardEvents() {
            document.addEventListener('keydown', (e) => {
                switch (e.key) {
                    case 'ArrowUp':
                        gameState.nextDirection = 'up';
                        break;
                    case 'ArrowDown':
                        gameState.nextDirection = 'down';
                        break;
                    case 'ArrowLeft':
                        gameState.nextDirection = 'left';
                        break;
                    case 'ArrowRight':
                        gameState.nextDirection = 'right';
                        break;
                    case ' ': // 空格键暂停/继续
                        gameState.isPaused = !gameState.isPaused;
                        break;
                }
            });
        }

        // 绑定按钮事件
        restartBtn.addEventListener('click', initGame);
        replayBtn.addEventListener('click', initGame);

        // 初始化游戏
        window.addEventListener('load', initGame);
    </script>
</body>
</html>

18.点击如下目录

19.点击如下目录

20.点击如下目录

21.点击如下目录

22.修改名称并保存

23.进入到对应目录,确认文件已经保存

24.访问以下URL贪吃蛇成功运行

25.查看rocky linux的内网ip

  • ifconfig --- 查看ip信息

26.使用xshell访问Rocky_Linux虚拟机

27.填写如图信息并连接

28.接受并保存

29.输入用户名

30.输入密码

31.可以看到成功连接到rocky linux

相关推荐
Alex艾力的IT数字空间17 小时前
在 Kylin(麒麟)操作系统上搭建 Docker 环境
大数据·运维·缓存·docker·容器·负载均衡·kylin
嵌入式学习和实践18 小时前
虚拟机 Ubuntu 磁盘扩容完全指南:从原理到实践,一步到位
linux·ubuntu·磁盘扩容
陳103018 小时前
Linux:进程间切换与调度
linux·运维·服务器
lcreek18 小时前
Linux 虚拟文件系统的建立与使用全过程解析
linux·虚拟文件系统·vfs
寒秋花开曾相惜19 小时前
(学习笔记)第四章 处理器体系结构
linux·网络·数据结构·笔记·学习
疏星浅月19 小时前
虚拟内存三大核心作用详解
linux·c语言·arm开发·嵌入式硬件
邂逅星河浪漫20 小时前
【银行内网开发-管理端】Vue管理端+Auth后台开发+Nginx配置+Linux部署(详细解析)
linux·javascript·css·vue.js·nginx·html·前后端联调
SilentSamsara20 小时前
TCP 三次握手:连接建立失败的那些坑
运维·服务器·网络·网络协议·tcp/ip
码农小钻风21 小时前
利用Samba实现局域网跨平台共享文件
linux·samba·共享
LN花开富贵21 小时前
【ROS】鱼香ROS2学习笔记二
linux·笔记·python·学习·嵌入式