三句话开发一个刮刮乐小游戏!暖ta一整个冬天!

简介: 本文介绍了如何利用千问开发一款情侣刮刮乐小游戏,通过三步简单指令实现从单个功能到整体框架,再到多端优化的过程,旨在为生活增添乐趣,促进情感交流。在线体验地址已提供,鼓励读者动手尝试,探索编程与AI结合的无限可能。

前言

书接上文,在上次完成文字冒险小游戏之后,我依然觉得不够过瘾,于是又突发奇想,利用千问开发了一款情侣刮刮乐小游戏,初衷是为了给平淡的生活多创造一些惊喜,更好的促进两人之间的交流和感情升温。

在线体验地址:https://tongyi.aliyun.com/qianwen/share?shareId=9b863549-e802-4387-88b9-409c3c56604b&type=codePreview

效果展示:因电脑端不好操作,手机端使用最佳

9befb9fb-2881-41d7-96a2-10ab6f09d61e.gif

三句话开发一个刮刮乐小游戏

第一句话:单个功能实现

帮助我开发一个刮刮乐的游戏,使用鼠标刮掉图层30%的面积后可以看到图层内的真实内容,确保只有刮开涂层后下面的内容才能显示。

在最开始,我们可以专注于单个功能的实现,确保已实现的单个刮刮乐模板逻辑是完全正确的

运行后给出代码预览如下:

image.png

第二句话:整体框架实现

将其修改成九宫格,每个格子下面内置随机的奖励文字,适配谷歌浏览器,保证隐藏的字体能显示在对应的网格容器内部。

这里是进行了诸多prompt限制,确保整体框架的实现

image.png

第三句话:多端及内容优化

优化使刮开涂层的操作能在手机端正常使用,优化文字的字体,稍微可爱一些等等。

也可以直接自己指定涂层下的内容,采用如下prompt:

将第一排的文字依次修改成XXX、XXX、XXX,将第二排的文字依次修改成XXX、XXX、XXX,第三排的文字依次修改成XXX、XXX、XXX

或者为了界面更好看,可以自己引入一些特效之类的,比如:

在随机刮开任何一个涂层后,显示出文字之前,加载一个爱心绽放的全屏绽放效果

源码

应需求,附上源码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <style>
        body {
   
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
            background-color: #f0f0f0;
            font-family: 'Bungee Inline', cursive; /* Bolder and playful font */
            overflow: hidden;
            position: relative;
        }
        .grid-container {
   
            display: grid;
            grid-template-columns: repeat(3, 100px);
            grid-template-rows: repeat(3, 100px);
            gap: 5px;
            position: relative;
        }
        canvas {
   
            border: 2px solid #ccc;
            cursor: crosshair;
            touch-action: none; /* Prevent default touch actions */
        }
        .hidden-text {
   
            position: absolute;
            font-size: 16px;
            color: #ff6347; /* Tomato color for the prize text */
            visibility: hidden;
            pointer-events: none;
            width: 100px;
            height: 100px;
            display: flex;
            justify-content: center;
            align-items: center;
            transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out;
        }

        .hidden-text.visible {
   
            visibility: visible;
            opacity: 1;
            transform: scale(1.1) rotate(10deg);
        }

        /* Importing Bungee Inline font */
        @import url('https://fonts.googleapis.com/css2?family=Bungee+Inline&display=swap');
    </style>
</head>
<body>
    <div class="grid-container">
        <!-- Grid items will be generated by JavaScript -->
    </div>

    <script>
        const rewards = [
            "准备早餐", "逛艺术馆", "小礼物",
            "快去学习", "去扬州", "按摩服务",
            "特权奖励", "谢谢参与", "做家务"
        ];

        const gridContainer = document.querySelector('.grid-container');
        const gridSize = 3;
        let canDraw = true;

        function createGrid() {
   
            for (let i = 0; i < gridSize * gridSize; i++) {
   
                const canvas = document.createElement('canvas');
                canvas.width = 100;
                canvas.height = 100;
                const ctx = canvas.getContext('2d');

                // Draw the overlay layer
                ctx.fillStyle = '#cccccc';
                ctx.fillRect(0, 0, canvas.width, canvas.height);

                // Create a div for the reward text
                const prizeText = document.createElement('div');
                prizeText.className = 'hidden-text';
                prizeText.textContent = rewards[i];

                // Position the prize text within the corresponding grid cell
                prizeText.style.gridColumnStart = (i % gridSize) + 1;
                prizeText.style.gridRowStart = Math.floor(i / gridSize) + 1;

                // Add event listeners for drawing on desktop and mobile
                let isDrawing = false;
                const totalPixels = canvas.width * canvas.height;

                function startDrawing(e) {
   
                    if (!canDraw || !isDrawingAllowed(canvas)) return;
                    e.preventDefault(); // Prevent default touch behavior
                    isDrawing = true;
                    draw(e);
                }

                function stopDrawing() {
   
                    isDrawing = false;
                }

                function draw(e) {
   
                    if (!isDrawing || !canDraw) return;

                    const rect = canvas.getBoundingClientRect();
                    let x, y;
                    if (e.touches && e.touches.length > 0) {
   
                        x = e.touches[0].clientX - rect.left;
                        y = e.touches[0].clientY - rect.top;
                    } else {
   
                        x = e.clientX - rect.left;
                        y = e.clientY - rect.top;
                    }

                    ctx.globalCompositeOperation = 'destination-out';
                    ctx.beginPath();
                    ctx.arc(x, y, 10, 0, Math.PI * 2);
                    ctx.fill();

                    checkIfOneThirdErased(canvas, prizeText);
                }

                function checkIfOneThirdErased(canvas, prizeText) {
   
                    const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
                    const data = imageData.data;

                    let transparentPixels = 0;
                    for (let i = 0; i < data.length; i += 4) {
   
                        if (data[i] === 0 && data[i + 1] === 0 && data[i + 2] === 0 && data[i + 3] === 0) {
   
                            transparentPixels++;
                        }
                    }

                    if (transparentPixels > totalPixels / 3) {
   
                        prizeText.classList.add('visible'); // Show the prize text
                        canDraw = false; // Disable further drawing
                    }
                }

                function isDrawingAllowed(canvas) {
   
                    // Check if any part of the canvas is already transparent
                    const imageData = canvas.getContext('2d').getImageData(0, 0, canvas.width, canvas.height);
                    const data = imageData.data;

                    for (let i = 0; i < data.length; i += 4) {
   
                        if (data[i] === 0 && data[i + 1] === 0 && data[i + 2] === 0 && data[i + 3] === 0) {
   
                            return false; // Drawing not allowed if already erased
                        }
                    }
                    return true; // Drawing allowed
                }

                canvas.addEventListener('mousedown', startDrawing);
                canvas.addEventListener('mousemove', draw);
                canvas.addEventListener('mouseup', stopDrawing);
                canvas.addEventListener('mouseout', stopDrawing);

                // Touch events for mobile devices
                canvas.addEventListener('touchstart', startDrawing);
                canvas.addEventListener('touchmove', draw);
                canvas.addEventListener('touchend', stopDrawing);
                canvas.addEventListener('touchcancel', stopDrawing);

                gridContainer.appendChild(canvas);
                gridContainer.appendChild(prizeText);
            }
        }

        createGrid();
    </script>
</body>
</html>

总结

完成这三步,你就可以得到一个和上面一摸一样的刮刮乐小游戏啦,是不是很简单呢?

希望这个小项目能够激发更多的人去探索编程的魅力,尝试结合AI用自己的双手创造出独一无二的作品,无论是为了娱乐、学习还是分享给他人。如果你也对这样的创意编程感兴趣,不妨动手试试,也许下一个令人惊艳的小游戏就出自你的想象之中。不要忘记,编程的世界充满了无限可能,只要你敢于梦想,就能将它们变为现实。

相关文章
|
11月前
|
机器学习/深度学习 人工智能 搜索推荐
底层技术大揭秘!AI智能导购如何重塑购物体验
双十一期间,淘宝内测AI助手“淘宝问问”,基于阿里通义大模型,旨在提升用户在淘宝上的商品搜索和推荐效率。该助手通过品牌推荐、兴趣商品推荐和关联问题三大板块,提供个性化购物体验。其背后采用多智能体架构,包括规划助理和商品导购助理,通过对话历史和用户输入,实现精准商品推荐。此外,文章还介绍了如何快速部署此解决方案,并探讨了其对现代购物体验的影响。
|
11月前
|
自然语言处理 前端开发 网络协议
用 Qwen2.5-Coder 开发一个网页应用,完全0基础,已部署上线,代码开源!
利用Qwen2.5-Coder成功开发了一个简洁实用的网页应用,该应用能够在浏览器Tab标题中显示北京时间,并在页面中集成了实时时间显示和番茄时钟功能。通过Qwen2.5-Coder的强大代码生成能力,从零基础开始,仅需简单提示便完成了HTML、CSS和JavaScript的编写。经过几次优化调整,最终实现了美观且功能完善的网页应用,并顺利部署至Vercel平台,满足了作者在全屏模式下查看时间的需求。
用 Qwen2.5-Coder 开发一个网页应用,完全0基础,已部署上线,代码开源!
|
12月前
|
人工智能 监控 机器人
便宜云服务器开发者社区博文规范及指引
便宜云服务器开发者社区博文规范及指引
3105 23
便宜云服务器开发者社区博文规范及指引
|
11月前
|
消息中间件 人工智能 运维
12月更文特别场——寻找用云高手,分享云&AI实践
我们寻找你,用云高手,欢迎分享你的真知灼见!
3930 101
|
11月前
|
JSON 分布式计算 数据处理
加速数据处理与AI开发的利器:便宜云服务器MaxFrame实验评测
随着数据量的爆炸式增长,传统数据分析方法逐渐显现出局限性。Python作为数据科学领域的主流语言,因其简洁易用和丰富的库支持备受青睐。便宜云服务器推出的MaxFrame是一个专为Python开发者设计的分布式计算框架,旨在充分利用MaxCompute的强大能力,提供高效、灵活且易于使用的工具,应对大规模数据处理需求。MaxFrame不仅继承了Pandas等流行数据处理库的友好接口,还通过集成先进的分布式计算技术,显著提升了数据处理的速度和效率。
|
11月前
|
机器学习/深度学习 人工智能 JSON
【实战干货】AI大模型工程应用于车联网场景的实战总结
本文介绍了图像生成技术在AIGC领域的发展历程、关键技术和当前趋势,以及这些技术如何应用于新能源汽车行业的车联网服务中。
|
11月前
|
Arthas Java 应用服务中间件
我的程序突然罢工了|深入探究HSF调用异常,从死锁到活锁的全面分析与解决
本文详细记录了作者在处理HSF调用异常问题的过程中,从初步怀疑死锁到最终发现并解决活锁问题的全过程。
|
11月前
|
存储 NoSQL 关系型数据库
从大数据到大模型:如何做到“心无桎梏,身无藩篱”
在大数据和大模型的加持下,现代数据技术释放了巨大的技术红利,通过多种数据范式解除了数据的桎梏,使得应用程序达到了“心无桎梏,身无藩篱”的自在境界,那么现代应用有哪些数据范式呢?这正是本文尝试回答的问题。
|
12月前
|
人工智能 自然语言处理 前端开发
什么?!通义千问也可以在线开发应用了?!
阿里巴巴推出的通义千问,是一个超大规模语言模型,旨在高效处理信息和生成创意内容。它不仅能在创意文案、办公助理、学习助手等领域提供丰富交互体验,还支持定制化解决方案。近日,通义千问推出代码模式,基于Qwen2.5-Coder模型,用户即使不懂编程也能用自然语言生成应用,如个人简历、2048小游戏等。该模式通过预置模板和灵活的自定义选项,极大简化了应用开发过程,助力用户快速实现创意。
|
11月前
|
人工智能 自然语言处理 前端开发
从0开始打造一款APP:前端+搭建本机服务,定制暖冬卫衣先到先得
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。
http://www.vxiaotou.com