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

游戏介绍:

《秦蓝大冒险》是一款简单而紧张的追逐游戏。在这个游戏中,玩家将控制一名名叫“吕千”的角色,试图在一个封闭的空间内逃避一个名为“秦蓝”的追逐者。随着时间的推移,“秦蓝”会不断追踪玩家的位置,努力捕捉到他。

游戏特色:

  • 简单控制:通过键盘的箭头键来控制“吕千”的移动,轻松上手。
  • 难度选择:玩家可以选择三种难度模式——“简单”,“困难”,和“期末”,每种模式下“秦蓝”的移动速度都不一样,适合不同水平的玩家。
  • 紧张刺激:随着“秦蓝”追逐的速度越来越快,玩家需要灵活地避开追逐,体验紧张而刺激的游戏乐趣。
  • 即时反馈:一旦“吕千”被“秦蓝”捕捉,游戏立即结束,并弹出提示“游戏结束!秦蓝抓到了吕千!”,同时游戏会自动重置,玩家可以迅速重新开始游戏。

第一步:装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.mfbz.cn/a/414624.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言中如何进行内存管理

主页&#xff1a;17_Kevin-CSDN博客 收录专栏&#xff1a;《C语言》 C语言是一种强大而灵活的编程语言&#xff0c;但与其他高级语言不同&#xff0c;它要求程序员自己负责内存的管理。正确的内存管理对于程序的性能和稳定性至关重要。 一、引言 C 语言是一门广泛使用的编程语…

2.1_6 线程的实现方式和多线程模型

文章目录 2.1_6 线程的实现方式和多线程模型&#xff08;一&#xff09;线程的实现方式&#xff08;1&#xff09;用户级线程&#xff08;2&#xff09;内核级线程 &#xff08;二&#xff09;多线程模型&#xff08;1&#xff09;一对一模型&#xff08;2&#xff09;多对一模…

stable diffusion webUI之赛博菩萨【秋葉】——工具包新手安裝与使用教程

stable diffusion webUI之赛博菩萨【秋葉】——工具包新手安裝与使用教程 AI浪潮袭来&#xff0c;还是学习学习为妙赛博菩萨【秋葉】简介——&#xff08;葉ye&#xff0c;四声&#xff0c;同叶&#xff09;A绘世启动器.exe&#xff08;sd-webui-aki-v4.6.x&#xff09;工具包安…

VirtualBox虚拟机配置双网卡

安装完后Linux后。下一步需要设置Linux的网络。为了便于学习测试&#xff0c;通常我们需要虚拟机能通宿主机和外网。类似达到下面的效果。虚拟机跟宿主本机和外网&#xff0c;及另外一台同网段的虚拟机也是相通 解决思路是-->配置双网卡&#xff0c;网卡1使用NAT网络模式&a…

vue组件中data为什么必须是一个函数

查看本专栏目录 关于作者 还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#x…

fiddler抓包工具使用(一)

一、fiddler简介 1. 简介 fiddler是一款强大的抓包工具&#xff0c;它的原理以web代理服务器的形式进行工作fiddler是好用的web调试工具之一 能记录所有客户端和服务器的http和https请求修改输入、输出数据包数据允许监视设置断点弱网测试 2. 工作原理 代理就是在客户端和服…

QT C++实战:实现用户登录页面及多个界面跳转

主要思路 一个登录界面&#xff0c;以管理员Or普通用户登录管理员&#xff1a;一个管理员的操作界面&#xff0c;可以把数据录入到数据库中。有返回登陆按钮&#xff0c;可以选择重新登陆&#xff08;管理员Or普通用户普通用户&#xff1a;一个主界面&#xff0c;负责展示视频…

java动态代理面试题,java反射原理面试题

01 并发宝典&#xff1a;面试专题 面试专题分为四个部分&#xff0c;分别如下 Synchronized 相关问题 可重入锁 ReentrantLock 及其他显式锁相关问题 Java 线程池相关问题 Java 内存模型相关问题 1.1 Synchronized 相关问题&#xff08;这里整理了八问&#xff09; 问题一…

揭示预处理中的秘密!(二)

目录 ​编辑 1. #运算符 2. ##运算符 3. 命名约定 4. #undef 5. 命令行定义 6. 条件编译 7. 头文件的被包含的方式 8.嵌套文件包含 9. 其他预处理指令 10. 完结散花 悟已往之不谏&#xff0c;知来者犹可追 …

【Go-Zero】测试API查询信息无法返回数据库信息与api、rpc文件编写规范

【Go-Zero】测试API查询信息无法返回数据库信息与api、rpc文件编写规范 大家好 我是寸铁&#x1f44a; 总结了一篇测试API查询信息无法返回数据库信息与api、rpc文件编写规范的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 问题背景 大家好&#xff0c;我是寸铁&#xff01…

C++——基础语法(2):函数重载、引用

4. 函数重载 函数重载就是同一个函数名可以重复被定义&#xff0c;即允许定义相同函数名的函数。但是相同名字的函数怎么在使用的时候进行区分呢&#xff1f;所以同一个函数名的函数之间肯定是要存在不同点的&#xff0c;除了函数名外&#xff0c;还有返回类型和参数两部分可以…

前后端项目-part03

文章目录 5.4.4 机构名称5.4.4.1 创建实体类Company5.4.4.2 创建实体类CompanyMapper5.4.4.3 创建实体类CompanyService5.4.4.4 创建实体类CompanyController5.4.4.5 后端测试5.4.4.6 修改basic.js5.4.4.7 修改course.vue5.4.4.8 测试5.4.5 课程标签5.4.5.1 效果5.4.5.2 修改co…

golang学习5,glang的web的restful接口

1. //返回json r.GET("/getJson", controller.GetUserInfo) package mainimport (/*"net/http"*/"gin/src/main/controller""github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/get", func(ctx *…

【Linux系统化学习】信号概念和信号的产生

目录 信号的概念 从生活中的例子中感知信号 前台进程和后台进程 前台进程 后台进程 操作系统如何知道用户向键盘写入数据了&#xff1f; 进程如何得知自己收到了信号&#xff1f; 信号捕捉 signal函数 Core Dump&#xff08;核心转储&#xff09; 信号产生的方式 通…

如何选择合适的汽车芯片ERP系统?

随着汽车产业的飞速发展&#xff0c;汽车芯片作为关键组件&#xff0c;其管理变得愈发重要。为了高效管理汽车芯片的生产、销售、库存等各个环节&#xff0c;许多企业开始引入汽车芯片ERP(企业资源规划)系统。那么&#xff0c;如何选择合适的汽车芯片ERP系统呢? 明确需求是关键…

react-JSX基本使用

1.目标 能够知道什么是JSX 能够使用JSX创建React元素 能够在JSX中使用JS表达式 能够使用JSX的条件渲染和列表渲染 能够给JSX添加样式 2.目录 JSX的基本使用 JSX中使用JS表达式 JSX的条件渲染 JSX的列表渲染 JSX的样式处理 3.JSX的基本使用 3.1 createElement()的问题 A. …

小红书3C家电行业种草营销策略打法,纯干货

小红书作为国内种草营销的鼻祖&#xff0c;拥有庞大的年轻用户群体&#xff0c;特别是在3C家电行业&#xff0c;小红书的种草营销效应更是明显。据相关数据显示&#xff0c;小红书3C家电行业的用户关注度持续攀升&#xff0c;尤其是90后和00后&#xff0c;他们对新鲜事物的接受…

C# 学习第四弹——字符串

一、char类型的使用 字符使用单引号&#xff0c;单个字符 转义字符是一种特殊的字符变量&#xff0c;以反斜线开头&#xff0c;后跟一个或多个字符。 输出多级目录可以使用 二、字符串的声明和初始化 1、引用字符串常量 引用字符串常量初始化——字符使用单引号&#xff0…

基于springboot+vue的学科平台系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

幻兽帕鲁(Palworld 1.4.11.5.0)私有服务器搭建(docker版)

文章目录 说明客户端安装服务器部署1Panel安装和配置docker服务初始化设置设置开机自启动设置镜像加速 游戏服务端部署游戏服务端参数可视化配置 Palworld连接服务器问题总结 服务端升级&#xff08;1.5.0&#xff09; 说明 服务器硬件要求&#xff1a;Linux系统/Window系统&a…