Python打发无聊时光:10.用flask创造按键控制的网页小游戏

news2024/11/18 9:30:24

第一步:装flask库

在终端输入:

pip install flask

第二步:完整代码

为了方便大家移植,我将HTML、CSS和JavaScript直接嵌到一个py文件中。

from flask import Flask, render_template_string

app = Flask(__name__)


@app.route('/')
def game():
    return render_template_string("""
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>秦蓝大冒险</title>
    <style>
        body {
            text-align: center;
            background-color: #000;
            color: #fff;
            font-family: "Courier New", Courier, monospace;
        }
        #gameContainer {
            width: 800px;
            height: 600px;
            background-color: #555; /* 纯色背景 */
            overflow: hidden;
            position: relative;
            margin: 20px auto;
        }
        .player, .chaser {
            position: absolute;
            width: 50px; /* 方块大小 */
            height: 50px; /* 方块大小 */
            text-align: center;
            line-height: 50px; /* 字体行高 */
            font-size: 14px; /* 字体大小 */
            font-weight: bold;
            color: white; /* 字体颜色 */
        }
        .player {
            background-color: #4CAF50;
        }
        .chaser {
            background-color: #F44336;
        }
        button {
            margin: 0 5px;
            padding: 5px 10px;
            font-size: 16px;
        }
    </style>
</head>
<body>

<h1>请逃脱秦蓝的追杀</h1>
<div id="gameContainer">
    <div id="player" class="player">吕千</div>
    <div id="chaser" class="chaser">秦蓝</div>
</div>
<div>
    <button onclick="setDifficulty('easy')">简单</button>
    <button onclick="setDifficulty('hard')">困难</button>
    <button onclick="setDifficulty('hell')">期末</button>
    <button onclick="restartGame()">批假</button>
</div>

<script>
    const player = document.getElementById('player');
    const chaser = document.getElementById('chaser');
    let playerPos = { x: 375, y: 275 };
    let chaserPos = { x: 50, y: 50 };
    let chaserSpeed = 1;
    let chaseInterval;

    function move(element, position) {
        element.style.left = position.x + 'px';
        element.style.top = position.y + 'px';
    }

    function chasePlayer() {
        if (playerPos.x !== chaserPos.x) {
            chaserPos.x += playerPos.x > chaserPos.x ? chaserSpeed : -chaserSpeed;
        }
        if (playerPos.y !== chaserPos.y) {
            chaserPos.y += playerPos.y > chaserPos.y ? chaserSpeed : -chaserSpeed;
        }
        move(chaser, chaserPos);
        checkCollision(); // 检查是否碰撞
    }

    function setDifficulty(difficulty) {
        switch (difficulty) {
            case 'easy':
                chaserSpeed = 1;
                break;
            case 'hard':
                chaserSpeed = 3;
                break;
            case 'hell':
                chaserSpeed = 5;
                break;
        }
    }

    function restartGame() {
        playerPos = { x: 375, y: 275 };
        chaserPos = { x: 50, y: 50 };
        move(player, playerPos);
        move(chaser, chaserPos);
    }

    window.addEventListener('keydown', function(e) {
        const maxRight = gameContainer.clientWidth - player.clientWidth;
        const maxBottom = gameContainer.clientHeight - player.clientHeight;

        switch (e.key) {
            case 'ArrowUp': playerPos.y = Math.max(playerPos.y - 10, 0); break;
            case 'ArrowDown': playerPos.y = Math.min(playerPos.y + 10, maxBottom); break;
            case 'ArrowLeft': playerPos.x = Math.max(playerPos.x - 10, 0); break;
            case 'ArrowRight': playerPos.x = Math.min(playerPos.x + 10, maxRight); break;
        }

        move(player, playerPos);
        chasePlayer(); // 移动后立即追逐
    });

    function checkCollision() {
        if (playerPos.x < chaserPos.x + chaser.clientWidth &&
            playerPos.x + player.clientWidth > chaserPos.x &&
            playerPos.y < chaserPos.y + chaser.clientHeight &&
            playerPos.y + player.clientHeight > chaserPos.y) {
            alert('游戏结束!秦蓝挂了吕千!');
            restartGame();
        }
    }

    chaseInterval = setInterval(chasePlayer, 50);

</script>

</body>
</html>
""")


if __name__ == '__main__':
    app.run(debug=True)

第三步:运行结果

运行窗口会输出一个网址:

直接点击或复制在浏览器打开:游戏的规则就是通过键盘上的“上下左右”键移动绿色方块,不让红色方块追上绿色方块,下面有三个速度选项和一个重置的选项。

完整效果如下:

https://www.bilibili.com/video/BV1WK421b7fj/?share_source=copy_web&vd_source=1fa901f35d74a5df2dd722de7cdb0b67

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

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

相关文章

智能水表预付费管理系统

智能水表预付费管理系统是当前智能水表技术的重要应用之一&#xff0c;结合了智能化管理和预付费功能&#xff0c;为水务公司和用户提供了便捷、高效的用水管理解决方案。该系统利用先进的科技手段&#xff0c;实现了水表抄表、计费和管理的自动化&#xff0c;为用户带来更便捷…

如何删除右键菜单中的WPS与百度网盘

WPS 打开"开始菜单" &#xff0c;搜索WPS&#xff0c;打开文件位置双击 WPS Office 工具选择配置工具 百度网盘 同时按住 Win键 和 R键 在运行中输入 regedit 打开注册表 复制粘贴&#xff0c;转到下面两个文件&#xff0c;直接删除即可 计算机\HKEY_CLASSES…

nginx实现http反向代理及负载均衡

目录 一、代理概述 1、代理概念 1.1 正向代理&#xff08;Forward Proxy&#xff09; 1.2 反向代理&#xff08;Reverse Proxy&#xff09; 1.3 正向代理与反向代理的区别 2、同构代理与异构代理 2.1 同构代理 2.2 异构代理 2.3 同构代理与异构代理的区别 二、四层代…

设计模式(五)-观察者模式

前言 实际业务开发过程中&#xff0c;业务逻辑可能非常复杂&#xff0c;核心业务 N 个子业务。如果都放到一块儿去做&#xff0c;代码可能会很长&#xff0c;耦合度不断攀升&#xff0c;维护起来也麻烦&#xff0c;甚至头疼。还有一些业务场景不需要在一次请求中同步完成&…

计讯物联5G RedCap网关TG463化繁为简,推动5G赋能千行百业

5G RedCap&#xff0c;全称为Reduced Capability&#xff0c;即在5G的基础上&#xff0c;对部分功能进行化繁为简后形成的新技术标准&#xff0c;故又称轻量化5G。作为高性价比下的精简技术&#xff0c;5G RedCap技术具备成本低、低功耗、兼顾5G等特点&#xff0c;能够在确保应…

小程序--组件通信

一、父传子 与vue利用props类似&#xff0c;小程序是利用自定义属性&#xff1a;properties // components/my-nav/my-nav.js Component({// 小程序组件默认样式是隔离&#xff0c;addGlobalClass设置为true可允许外部修改样式options: {addGlobalClass: true,// 只要使用到具…

express+mysql+vue,从零搭建一个商城管理系统4--mysql数据库链接

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、创建express_service数据库二、安装mysql三、新建config文件夹四、新建config/db.js五、index.js引入db.js文件六、启动项目预览总结 前言 需求&#xff1a;主要学习express&#xff0c;所以先写service…

MarkDown实用技巧:MarkDown中如何实现换行?

MarkDown实用技巧&#xff1a;MarkDown中如何实现换行&#xff1f; &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &#x1f448; 希望…

YOLOv8改进 | 独家创新篇 | 结合SOTA思想利用双主干网络改进YOLOv8(全网独家创新,最重磅的更新)

一、本文介绍 本文给大家带来的改进机制是结合目前SOTAYOLOv9的思想利用双主干网络来改进YOLOv8(本专栏目前发布以来改进最大的内容,同时本文内容为我个人一手整理全网独家首发 | 就连V9官方不支持的模型宽度和深度修改我都均已提供,本文内容支持YOLOv8全系列模型从n到x均可…

达梦数据库把日志数据按天统计不同状态的数据,实现字段行转列与根据id分组

1、这是日志表记录的数据&#xff0c;现在需要统计出每个app_id各个警告类型alarm_type的总数 2、先实现行转列&#xff0c;把三个alarm_type值转成列字段 SQL select app_id,count(CASE WHEN alarm_typeconcurrency THEN 1 ELSE null END) AS currentCount,count(CASE WHEN …

嵌入式学习第二十二天!(继续学习线程)

线程相关函数接口&#xff1a; 1. 线程分离属性&#xff1a; 线程结束后&#xff0c;自动回收线程空间 1. pthread_attr_init&#xff1a; int pthread_attr_init(pthread_attr_t *attr); 功能&#xff1a;线程属性初始化 2. pthread_attr_destroy&#xff1a; int pthread_…

【Linux】进程优先级以及Linux内核进程调度队列的简要介绍

进程优先级 基本概念查看系统进程修改进程的优先级Linux2.6内核进程调度队列的简要介绍和进程优先级有关的概念进程切换 基本概念 为什么会存在进程优先级&#xff1f;   进程优先级用于确定在资源竞争的情况下&#xff0c;哪个进程将被操作系统调度为下一个运行的进程。进程…

MFC 皮肤库配置

1.创建MFC 对话框 2.添加皮肤资源 添加资源 添加头文件 关闭SDL检测 添加静态库文件 修改字符集 添加头文件 将皮肤中的ssk文件加载到初始化实例中 > 运行即可

十三、Qt多线程与线程安全

一、多线程程序 QThread类提供了管理线程的方法&#xff1a;一个对象管理一个线程一般从QThread继承一个自定义类&#xff0c;重载run函数 1、实现程序 &#xff08;1&#xff09;创建项目&#xff0c;基于QDialog &#xff08;2&#xff09;添加类&#xff0c;修改基于QThr…

计算机网络-网络互连和互联网(四)

1.TCP协议&#xff1a; 传输控制协议&#xff0c;面向字节流按顺序连接&#xff0c;可靠&#xff0c;全双工&#xff0c;可变滑动窗口&#xff0c;缓冲累积传送。协议号为6。下面是TCP段&#xff08;段头&#xff09;&#xff0c;TCP头&#xff08;传输头&#xff09;&#xf…

数学建模【神经网络】

一、神经网络简介 机器学习与神经网络 机器学习是一类实现人工智能的方法总称&#xff0c;让计算机模拟或实现人类的学习行为神经网络是实现机器学习的一种模型实现机器学习的模型还有支持向量机&#xff0c;决策树&#xff0c;朴素贝叶斯分类器等 神经网络能用来做什么 已…

Lyra游戏框架宏观框架梳理

想象一下一个完整游戏流程。 Loading界面。 进入场景。 弹出Menu菜单 加载角色。 角色动画系统-切换动画系统&#xff08;默认-剑客-拳手&#xff09; 角色皮肤切换 相机 角色可以接收到用户输入&#xff0c;然后进行前后左右移动。 角色可以接收到用户输入&#xff0c;…

C语言----联合体

不知道大家是否听说过联合体这个名词。但其实大家不用觉得联合体有多特殊&#xff0c;大家可以想象结构体是一栋楼&#xff0c;里面有很多房间&#xff0c;住了形形色色的住户&#xff08;不用或者相同的数据&#xff09;。但联合体只有一个房间&#xff0c;所有的住户都挤在这…

半小时到秒级,京东零售定时任务优化怎么做的?

导言&#xff1a; 京东零售技术团队通过真实线上案例总结了针对海量数据批处理任务的一些通用优化方法&#xff0c;除了供大家借鉴参考之外&#xff0c;也更希望通过这篇文章呼吁大家在平时开发程序时能够更加注意程序的性能和所消耗的资源&#xff0c;避免在流量突增时给系统…

认证模式~

认证方式 基于Cookie和Session的认证方式 基于Cookie和Session的认证是传统的Web应用认证机制。它依赖于HTTP协议无状态的特性&#xff0c;在客户端&#xff08;浏览器&#xff09;和服务器之间保持用户的状态。 工作原理 用户登录&#xff1a;用户通过输入用户名和密码来登…