鱼C论坛

 找回密码
 立即注册
查看: 227|回复: 9

管道鸟

[复制链接]
发表于 2024-5-14 19:09:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
运用此方法积分不能正常增加,同时在经过几次管道后异常判定游戏失败。
<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title></title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        #bodyss {
            float: left;
        }

        body {
            background-color: antiquewhite;
        }

        a {
            text-decoration: none;
            color: black;
            float: left;
        }

        #head {
            margin-top: 5px;
        }

        .biaoti {
            border-bottom: 5px solid black;
            text-align: center;
            font-size: 30px;
        }

        .anniua {
            background-color: cadetblue;
            font-size: 18px;
            font-weight: 700;
        }

        .clear {
            clear: both;
        }

        #changjing {
            width: 800px;
            height: 600px;
            margin-top: 50px;
            background-color: skyblue;
        }

        .guangdao {
            width: 40px;
            height: 100px;
            background-color: cadetblue;
            position: absolute;
            animation: guanleft 3s linear infinite;
        }

        #downguan {
            top: 595px;
        }

        #niao {
            width: 40px;
            height: 40px;
            background-color: burlywood;
            position: absolute;
            left: 100px;
            top: 350px;
        }

        #jifen {
            margin-left: 380px;
            position: absolute;
            font-size:30px;
            font-weight:bolder;
        }

        @keyframes guanleft {
            from {
                left: 700px
            }

            to {
                left: 0px;
            }
        }
    </style>
</head>
<body id="bodybox">
    <div id="box">
        <h3 class="biaoti" id="title"><a href="小工具.html">首页</a>管道鸟</h3>
        <div id="niao"></div>
        <div id="changjing">
            <div id="jifen">0</div>
            <div class="guangdao" id="upguan"></div>
            <div class="guangdao" id="downguan"></div>
        </div>
    </div>
    <script>
        const niao = document.querySelector("#niao");
        const changjing = document.querySelector("#changjing");
        const uguan = document.querySelector("#upguan")
        const dguan = document.querySelector("#downguan")

        //初始化
        returnall();
        function returnall() {
            niao.style.top = `350px`
        }

        //鸟的落体运动
        let bridheight = 350
        function birddown() {
            bridheight = (niao.style.top).slice(0, -2)
            niao.style.top = `${+bridheight + 2}px`
            panding()
            if (bridheight > 655) {
                clearInterval(jishi1)
                // alert("lost")
            }
        }
        let jishi1 = setInterval(birddown, 10)
        //点击使鸟能够上升
        window.onclick = function () {
            let bridheight = (niao.style.top).slice(0, -2)
            niao.style.top = `${+bridheight - 60}px`
            panding()
            if (bridheight < 140) {
                clearInterval(jishi1)
                //alert("lost")
            }
        }
        //管道
        
        let uplenth = 100, downlenth = 100;//上下管子长度
        let alllenth = 200;//管子总长度
        //管道的长度随机以及位置处理
        function lenth() {
            uplenth = getInt(0, alllenth)
            downlenth = alllenth - uplenth
            if (downlenth < 0) {
                downlenth = 0
            }
            if (uplenth > alllenth) {
                uplenth = alllenth
            }
            uguan.style.height = `${uplenth}px`
            dguan.style.height = `${downlenth}px`
            dguan.style.top = `${695 - downlenth}px`
            alllenth = alllenth + 5
        }
        setInterval(lenth, 3000)
        //经过管道判定
        const jifen = document.querySelector("#jifen");
        let ji = 0
        let uleft = uguan.offsetLeft
        function panding() {
            uleft = uguan.offsetLeft

            if (uleft <= 140) {
                if ((bridheight > 140 + uplenth) && (bridheight < 655 - downlenth)) {
                    if (uleft == 140) {
                        jifen.innerHTML = ji++;
                    }
                }
                else {
                    alert('lost')
                }
            }
        }

        //等待函数
        function sleep(time) {
            return new Promise((resolve) => setTimeout(resolve, time));
        }
        //获取随机整数
        function getInt(min = 0, max = 10) {
            let mid
            if (min > max) {
                mid = min
                min = max
                max = mid
            }
            return Math.floor(Math.random() * (max - min + 1)) + min;
        }
    </script>
</body>
</html>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-5-14 19:09:24 | 显示全部楼层
问题出现在经过管道判定部分的代码上。具体来说,`if`语句的条件表达式错漏较多,导致判定不准确,从而引发了游戏失败的提示。下面是修复后的代码:
function panding() {
    uleft = uguan.offsetLeft

    if ((uleft <= 140 + 40) && (bridheight >= 140 + uplenth || bridheight <= 655 - downlenth)) {
        if (uleft === 140) {
            jifen.innerHTML = ji++;
        }
    } else {
        alert('lost')
    }
}

主要修改有两处:

- 将条件表达式的逻辑错误进行修正,使其判断正确。
- 将`uleft == 140`改为`uleft === 140`,这样更准确地判定是否经过一个管道。

希望这个修复能够解决您遇到的问题!如果还有其他问题,欢迎继续提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-14 19:11:17 | 显示全部楼层
FishC 发表于 2024-5-14 19:09
问题出现在经过管道判定部分的代码上。具体来说,`if`语句的条件表达式错漏较多,导致判定不准确,从而引发 ...

这样会使网站刚打开就判定为失败
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-14 19:12:33 | 显示全部楼层
Sorawithcat 发表于 2024-05-14 19:11
这样会使网站刚打开就判定为失败


抱歉,我犯了个错误。在管道判定部分的代码中,我们需要检查鸟是否与管道碰撞,而不是鸟是否在管道的范围内。以下是修复后的代码:
function panding() {
  uleft = uguan.offsetLeft;

  if (
    uleft + 40 > 100 &&
    uleft < 140 &&
    (bridheight < uplenth || bridheight + 40 > 600 - downlenth)
  ) {
    alert("lost");
  } else {
    jifen.innerHTML = ji++;
  }
}

在这个修复后的代码中,我们首先检查鸟和管道是否有重叠部分,即判断鸟是否与管道发生了碰撞。如果碰撞发生,则弹出游戏失败的提示。否则,将积分加一。

请注意,这只是一个基本的修复,仍然存在一些问题,比如没有停止游戏运行等。您可能需要进一步优化代码以实现完整的游戏功能。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-14 19:12:47 | 显示全部楼层
FishC 发表于 2024-5-14 19:09
问题出现在经过管道判定部分的代码上。具体来说,`if`语句的条件表达式错漏较多,导致判定不准确,从而引发 ...

我主要想解决积分为什么不能正常增加的原因
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-14 19:13:01 | 显示全部楼层
Sorawithcat 发表于 2024-05-14 19:12
我主要想解决积分为什么不能正常增加的原因


在您提供的代码中,我没有看到将`ji`变量的初始值设置为0的地方。所以即使碰到管道也不会增加积分。

请在代码的开头添加以下行:
let ji = 0;

这样做将为`ji`变量赋予初始值0,然后在碰撞检测时将其递增,从而实现积分的正常增加。

另外,还有一个潜在的问题是,由于多次调用了`setInterval(lenth, 3000)`,可能会导致多个定时器同时运行,从而导致触发间隔不准确。为了避免这个问题,可以在使用`setInterval`函数之前先调用`clearInterval`来清除之前的定时器。

将以下代码添加到`lenth()`函数开头:
clearInterval(lenthTimer);

然后在全局范围内声明一个`lenthTimer`变量,并将`setInterval`的返回值赋给它:
let lenthTimer = setInterval(lenth, 3000);

这样可以确保只有一个定时器在运行,并且每次重新开始的间隔都是准确的。

希望这些修改能够解决积分不能正常增加的问题。如有其他疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-14 19:14:48 | 显示全部楼层
FishC 发表于 2024-5-14 19:13
在您提供的代码中,我没有看到将`ji`变量的初始值设置为0的地方。所以即使碰到管道也不会增加积分。

...

是避开管道后得分
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-14 19:15:00 | 显示全部楼层


非常抱歉之前的回答有误。

要实现避开管道后得分的功能,我们可以在判定鸟成功通过管道之后增加得分。以下是修改后的代码:
// 管道
function panding() {
  uleft = uguan.offsetLeft;

  if (
    uleft + 40 < 100 &&
    uleft > 60 &&
    (bridheight < uplenth || bridheight + 40 > 600 - downlenth)
  ) {
    alert("lost");
  } else if (uleft == 60) {
    jifen.innerHTML = ji++;
  }
}

在这个修复后的代码中,我们首先检查鸟和管道是否有重叠部分,即判断鸟是否与管道发生了碰撞。如果碰撞发生,则弹出游戏失败的提示。否则,我们再检测鸟是否成功通过管道(即鸟的左边缘在管道的右侧),如果通过成功,则将积分加一。

请注意,这只是一个基本的修复,您可能仍然需要根据具体需求进一步调整代码以实现更完善的游戏功能。

希望这次的回答能够解决您的问题。如有其他疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-14 19:16:58 | 显示全部楼层
FishC 发表于 2024-5-14 19:15
非常抱歉之前的回答有误。

要实现避开管道后得分的功能,我们可以在判定鸟成功通过管道之后增加得分 ...

积分并没有增加,并且管道碰撞检测也没有成功
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-14 19:17:13 | 显示全部楼层
Sorawithcat 发表于 2024-05-14 19:16
积分并没有增加,并且管道碰撞检测也没有成功


非常抱歉之前的回答仍然有误。

在您提供的代码中,我发现了一些问题。首先,您没有为管道的上部和下部分设置不同的id,这样无法通过getElementById获取到对应的元素。其次,由于管道的运动是通过动画实现的,所以在获取管道位置时,应该使用getComputedStyle而不是offsetLeft。

以下是修复后的代码:
<div id="upguan" class="guangdao"></div>
<div id="downguan" class="guangdao"></div>
function panding() {
    let uleft = parseInt(getComputedStyle(uguan).left);
    let dleft = parseInt(getComputedStyle(dguan).left);
    let ntop = parseInt(getComputedStyle(niao).top);

    if (
        (uleft < 140 && uleft + 40 > 100 && ntop < uplenth) ||
        (dleft < 140 && dleft + 40 > 100 && ntop + 40 > 600 - downlenth)
    ) {
        alert('lost');
    } else if (uleft == 60) {
        jifen.innerHTML = ji++;
    }
}

在修复后的代码中,我们使用getComputedStyle来获取管道和鸟的位置信息,并与判定条件进行比较。如果鸟与管道发生碰撞,则会弹出游戏失败的提示框。如果鸟成功通过管道,则会增加积分。

希望这次的回答能够解决您的问题。如有其他疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 23:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表