JavaScript写的台球小游戏
- 格式:doc
- 大小:76.00 KB
- 文档页数:13
二十一点小游戏(HTML游戏使用JavaScript开发)HTML游戏使用JavaScript开发已经成为一种流行的趋势,其中二十一点小游戏是一种简单而有趣的游戏。
在这个小游戏中,玩家需要通过抽取数字卡片的方式来接近或者达到21点的总和。
以下是对这款游戏的简要介绍,包括游戏规则、开发过程和功能设计。
一、游戏规则1. 玩家可以选择抽取一张数字卡片或者停止抽取。
2. 玩家根据手中卡片的总和来判断是否获胜。
3. 如果玩家手中卡片的总和超过21点,则游戏失败。
4. 如果玩家手中卡片的总和等于21点,则游戏胜利。
5. 在游戏中,A的点数可以是1或者11,J、Q、K的点数均为10。
二、开发过程在开发二十一点小游戏时,我们需要使用HTML、CSS和JavaScript来实现游戏的界面和逻辑。
1. HTML部分首先,我们需要设计出游戏的界面。
可以使用HTML5的语义化标签来构建游戏画面的各个部分,例如头部、主体和底部。
并且使用CSS来设置样式,使得游戏界面看起来更加美观。
2. JavaScript部分在实现游戏逻辑时,我们需要使用JavaScript来处理用户的交互和计算卡片的点数总和。
2.1 定义卡片对象使用JavaScript定义一个卡片对象,包含点数和花色两个属性。
每次抽卡时,可以从预先定义好的一组卡片中随机抽取一张。
2.2 玩家抽取卡片当玩家点击抽取按钮时,JavaScript会随机抽取一张卡片,并根据抽取的结果更新玩家的手牌。
2.3 计算点数总和通过遍历玩家的手牌数组,计算出玩家手中所有卡片的点数总和。
需要注意A的处理,根据手中的其他卡片决定A是1还是11。
2.4 判断胜负根据点数总和判断玩家是胜利、失败还是继续游戏。
如果点数总和超过21点,游戏失败。
如果点数总和等于21点,游戏胜利。
三、功能设计为了增加游戏的趣味性和可玩性,可以在二十一点小游戏中添加以下功能:1. 游戏计分记录玩家的胜利次数和失败次数,并在界面上显示。
打台球小游戏
打台球是一种受欢迎的桌上运动,它需要精准的击球技巧和战略思维。
游戏的目标是使用球杆将球击入袋中,同时遵循一定的规则和技巧。
游戏规则:
1. 台球桌上有15个编号的球,其中包括一组红色球和一组彩色球(黑、粉、蓝、棕、绿、黄)以及一颗白色的白球。
2. 游戏开始时,玩家需要用白球击打红球,将红球依次击入袋中。
3. 当红球全部被击入袋中后,玩家可以开始击打彩色球。
在击打彩色球时,玩家需要先将彩色球击入袋中,然后再击打红球。
4. 游戏的最终目标是将所有球都击入袋中,最后击打黑球并赢得比赛。
玩法:
1. 玩家可以选择不同的击球力度和角度,以达到最佳的球路。
2. 在击球时,玩家需要考虑球杆的位置、手部动作和击球力度,以确保准确击打目标球。
3. 玩家可以利用反弹和旋转来控制球的方向和速度,以获得更好的击球效果。
4. 玩家需要在击球前仔细规划每一杆的击球路线,以确保能够连续击打多个球。
术语和技巧:
1. 击球力度:玩家需要掌握不同力度的击球技巧,以适应不同的球路和距离。
2. 角度控制:玩家需要学会调整球杆的角度,以确保球的击打方向准确无误。
3. 球道规划:玩家需要在击球前规划好球道,以确保能够连续击打多个球,最大限度地提高得分。
通过掌握这些规则、玩法和技巧,玩家可以享受到打台球小游戏
带来的挑战和乐趣,同时也能提高自己的击球技巧和战略思维能力。
愿你在游戏中尽情享受!。
打台球小游戏
目标:打台球小游戏的目标是使用球杆将球击入球袋,根据规则得分并赢得比赛。
规则: 1. 游戏通常由两名玩家进行,每人轮流击球。
2. 可以选择红色球或黄色球作为比赛的目标球。
3. 每个玩家轮流击球,先将目标球击入球袋,然后再将彩球击入球袋。
4. 如果玩家在一杆中将目标球和彩球都击入球袋,则可以继续击打,直到没有球被击入球袋。
5. 如果玩家在一杆中未能将目标球或彩球击入球袋,轮到对方击打。
6. 游戏直到所有的球都被击入球袋,得分最高的玩家获胜。
玩法: 1. 准备:将15个红色球和6个彩球摆成三角形,球杆放在球桌的一端。
2. 击球:玩家可以在球桌上自由移动球杆,用球杆击打白球,以使目标球和彩球进入球袋。
3. 技巧:击球时需要注意击球的力度和方向,以确保球能够准确进入球袋。
此外,需要考虑球杆的姿势和击球的角度,以避免犯规或者使对手获得优势。
术语和技巧: 1. 击球力度:根据球的位置和击球的目标,需要掌握不同的击球力度,以确保球能够准确进入球袋。
2. 击球角度:需要根据球的位置和球杆的姿势选择合适的击球角度,以避免
犯规或者使对手获得优势。
3. 犯规:击球过程中需要遵守规则,避免犯规,否则对手将获得额外的机会。
通过掌握击球力度和角度,以及遵守规则,玩家可以在打台球小游戏中取得成功,并享受游戏的乐趣。
同时,尝试不同的策略和方法也可以使游戏更具挑战性和乐趣。
打台球小游戏
打台球是一种受欢迎的桌上运动,玩家使用球杆击打球,目标是将球打入球袋。
台球游戏通常使用15个编号球和一只白球,玩家需要使用球杆击打白球,以便将编号球击入球袋。
游戏的目标是使用球杆将所有的编号球按照规定的顺序依次打入球袋,最后再将黑八球击入指定的球袋。
玩家需要在不犯规的情况下,先将自己的编号球全部打入球袋,然后再将黑八球打入指定的球袋,才能获胜。
游戏的规则包括: 1. 开局时,玩家需要使用球杆击打白球,让白球撞击编号球,使编号球依次进袋。
2. 如果在一杆中将自己的编号球和黑八球同时打入球袋,或者将黑八球先打入球袋,都会导致犯规。
3. 如果玩家在一杆中没有将球击入球袋,或者将对方的编号球击入球袋,也会被视为犯规。
4. 犯规的玩家将失去击打的机会,并且对手可以将白球放置在台面上的任意位置。
玩家需要掌握一些技巧和术语,以便在游戏中取得优势。
例如,玩家需要掌握击球的力度和角度,以确保球能够准确进袋。
另外,了解如何使用反弹和旋转等技巧,也能帮助玩家在游戏中取得更好的表现。
为了增加游戏的挑战性和乐趣,玩家可以尝试不同的策略和方法,例如选择不同的击球顺序,或者利用球杆的特殊技巧来达到更好的效果。
此外,玩家还可以尝试使用一些花式击球的技巧,来展示自己的球技水平。
总的来说,打台球小游戏是一种充满挑战和乐趣的桌上运动,玩家需要掌握一定的技巧和策略,才能在游戏中取得好成绩。
通过不断练习和尝试,玩家可以不断提高自己的球技水平,享受游戏带来的乐趣。
弹球小游戏编程实现在当代科技发展快速的背景下,电子游戏已经成为人们娱乐生活中不可或缺的一部分。
弹球小游戏作为其中的经典之作,引领了一代又一代游戏爱好者的热情。
在本文中,将介绍弹球小游戏的编程实现过程,以帮助读者进一步了解游戏制作的原理和技术。
一、项目介绍弹球小游戏是一种经典的街机游戏,在游戏中玩家需要操控一个球拍,通过反弹球拍,将球击打到上方的砖块,从而消除砖块并得分。
游戏难度会逐渐增加,随着砖块的消除,球的速度也会加快,给玩家带来挑战。
二、编程环境准备在实现弹球小游戏之前,需要准备一些编程环境。
首先,选择合适的编程语言和开发工具,如Python语言和Pygame库。
接着,安装相关的软件和依赖项,并配置开发环境,确保编程平台正常运行。
三、游戏场景设计在编程实现过程中,首先需要设计游戏场景。
弹球小游戏通常包含一个球拍、一个球和若干砖块。
可以利用开发工具提供的绘图函数绘制这些元素,并设置它们在屏幕上的位置和大小。
四、游戏物理效果模拟为了使游戏更具真实感,需要模拟球的运动轨迹和球拍的反弹效果。
通过计算球的速度和方向,并结合碰撞检测算法,可以实现球与边界、球拍和砖块的交互作用。
当球和物体发生碰撞时,根据不同的碰撞情况调整球的运动方式,以及砖块的消除与得分。
五、用户交互设计游戏的交互性是吸引玩家的重要因素之一。
通过监听用户的键盘或鼠标操作,可以实现球拍的移动控制和游戏的开始、暂停等功能。
此外,可以添加音效和动画效果,提升游戏的娱乐性和视觉效果。
六、游戏逻辑设计在实现游戏逻辑时,需要确定游戏的基本规则和条件。
如何判断球与砖块的碰撞、游戏胜利和失败的条件、分数的计算等,都需要根据具体的游戏设计进行编程实现。
此外,还需要考虑游戏难度的逐渐增加以及关卡的设计等方面。
七、测试与优化在完成游戏的编程实现后,需要进行测试和优化。
通过不断调试和测试,发现和修复程序中的错误,并对性能进行优化,以提高游戏的稳定性和流畅度。
通过以上的步骤,我们可以顺利地完成弹球小游戏的编程实现。
弹球游戏(HTML游戏使用JavaScript开发)HTML游戏已经成为人们在网络上娱乐和消遣的热门选择。
其中,弹球游戏是一种简单而令人上瘾的游戏类型。
通过使用JavaScript开发,我们可以创建一个动态、互动性强的弹球游戏。
本文将介绍如何使用HTML和JavaScript开发一个简单但有趣的弹球游戏。
1. 准备工作在开始编写游戏代码之前,我们需要准备一些基本的文件和资源。
首先,创建一个HTML文件,并在文件中引入JavaScript代码。
其次,我们需要为游戏设计必要的图形资源,如球、挡板和背景图片。
确保这些资源文件被正确引入到HTML文件中。
2. 创建游戏画布游戏画布是显示游戏内容的区域,在HTML中通过<canvas>标签创建。
为<canvas>标签添加一个唯一的id属性,并在JavaScript代码中使用该id获取对画布的引用。
3. 绘制游戏元素在游戏画布上绘制游戏元素,如球和挡板,以及游戏背景。
使用JavaScript的Canvas API,我们可以通过指定坐标和尺寸来定位和绘制这些元素。
4. 定义游戏动画为了使游戏元素能够在画布中运动,我们需要实现一个动画循环。
通过使用JavaScript的requestAnimationFrame函数,在每一帧更新游戏元素的位置,并重新绘制它们,以模拟动画效果。
5. 处理用户输入游戏需要对用户的输入做出相应。
在弹球游戏中,用户通常通过移动挡板来控制球的移动方向。
为了实现这一功能,我们可以通过监听键盘事件或鼠标事件来获取用户输入,并相应地更新挡板的位置。
6. 碰撞检测在弹球游戏中,球与边界或挡板的碰撞是非常重要的。
通过编写碰撞检测函数,我们可以检测球与游戏边界或挡板之间的碰撞,并进行相应的处理,如改变球的移动方向或增加得分。
7. 游戏结束当球与底部边界发生碰撞或达到一定得分时,游戏将结束。
在结束游戏时,我们可以显示得分信息,并提供重新开始游戏的选项。
打台球小游戏
1. 开始游戏时,球桌上会放置15个彩色球和一个白球。
彩色球分为红色和彩色两种,红色球每个值1分,彩色球分别为黄色(2分)、绿色(3分)、棕色(4分)、蓝色(5分)、粉红色(6分)和黑色(7分)。
2. 玩家轮流使用球杆击打白球,目标是先将红色球打入袋中,然后再依次打入彩色球。
在打入红色球后,玩家可以选择继续打入红色球或者彩色球,直到所有红色球都被打入袋中。
3. 一旦所有红色球都被打入袋中,玩家需要按照球的分值顺序依次打入彩色球。
游戏直到所有球都被打入袋中或者某一玩家先达到规定的分数为止。
4. 在击球时,玩家需要注意击球的力度和角度,以确保能够准确打入目标球,并且使得白球停在有利的位置上,以便下一杆的击球。
5. 在游戏中,还有一些特殊的规则和技巧,例如犯规、使用花式击球等,这些都可以增加游戏的趣味性和挑战性。
打台球小游戏需要玩家具备一定的眼力、手眼协调能力和战术思维,同时也可以通过不同的击球技巧和策略来增加游戏的趣味性。
希望以上的介绍能够让读者对打台球小游戏有一个清晰的认识,并且能够尝试不同的方法来提高自己的技能和战术水平。
滚动球小游戏编程实现滚动球小游戏是一种简单而有趣的游戏,玩家通过控制一个小球滚动并避开障碍物,力求到达终点。
本文将介绍如何通过编程实现滚动球小游戏,并提供一些实用的技巧和建议。
游戏环境搭建首先,我们需要选择适合开发滚动球小游戏的编程语言和开发环境。
目前,最常用的选择是使用JavaScript和HTML5的Canvas元素创建游戏界面。
这种方法具有广泛的浏览器兼容性,并提供了丰富的绘图和交互功能。
游戏界面设计在编程实现滚动球小游戏之前,我们需要设计一个吸引人的游戏界面。
可以使用图形设计工具或者在线生成器创建游戏地图和各种元素,包括起点、终点、障碍物等。
确保界面设计简洁明了、色彩搭配合理,并通过测试保证元素的布局和大小适合玩家操作。
球体运动实现接下来,我们需要编写代码来实现球体的运动。
通过监听用户的键盘操作或者触摸屏幕事件,可以控制球体的移动方向和速度。
使用合适的算法和数学公式,实现球体在地图上的滚动效果。
同时,需要检测球体是否与障碍物发生碰撞,以及是否到达终点。
在这个过程中,要注意处理边界条件和异常情况,确保游戏的稳定性和流畅性。
游戏逻辑实现除了球体的运动,还需要编码来实现游戏的逻辑。
这包括计分系统、时间限制、排行榜、游戏关卡等功能。
可以使用变量、条件语句和循环结构来控制游戏的状态和进程,通过更新界面和交互,实现游戏的动态效果和用户体验。
优化和测试完成代码编写后,我们需要进行优化和测试。
优化包括减少代码冗余、提高算法效率、优化界面渲染等方面,以提升游戏运行的速度和稳定性。
测试阶段需要检查游戏逻辑是否正常运行,包括游戏流程、难度调整、碰撞检测等功能是否符合预期。
同时,还需要测试游戏在不同设备和浏览器上的兼容性和表现。
总结通过本文的介绍,我们了解到了滚动球小游戏的编程实现过程。
从游戏环境的搭建到界面设计,再到球体的运动和游戏逻辑的实现,每个步骤都需要细致的设计和编码。
通过不断优化和测试,我们可以创建出一个完整且富有趣味性的滚动球小游戏。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><head><title>wujinjian</title><script type="text/javascript">var xyNum=20; //敌方数量var arrXY=new Array(); //用数组记录敌方var myObjII; //我自己外面的divvar myObjI; //我自己var mapobj; //地图对象//控制窗体位置function formPosition(){var w=getMapObj().style.width.replace("px","")-0;var clientw=document.body.clientWidth;getMapObj().style.left=(clientw-w)/2+"px";document.getElementById("fbid").style.left=(clientw-w)/2+"px";document.getElementById("gzid").style.left=(clientw-w)/2+"px";}function getMapObj(){if(mapobj==null)mapobj=document.getElementById("mapid");return mapobj;}//创建敌方function createYu(){for(var i=0;i<xyNum;i++){var xyObj=document.createElement("div");arrXY[i]=xyObj;var sx=randomZL().split("*");xyObj.qdy=0; //当敌人比我强大时,敌人向我靠近xyObj.tp=sx[3]; //敌人类型xyObj.sdx=getRandom(10); //敌人向左移动的速度xyObj.sdy=0; //敌人向上移动的速度xyObj.style.position="absolute";xyObj.style.left=getMapWidth()+"px";xyObj.style.top=getRandom(getMapHeight())+"px";xyObj.style.width=sx[0];xyObj.style.height=sx[1];xyObj.style.border="white solid 1px";xyObj.style.filter="alpha(opacity=80)";xyObj.style.opacity=0.8;xyObj.style.backgroundColor=sx[2];getMapObj().appendChild(xyObj);}createMyYu();moveYu();}//随机敌人类型function randomZL(){var zl=getRandom(10);var w=""; //敌人的宽var h=""; //高var color=""; //颜色var tp=""; //类型if(zl>=1 && zl<=3){w="20px";h="20px";color="cyan";tp="1"; //敌人类型,1最小,依次类推}else if(zl==4 || zl==5){w="40px";h="40px";color="yellow";tp="2";}else if(zl==6 || zl==7){w="60px";h="60px";color="gray";tp="3";}else if(zl==8){w="80px";h="80px";color="black";tp="4";}else{w="20px";h="20px";color="red";tp="5"; //tp=5 为补生命值}return w+"*"+h+"*"+color+"*"+tp;}//创建我自己function createMyYu(){//创建我自己外面的div,用于判断敌人是否在我附近myObjII=document.createElement("div");myObjII.style.position="absolute";myObjII.style.left="0px";myObjII.style.top="0px";myObjII.style.width="120px";myObjII.style.height="120px";myObjII.style.backgroundColor="";//getMapObj().appendChild(myObjII);//创建我自己跟随鼠标移动的divmyObjI=document.createElement("div");myObjI.style.position="absolute";myObjI.style.left="0px";myObjI.style.top="0px";myObjI.style.width="20px";myObjI.style.height="20px";myObjI.tp="1";myObjI.style.backgroundColor="blue";myObjI.style.border="white solid 1px";getMapObj().appendChild(myObjI);}//获取某个值下的随机数function getRandom(maxval){var sj=parseInt(Math.random()*maxval);if(sj==0)sj=1;return sj;}//敌人移动function moveYu(){for(var i=0;i<arrXY.length;i++){//敌人向左移动arrXY[i].style.left=getObjWaH(arrXY[i],"left")-arrXY[i].sdx+"px";//敌人向上移动if(getObjWaH(arrXY[i],"top")<=getMapHeight()/2)arrXY[i].style.top=getObjWaH(arrXY[i],"top")-arrXY[i].sdy+"px";elsearrXY[i].style.top=getObjWaH(arrXY[i],"top")+arrXY[i].sdy+"px";//当敌人比我强大时,敌人向我靠近arrXY[i].style.top=getObjWaH(arrXY[i],"top")+arrXY[i].qdy+"px";//敌人从地图中消失if(getObjWaH(arrXY[i],"left")<0 || getObjWaH(arrXY[i],"top")<0 || getObjWaH(arrXY[i],"top")>getMapHeight()){resetMove(arrXY[i]);}//判断敌人是否在我附近if(isChongDie(myObjII,arrXY[i])){if(myObjI.tp-0>=arrXY[i].tp-0) //比对方强大时,敌人逃跑arrXY[i].sdy=10;else if(arrXY[i].tp-0!=5) //比对方弱小时,敌人向我靠近{if(getObjWaH(myObjI,"top")<getObjWaH(arrXY[i],"top")){if(arrXY[i].qdy==0)arrXY[i].qdy=-10; //向上靠近}else{if(arrXY[i].qdy==0)arrXY[i].qdy=10; //向下靠近}}}else //不在我附近时,还原值arrXY[i].qdy=0;//判断是否吃掉对方,或被对方吃掉if(isChongDie(myObjI,arrXY[i])){//吃掉对方if(myObjI.tp-0>=arrXY[i].tp-0){var _szz=0;if(arrXY[i].tp=="1")_szz=10;else if(arrXY[i].tp=="2")_szz=15;else if(arrXY[i].tp=="3")_szz=20;else if(arrXY[i].tp=="4")_szz=25;varnowszz=getObjWaH(document.getElementById("szz"),"width")+_szz;if(nowszz>=500) //长大一级{if(myObjI.tp-0<5){myObjI.tp=myObjI.tp-0+1;myObjI.style.width=getObjWaH(myObjI,"width")+20+"px"myObjI.style.height=getObjWaH(myObjI,"height")+20+"px"document.getElementById("szz").style.width="10px";}else{alert("哈哈...顺我者昌逆我者亡!");window.location.href=window.location.href;}}else{document.getElementById("szz").style.width=nowszz+"px";document.getElementById("szz").innerHTML=nowszz;}resetMove(arrXY[i]);}else if(arrXY[i].tp-0==5)//吃到生命值{varnowsmz=getObjWaH(document.getElementById("smz"),"width")+50;if(nowsmz>=500)document.getElementById("smz").style.width="500px";elsedocument.getElementById("smz").style.width=nowsmz+"px";document.getElementById("smz").innerHTML=document.getElementById("smz").style.width.re place("px","");resetMove(arrXY[i]);}else //被对方吃掉{var _smz=0;if(arrXY[i].tp=="1")_smz=10;else if(arrXY[i].tp=="2")_smz=20;else if(arrXY[i].tp=="3")_smz=50;else if(arrXY[i].tp=="4")_smz=100;varnowsmz=getObjWaH(document.getElementById("smz"),"width")-_smz;if(nowsmz<=0) //{document.getElementById("smz").style.width="0px";document.getElementById("smz").innerHTML="0";alert("over");window.location.href=window.location.href;}else{document.getElementById("smz").style.width=nowsmz+"px";document.getElementById("smz").innerHTML=nowsmz;}}}}setTimeout(moveYu,50);}//敌人从地图中消失时重置function resetMove(yuobj){var sx=randomZL().split("*");yuobj.tp=sx[3];yuobj.sdx=getRandom(10);yuobj.sdy=0;yuobj.style.width=sx[0];yuobj.style.height=sx[1];yuobj.style.backgroundColor=sx[2];yuobj.style.left=getMapWidth()+"px";yuobj.style.top=getRandom(getMapHeight())+"px";}function getMapWidth(){return getMapObj().style.width.replace("px","")-0;}function getMapHeight(){return getMapObj().style.height.replace("px","")-0;}function getMapTop(){return getMapObj().style.top.replace("px","")-0;}function getMapLeft(){return getMapObj().style.left.replace("px","")-0;}function getObjWaH(obj,wah){return obj.style[wah].replace("px","")-0;}//跟随鼠标移动的div(我自己)function mouseMove(e){var myObjIleft=e.clientX-getMapLeft()-getObjWaH(myObjI,"width")/2;if(myObjIleft<0)myObjIleft=0;if(myObjIleft>getMapWidth()-getObjWaH(myObjI,"width"))myObjIleft=getMapWidth()-getObjWaH(myObjI,"width");myObjI.style.left=myObjIleft+"px";var myObjIIleft=e.clientX-getMapLeft()-getObjWaH(myObjII,"width")/2;if(myObjIIleft<0)myObjIIleft=0;if(myObjIIleft>getMapWidth()-getObjWaH(myObjII,"width"))myObjIIleft=getMapWidth()-getObjWaH(myObjII,"width");myObjII.style.left=myObjIIleft+"px";var myObjItop=e.clientY-getMapTop()-getObjWaH(myObjI,"height")/2;if(myObjItop<0)myObjItop=0;if(myObjItop>getMapHeight()-getObjWaH(myObjI,"height"))myObjItop=getMapHeight()-getObjWaH(myObjI,"height");myObjI.style.top=myObjItop+"px";var myObjIItop=e.clientY-getMapTop()-getObjWaH(myObjII,"height")/2;if(myObjIItop<0)myObjIItop=0;if(myObjIItop>getMapHeight()-getObjWaH(myObjII,"height"))myObjIItop=getMapHeight()-getObjWaH(myObjII,"height");myObjII.style.top=myObjIItop+"px";}//判断敌我双方是否碰撞在一起,原理:利用两个圆的圆心距离之和是否小于两个圆的半径之和function isChongDie(obj1,obj2){var obj1left=getObjWaH(obj1,"left")+getObjWaH(obj1,"width")/2;var obj2left=getObjWaH(obj2,"left")+getObjWaH(obj2,"width")/2;var obj1top=getObjWaH(obj1,"top")+getObjWaH(obj1,"width")/2;var obj2top=getObjWaH(obj2,"top")+getObjWaH(obj2,"width")/2;varjl=Math.sqrt(Math.abs(obj1left-obj2left)*Math.abs(obj1left-obj2left)+Math.abs(obj1top-obj2top)* Math.abs(obj1top-obj2top));if(jl<=getObjWaH(obj1,"width")/2+getObjWaH(obj2,"width")/2)return true;//重叠elsereturn false;}</script></head>对我有用[0]丢个板砖[0]引用举报管理TOP 回复次数:211wujinjian2008n(JS)等级:#1楼得分:0回复于:2010-06-11 23:06:57HTML code<body onload="formPosition(),createYu()" onresize="formPosition()" style="font-size:10pt"> <div id="fbid" style="position:absolute;left:0px;top:10px;width:795px;height:45px;background-color:rgb(223,22 3,223);padding-left:5px;border:black solid 1px"><table><tr><td>生命值:</td><td><div id="smz" style="width:500px;height:15px;background-color:red;color:white;font-weight:bold"align="center">500</div></td></tr><tr><td>生长值:</td><td><div id="szz" style="width:10px;height:15px;background-color:blue;color:white;font-weight:bold"align="center">0</div></td></tr></table></div><div id="mapid" style="position:absolute;left:0px;top:60px;width:800px;height:400px;background-color:rgb(223,2 23,223);overflow:hidden;border:black solid 1px" onmousemove="mouseMove(event)"> </div><div id="gzid" style="position:absolute;left:0px;top:465px;width:795px;height:45px;background-color:rgb(223,2 23,223);padding-left:5px;padding-top:5px;border:black solid 1px;color:red;line-height:20px"> *游戏规则:移动鼠标吃方块,你只能吃跟你同样大小或比你小的方块,当你的生长值到达500时,你自己的方块会变大一级,<br>当生命值变成0时,Game Over!游戏中的红色小方块就是给你补生命值的。
桌球小游戏桌球是一种室内运动,通常由两名选手进行。
游戏的目标是使用球杆将球击入桌面上的六个袋中,同时阻止对手做同样的事情。
游戏的规则如下:1. 游戏开始时,16个球被放置在桌面上,其中包括15个红色球和一个彩色球(通常是黑色球)。
2. 红色球被放置成三角形的形状,彩色球则位于三角形的最上方。
3. 选手轮流进行击球,每次只能击打一次球。
4. 击球时,选手必须先击打红色球,直到没有红色球可以被击打为止。
5. 如果选手成功将红色球击入袋中,他们将获得一定的分数,分数等于袋中球的数量。
6. 如果选手在击打红色球之后将彩色球击入袋中,他们将获得额外的分数。
7. 在击打彩色球之后,选手可以选择继续击打红色球或彩色球,直到没有球可以被击打为止。
8. 如果选手未能将球击入袋中,或者犯规(如击打球出界或击打球时球杆未接触到球),则对手将获得两个分数。
9. 游戏继续,直到所有球都被击打完为止。
10. 最后,计算每个选手的得分,得分最高者获胜。
在游戏中,有一些术语和技巧是必要的:1. 击球:使用球杆击打球的动作。
2. 球杆:用于击打球的长棍。
3. 击球点:球杆击打球时的位置。
4. 角度和力量:击球时需要调整球杆的角度和力量,以使球正确进袋。
5. 瞄准:选手需要准确瞄准球,并预测球的路径和弹跳,以确定正确的击球点和力量。
为了增加游戏的挑战性和乐趣,选手可以尝试不同的策略和方法:1. 打击顺序:选手可以选择不同的红球击打顺序,以最大化得分。
2. 安全打法:选手可以选择将球击打到安全区域,使对手无法轻易得分。
3. 防守策略:选手可以选择将球击打到对手难以击打的位置,以增加对手的难度。
4. 瞄准技巧:选手可以通过练习瞄准技巧来提高准确性和预测能力。
总之,桌球小游戏是一种有趣而具有挑战性的室内运动。
通过掌握击球技巧和运用策略,选手可以享受到游戏带来的乐趣,并不断提高自己的技能。
弹球小游戏编程教程弹球小游戏是一种经典的游戏类型,很受玩家的喜爱。
本篇文章将为大家介绍如何使用编程语言来设计和实现一个简单的弹球小游戏。
本教程适用于初学者,通过学习本文,您可以了解到游戏的基本原理和编程技巧。
1. 游戏设计思路在介绍编程过程之前,我们先来讨论一下游戏设计的思路。
弹球小游戏主要包含以下几个主要元素:- 球:游戏主角,需要设置其初始位置、大小、颜色等属性。
- 挡板:用于控制球的运动,通常由玩家控制。
- 砖块:球需要与之碰撞,以此来消除砖块并得分。
- 分数系统:记录玩家的得分情况。
基于以上元素,我们可以将游戏流程分解为以下几个步骤:- 初始化画布和游戏元素。
- 处理玩家的输入以移动挡板。
- 让球运动并检测碰撞。
- 根据碰撞结果更新游戏状态。
- 循环执行以上步骤,直到游戏结束。
2. 编程环境设置在开始编写代码之前,我们需要准备一个编程环境。
我们可以使用各种编程语言来实现弹球小游戏,如Python、JavaScript等。
下面以Python为例,介绍如何进行环境设置:- 安装Python编程语言的解释器,你可以从Python官方网站上下载并安装最新版本的Python。
- 安装一个代码编辑器,比如Visual Studio Code、PyCharm等,用于编写和调试代码。
你也可以使用自己熟悉的文本编辑器。
安装完成后,就可以开始编写代码了。
3. 代码实现接下来,我们将使用Python语言来实现弹球小游戏。
首先,我们需要导入游戏所需要的库和模块:```pythonimport pygamefrom pygame.locals import *```然后,设置一些基本的游戏参数:```python# 游戏窗口大小screen_width = 800screen_height = 600# 球的初始位置和速度ball_x = 200ball_y = 200ball_dx = 2ball_dy = 2# 挡板的位置和速度paddle_x = 300paddle_y = 550paddle_dx = 0# 砖块的位置和状态bricks = []brick_width = 75brick_height = 20brick_count = 10# 初始化游戏pygame.init()screen = pygame.display.set_mode((screen_width, screen_height))pygame.display.set_caption("弹球小游戏")```然后,我们定义一些函数来处理游戏的逻辑:```pythondef draw_ball(x, y):pygame.draw.circle(screen, (255, 0, 0), (x, y), 10) def draw_paddle(x, y):pygame.draw.rect(screen, (0, 255, 0), (x, y, 100, 10)) def draw_bricks():for brick in bricks:pygame.draw.rect(screen, (0, 0, 255), brick)def check_collision():global ball_dx, ball_dy, brick_countif ball_x < 0 or ball_x > screen_width:ball_dx = -ball_dxif ball_y < 0 or ball_y > paddle_y:ball_dy = -ball_dyfor brick in bricks:if brick.collidepoint(ball_x, ball_y):bricks.remove(brick)ball_dy = -ball_dybrick_count -= 1def update_game():global ball_x, ball_y, paddle_x, paddle_y, paddle_dx, brick_count ball_x += ball_dxball_y += ball_dypaddle_x += paddle_dxif paddle_x < 0:paddle_x = 0if paddle_x > screen_width - 100:paddle_x = screen_width - 100if brick_count == 0:pygame.quit()exit()def render_game():screen.fill((0, 0, 0))draw_ball(ball_x, ball_y)draw_paddle(paddle_x, paddle_y)draw_bricks()pygame.display.flip()```最后,我们编写一个游戏主循环来处理用户的输入和更新游戏状态:```pythonwhile True:for event in pygame.event.get():if event.type == QUIT:pygame.quit()exit()if event.type == KEYDOWN:if event.key == K_LEFT:paddle_dx = -2elif event.key == K_RIGHT:paddle_dx = 2if event.type == KEYUP:if event.key == K_LEFT or event.key == K_RIGHT:paddle_dx = 0update_game()check_collision()render_game()```4. 运行游戏编写完成后,保存文件并执行代码,就可以开始游戏了。
JavaScript编写的⽹页⼩游戏,很给⼒以下为游戏界⾯:以下为游戏代码:<html><head><script language="JavaScript"><!-- Original: Nick Young () --><!-- recompose: Pakchoi () -->var timerID = null;var INT = 40;var loadFLG = 0;var gameFLG = 0;var missFLG = 0;var tim = 0;var blcol = new Array(5); // block colorvar blsta = new Array(40); // block statusvar blNO = new Array(40); // block Novar blclr = 0; // clear blockvar ballX = 0; // ball datavar ballY = 0;var ballN = 5;var ballDX = 0;var ballDY = 0;var tmpRL = 193;var X = 0;blcol[0] = "blue";blcol[1] = "yello";blcol[2] = "red";blcol[3] = "purple";blcol[4] = "#FF0000";blcol[5] = "black";function mainF() {clearTimeout(timerID);tim = tim + 1;with (Math) {tmptim = floor(tim / 10)};document.forms[0].TM.value = tmptim;ballX = ballX + ballDX;ballY = ballY + ballDY;outCHK();blkCHK();ball.style.posTop = ballY;ball.style.posLeft = ballX;racket.style.posLeft = tmpRL;if (gameFLG == 01) {timerID = setTimeout("mainF()", INT);}}function initG() {if (blclr >= 40) {blclr = 0;tim = 0;ballN = 3;with (Math) {tmptim = floor(tim / 10);}document.forms[0].TM.value = tmptim;clrmes.style.posTop = -1000;clrmes.style.posLeft = -1000;ovrmes.style.posTop = -1000;ovrmes.style.posLeft = -1000;for (ib = 0; ib < 5; ib++) {for (ia = 0; ia < 8; ia++) {chc(ib * 8 + ia +1, ib);blsta[ib * 8 + ia] = ib;}}}document.forms[0].BL.value = ballN;starter.style.posTop = -1000;starter.style.posLeft = -1000;gameFLG = 1;loadFLG = 1;ballX = 209;ballY = 270;ballDX =- 8;ballDY =- 8;tmpRL = 193;missFLG = 0;timerID = setTimeout("mainF()", INT);}function SUP() {UP.outerHTML = "<DIV ID='DN' STYLE='position:absolute'><A HREF='javascript:SDN()'>SPEED DOWN</A></DIV>"; DN.style.posTop = 170;DN.style.posLeft = 432;INT = 40;}function SDN() {DN.outerHTML = "<DIV ID='UP' STYLE='position:absolute'><A HREF='javascript:SUP()'>SPEED UP</A></DIV>";UP.style.posTop = 170;UP.style.posLeft = 432;INT = 50;}function MouseMv() {if (loadFLG == 1) {tmpRL = X - 20;if (tmpRL < 16) { tmpRL = 16; }if (tmpRL > 370) { tmpRL = 370; }}}function outCHK() {if (ballX < 16){ ballX = 32 - ballX; ballDX = -ballDX; }if (ballX > 401){ ballX = 802 - ballX; ballDX = -ballDX; }if (ballY < 16){ ballY = 32 - ballY; ballDY = -ballDY; }if (ballY >= 272) {if (missFLG == 0) {tmpX = (ballDX / ballDY) * (272 - ballY) + ballX;if (tmpX >= tmpRL - 12) {if (tmpX <= tmpRL + 42) {ballY = 272; ballDY = -ballDY;ballX = tmpX;ballRD = tmpX - tmpRL;with (Math){ ballDX = 8 * abs(ballDX) / ballDX; }if (ballRD < -4){ ballDX = -15; }if (ballRD > 36){ ballDX = 15; }if (ballRD >= 14){ if (ballRD <= 16) { ballDX = -2; } }if (ballRD >= 17){ if (ballRD <= 20) { ballDX = 2; } }if (ballRD >= 0){ if (ballRD <= 4) { ballDX = -4; } }if (ballRD >= 28){ if (ballRD <= 32) { ballDX = 4; } }if (ballRD >= -4){ if (ballRD <= -1) { ballDX = -11; } }if (ballRD >= 33){ if (ballRD <= 36) { ballDX = 11; } }}}if (ballDY > 0){ missFLG = 1; }}else {if (ballY > 290){ missFLG = 0; ballN = ballN - 1; gameEnd(); }}}}function blkCHK() {tmpY = ballY + 4;tmpX = ballX + 4;if (tmpY >= 48) {if (tmpY <= 147) {if (tmpX >= 29) {if (tmpX <= 396) {with (Math) {ia = floor((tmpX - 29) / 46);ib = floor((tmpY - 48) / 20);ic = ib * 8 + ia;}if (blsta[ic] <= 4) {tmpbc = blsta[ic] + 1;blsta[ic] = tmpbc;chc(ic + 1, tmpbc);if (tmpbc == 5){ blclr = blclr + 1; }if (blclr >= 40){ gameEnd(); }if (ballDX > 0) {iy=(ballDY / ballDX) * (29 + 46 * ia - tmpX) + tmpY;if (iy > 48 + 20 * ib + 18) {tmpY1 = 48 + 20 * ib + 18;tmpX1 = (ballDX / ballDY) * (48 + 20 * ib + 18 - tmpY) + tmpX; ballX = tmpX1 - 4;ballY = tmpY1 - 4;ballDY = -ballDY;}else {if (iy < 44 + 20 * ib) {tmpY1 = 48 + 20 * ib;tmpX1 = (ballDX / ballDY) * (48 + 20 * ib - tmpY) + tmpX;ballX = tmpX1 - 4;ballY = tmpY1 - 4;ballDY = -ballDY;}else {tmpX1 = 29 + 46 * ia;tmpY1 = (ballDY / ballDX) * (29 + 46 * ia - tmpX) + tmpY;ballX = tmpX1 - 4;ballY = tmpY1 - 4;ballDX = -ballDX;}}}else {iy = (ballDY / ballDX) * (29+46 * ia + 44 - tmpX) + tmpY;if (iy > 48 + 20 * ib + 18) {tmpY1 = 48 + 20 * ib + 18;tmpX1 = (ballDX / ballDY) * (48 + 20 * ib + 18 - tmpY) + tmpX; ballX = tmpX1 - 4;ballY = tmpY1 - 4;ballDY = -ballDY;}else {if (iy < 44 + 20 * ib) {tmpY1 = 48 + 20 * ib;tmpX1 = (ballDX / ballDY) * (48 + 20 * ib - tmpY) + tmpX;ballX = tmpX1 - 4;ballY = tmpY1 - 4;ballDY = -ballDY;}else {tmpX1 = 29+46 * ia + 44;tmpY1 = (ballDY / ballDX) * (29 + 46 * ia + 44 - tmpX) + tmpY; ballX = tmpX1 - 4;ballY = tmpY1 - 4;ballDX = -ballDX;}}}}}}}}}function gameEnd() {document.forms[0].BL.value = ballN;gameFLG = 0;loadFLG = 0;starter.style.posTop = 200;starter.style.posLeft = 180;if (blclr >= 40) {clrmes.style.posTop = 150;clrmes.style.posLeft = 160;}if (ballN <= 0) {ovrmes.style.posTop = 150;ovrmes.style.posLeft = 160;blclr = 40;}}function onLD() {bgIE.style.posTop = 16;bgIE.style.posLeft = 16;ball.style.posTop = 270;ball.style.posLeft = 209;racket.style.posTop = 280;racket.style.posLeft = 193;info.style.posTop = 16;info.style.posLeft = 432;starter.style.posTop = -1000;starter.style.posLeft = -1000;clrmes.style.posTop = -1000;clrmes.style.posLeft = -1000;ovrmes.style.posTop = -1000;ovrmes.style.posLeft = -1000;DN.style.posTop = 170;DN.style.posLeft = 432;for (ib = 0; ib < 5; ib++) {for (ia = 0; ia < 8; ia++) {blsta[ib * 8 + ia] = ib;}}starter.style.posTop = 200;starter.style.posLeft = 180;}function chc(bno,bcl) {tmpbno = ((bno < 10.5) ? "b0" : "b") + (bno-1);eval(tmpbno).bgColor = blcol[bcl];}// End --></script></head><body onLoad="onLD();" onMouseMove='X=event.x;MouseMv();'><span id=info style='position:absolute'><pre><font style="font-size:24px" color="#000044"><i><b>PONG</b></i></font><form>Ball: <input type=text name=BL size=5 value=5>Time: <input type=text name=TM size=5 value=0></form></pre></span><script language="JavaScript"><!-- block image write-->with (document) {write("<table id='bgIE' width='394' height='300' bgcolor='#000000' style='position:absolute'><td></td></table>");write("<table id='b00' width='42' height='16' bgcolor='#FFFF00' style='position:absolute; top:48; left:29'><td></td></table>"); write("<table id='b01' width='42' height='16' bgcolor='#FFFF00' style='position:absolute; top:48; left:75'><td></td></table>"); write("<table id='b02' width='42' height='16' bgcolor='#FFFF00' style='position:absolute; top:48; left:121'><td></td></table>"); write("<table id='b03' width='42' height='16' bgcolor='#FFFF00' style='position:absolute; top:48; left:167'><td></td></table>"); write("<table id='b04' width='42' height='16' bgcolor='#FFFF00' style='position:absolute; top:48; left:213'><td></td></table>"); write("<table id='b05' width='42' height='16' bgcolor='#FFFF00' style='position:absolute; top:48; left:259'><td></td></table>"); write("<table id='b06' width='42' height='16' bgcolor='#FFFF00' style='position:absolute; top:48; left:305'><td></td></table>"); write("<table id='b07' width='42' height='16' bgcolor='#FFFF00' style='position:absolute; top:48; left:351'><td></td></table>"); write("<table id='b08' width='42' height='16' bgcolor='#FFCF00' style='position:absolute; top:68; left:29'><td></td></table>"); write("<table id='b09' width='42' height='16' bgcolor='#FFCF00' style='position:absolute; top:68; left:75'><td></td></table>"); write("<table id='b10' width='42' height='16' bgcolor='#FFCF00' style='position:absolute; top:68; left:121'><td></td></table>"); write("<table id='b11' width='42' height='16' bgcolor='#FFCF00' style='position:absolute; top:68; left:167'><td></td></table>"); write("<table id='b12' width='42' height='16' bgcolor='#FFCF00' style='position:absolute; top:68; left:213'><td></td></table>"); write("<table id='b13' width='42' height='16' bgcolor='#FFCF00' style='position:absolute; top:68; left:259'><td></td></table>"); write("<table id='b14' width='42' height='16' bgcolor='#FFCF00' style='position:absolute; top:68; left:305'><td></td></table>"); write("<table id='b15' width='42' height='16' bgcolor='#FFCF00' style='position:absolute; top:68; left:351'><td></td></table>"); write("<table id='b16' width='42' height='16' bgcolor='#FF7F00' style='position:absolute; top:88; left:29'><td></td></table>"); write("<table id='b17' width='42' height='16' bgcolor='#FF7F00' style='position:absolute; top:88; left:75'><td></td></table>"); write("<table id='b18' width='42' height='16' bgcolor='#FF7F00' style='position:absolute; top:88; left:121'><td></td></table>"); write("<table id='b19' width='42' height='16' bgcolor='#FF7F00' style='position:absolute; top:88; left:167'><td></td></table>"); write("<table id='b20' width='42' height='16' bgcolor='#FF7F00' style='position:absolute; top:88; left:213'><td></td></table>"); write("<table id='b21' width='42' height='16' bgcolor='#FF7F00' style='position:absolute; top:88; left:259'><td></td></table>"); write("<table id='b22' width='42' height='16' bgcolor='#FF7F00' style='position:absolute; top:88; left:305'><td></td></table>"); write("<table id='b23' width='42' height='16' bgcolor='#FF7F00' style='position:absolute; top:88; left:351'><td></td></table>"); write("<table id='b24' width='42' height='16' bgcolor='#FF3F00' style='position:absolute; top:108; left:29'><td></td></table>"); write("<table id='b25' width='42' height='16' bgcolor='#FF3F00' style='position:absolute; top:108; left:75'><td></td></table>"); write("<table id='b26' width='42' height='16' bgcolor='#FF3F00' style='position:absolute; top:108; left:121'><td></td></table>"); write("<table id='b27' width='42' height='16' bgcolor='#FF3F00' style='position:absolute; top:108; left:167'><td></td></table>"); write("<table id='b28' width='42' height='16' bgcolor='#FF3F00' style='position:absolute; top:108; left:213'><td></td></table>"); write("<table id='b29' width='42' height='16' bgcolor='#FF3F00' style='position:absolute; top:108; left:259'><td></td></table>"); write("<table id='b30' width='42' height='16' bgcolor='#FF3F00' style='position:absolute; top:108; left:305'><td></td></table>"); write("<table id='b31' width='42' height='16' bgcolor='#FF3F00' style='position:absolute; top:108; left:351'><td></td></table>");write("<table id='b32' width='42' height='16' bgcolor='#FF0000' style='position:absolute; top:128; left:29'><td></td></table>");write("<table id='b33' width='42' height='16' bgcolor='#FF0000' style='position:absolute; top:128; left:75'><td></td></table>");write("<table id='b34' width='42' height='16' bgcolor='#FF0000' style='position:absolute; top:128; left:121'><td></td></table>");write("<table id='b35' width='42' height='16' bgcolor='#FF0000' style='position:absolute; top:128; left:167'><td></td></table>");write("<table id='b36' width='42' height='16' bgcolor='#FF0000' style='position:absolute; top:128; left:213'><td></td></table>");write("<table id='b37' width='42' height='16' bgcolor='#FF0000' style='position:absolute; top:128; left:259'><td></td></table>");write("<table id='b38' width='42' height='16' bgcolor='#FF0000' style='position:absolute; top:128; left:305'><td></td></table>");write("<table id='b39' width='42' height='16' bgcolor='#FF0000' style='position:absolute; top:128; left:351'><td></td></table>");write("<div id='ball' style='position:absolute'>");write("<table width='4' height='8' bgcolor='#B0B0B0' style='position:absolute; left:0; top:0'><td></td></table>");write("<table width='8' height='4' bgcolor='#B0B0B0' style='position:absolute; left:-1; top:2'><td></td></table>");write("<table width='4' height='4' bgcolor='#FFFFFF' style='position:absolute; left:0; top:1'><td></td></table>");write("</div>");write("<table id='racket' width='40' height='4' bgcolor='#B0B0FF' style='position:absolute'><td></td></table>");write("<div id='starter' style='position:absolute'><form><input type='button' value='START' ONCLICK='initG();blur()'></form></div>");write("<div id='clrmes' style='position:absolute'><font style='font-size:24px' color='#44CC44'>ALL CLEAR!</font></div>");write("<div id='ovrmes' style='position:absolute'><font style='font-size:24px' color='#CC4444'>GAME OVER!</font></div>");write("<div id='DN' style='position:absolute'><a href='javascript:SDN()'>SPEED DOWN</a></div>");}</script></body></html>以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作能带来⼀定的帮助~如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持!。
打台球小游戏
游戏规则:
1. 台球桌上有15个编号的球,其中包括一颗白色的球(白球)、七颗实心球和七颗空心球,以及一颗黑色的8号球。
2. 游戏开始时,玩家必须用白球击打其他球,击打的球必须先接触到自己的球杆,然后再触碰其他球。
3. 如果玩家将自己的球打入袋中,那么他们就可以继续击打,直到没有球被打入袋中。
4. 玩家可以选择打进实心球或者空心球,但必须在最后打进黑色的8号球。
5. 如果玩家在打进8号球之前将其打入袋中,那么他们就会输掉比赛。
玩法:
1. 确定谁先击球,通常可以通过抛硬币或者其他方式来决定。
2. 玩家可以使用球杆来击打白球,以尽可能多地将球打入袋中。
3. 在击打球的过程中,玩家需要考虑球的位置和击打的力度,以便获得最佳的击球效果。
4. 玩家可以使用一些技巧,如旋转球杆、改变击球角度和力度,以便更准确地打进球。
5. 玩家需要注意规则,避免犯规,否则对方将有机会获得额外的得
分或者继续击打。
在打台球小游戏中,玩家需要灵活运用技巧和策略,以便在有限的
击球次数内获得最高的得分。
通过不断练习和尝试不同的击球方法,玩家可以提高自己的技能,并享受到游戏带来的乐趣和挑战。
桌球小游戏
游戏规则:
1. 游戏通常由两名玩家进行,每人轮流击球。
2. 在开始游戏之前,将15个编号的彩色球排成一个三角形,其中一端的球位于桌子的底端,另一端的球位于桌子的中心。
3. 玩家可以选择击打红球或黄球,然后试图将它们击入袋中。
4. 如果一名玩家将自己所击的球击入袋中,那么他将获得与该球编
号相同的分数。
如果他将对方的球击入袋中,对方将获得相应分数。
5. 游戏的目标是在不犯规的情况下,先将所有球击入袋中,并且获
得更高的分数。
玩法:
1. 玩家站在桌球桌的一端,用球杆击球。
2. 球杆的末端有一块特殊的皮革,用来击打球。
3. 玩家需要使用球杆的尖端精确地击打球,以确保球能够按照自己
的计划移动。
4. 玩家需要注意球的运动轨迹和力度,以便将球击入袋中,并且避
免犯规。
术语和技巧:
1. "进袋":将球击入袋中。
2. "犯规":例如将球击出桌外、未击中任何球或者将对方的球击入
袋中等。
3. 技巧:掌握击球的力度和方向,以及预测球的运动轨迹是非常重
要的。
此外,掌握好球杆的握持和姿势也是至关重要的。
总的来说,桌球小游戏是一种简单而有趣的游戏,需要玩家具备一
定的技巧和策略。
通过练习和体验,玩家可以不断提高自己的水平,享受游戏的乐趣。
网络台球游戏的网络编程网络台球是一款对战式台球游戏,程序界面如图4.13 所示。
图4.13 网络台球在游戏开始的时候,程序会弹出一个类型选择框,如果4.14 所示,玩家可以选择作为服务器、客户机或者是单人练习赛。
图4.14 游戏类型选择网络台球的绘制部分采用OpenGL 技术。
OpenGL 技术将会在第5 章中介绍,这里只介绍台球碰撞算法和网络实现部分。
先来看看网络台球的碰撞算法。
4.8.1 刚体运动与碰撞当玩家击球后,系统调用HitBall 函数。
HitBall 函数定义如下:void CBilliardsPlayView::HitBall(){if (!m_bAnimate){m_nEnter = 100;CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd(); CBilliardsPlayView*pView=(CBilliardsPlayView*)(pF rame->m_wndSplitter).GetPane(0,1);CBilliardsDoc *pDoc = (CBilliardsDoc*)pView->GetDocument();if (pDoc->m_bPlayer!=IDLE){m_nEnter = -1;if (m_bCanHit)pDoc->SendVelocity(m_fVelocity[0]);}m_bAnimate = TRUE;SetTimer(ANIMATE_TIMER,5,NULL);}}在HitBall 函数里,需要设置一个所有球都已经静止的标志m_bAnimate。
如果不是单人练习赛,则要将这个击球动作发送到网络的另一端。
最后要设置一个动画定时器。
定时器消息响应函数如下:void CBilliardsPlayView::OnTimer(UINT nIDEvent) {CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();CBilliardsPlayView*pView=(CBilliardsPlayView*)(pFrame->m_wndSplitter).GetPane(0,1);if (nIDEvent == ANIMATE_TIMER){DrawScene();pView->GetDlgItem(IDC_BUTTON_SHOOT)->EnableWindow (m_bCanHit&&!m_bAnimate);}CView::OnTimer(nIDEvent);}在定时器消息响应函数中调用了函数DrawScene,结构如下:Void DrawScene()图4.14 游戏类型选择第4 章网络游戏开发241{…………//省略if (m_bAnimate){if (Calculate()){KillTimer(ANIMATE_TIMER);m_bAnimate = FALSE;…………//省略…………}}…………//省略}不难看出Calculate 函数就是计算球函数。
打台球小游戏
游戏规则:
1. 台球桌上有15个编号为1至15的球和一个白球。
玩家需要用球
杆击打白球,使得白球击中其他球,并将它们击入袋中。
2. 游戏开始时,玩家可以选择击打任何编号的球,但必须先击中自
己所属的球类(全彩或全黑)中的任意一颗。
3. 如果玩家在一杆中将自己的球击入袋中,他们将继续击打,直到
没有球被击入袋中为止。
4. 如果玩家在一杆中将对方的球击入袋中,轮到对方进行击打。
5. 游戏直到所有球被击入袋中,最后剩下的黑八球被击入袋中,或
者出现犯规情况时结束。
玩法技巧:
1. 准确的击打角度和力度是取得成功的关键。
玩家需要练习掌握不
同击球技巧,以便在游戏中灵活运用。
2. 观察台球桌上球的位置和排列,制定出最佳的击球策略,以便一
杆击中多个球或将球击入袋中。
3. 学会使用反弹和旋转等技巧,以便在击球过程中能够控制白球的
路径和方向,从而实现更加精准的进球。
打台球小游戏需要玩家不断练习和思考,以提高自己的技巧和策略。
通过不断挑战自己和他人,玩家可以享受到这个富有挑战性和乐趣的游戏。
C++语言课程设计一桌球一、实验内容玩家通过移动球杆到单一的桌球处碰撞桌球运动,当桌球于一定速度通过桌面右方的同样颜色的球洞后,则该球进洞,在桌面左边重新分配新球开始游戏。
要求如下:1.游戏的初始界面如下,其中左边有一个体积较小的桌球,其x方向位置固定,y方向位置随机。
右边有八个颜色不一样,体积较大的球洞,游戏的目的是使用左边的桌球以一定小的速度穿过右边同样颜色的球洞就算桌球进洞,然后重新分配新球。
2.球杆随鼠标运动而运动,单击球杆,桌球获取一个前进的速度同时往前有运动。
桌球的前进方向有一段指示球运动方向的虚线。
3.右侧的球洞以移动的频率不断更换位置。
球洞的x左边不变,更换的是y坐标的位置,即每一轮中每一个球洞移动到下一个球洞的位置,最下边的球洞则移动到第一个球洞位置。
所以的这些动作都要在一个频率的时间里面完成。
因此当游戏一某一个频率进行的时候,右侧的球洞就能实现循环变化的效果。
4.球碰撞到桌面边沿的时候以发射角的角度弹走。
5.球进洞的判断是球以一定的速度通过同样颜色的球洞时,桌球消失,表明球进洞了,此时左侧随机生成新球。
球运动到球洞的速度不能太大,太大则球直接运动过球洞,如果速度太小,则球同样不进洞。
二、实验指南实验一开始实验【实验任务】步骤一、打开FunCode,创建一个的C++语言项目;步骤二、导入snooker模板。
【实验思路】按实验指导完成。
【实验指导】1、打开FunCode,点击“项目”菜单,选择“创建C++工程”注意:工程名名称要求字母开头,只能包含字母和数字,且名字中间不能有空格。
2、点击菜单“项目”中的“导入地图模块”,如图一。
跳出一个对话框,选中“snooker”模板,点击“导入到工程”按钮,如图二。
图一图二3、导入成功后的,界面如下图所示:实验二初始化桌球和球杆同时在球的前进方向画虚线【实验内容】步骤一、设置球的初始位置,球杆的初始朝向步骤二、设置球杆随鼠标移动步骤三、在球的前进方向上画虚线【实验思路】在设置初始球的时候要考虑随机本局的球数字,如果和上一局的不一致,则将上局的球拉到屏幕外,将本局的球拉到屏幕内,在Y向上随机摆放球的出生位置,只随机Y方向坐标,不动X方向。
挑战台球小游戏
游戏目标:
玩家的目标是利用球杆击打球,按照规定的顺序将所有的球打入球袋,最终将黑八球打入最后一个球袋,从而取得胜利。
规则和玩法:
1. 游戏开始时,玩家需要选择一个球袋作为“起始球袋”,并将白球
放在台球桌的指定位置。
2. 玩家需要按照规定的顺序依次击打红球和彩球,直到所有的球都
被打入球袋。
3. 在击打红球后,玩家可以选择继续击打彩球,或者将彩球放回台
球桌上再次击打红球。
4. 如果玩家在击打球时犯规(如将白球打入球袋、未击中任何球等),对手将获得额外的得分机会。
5. 当所有的球都被打入球袋后,玩家需要将黑八球打入最后一个球袋,以取得胜利。
术语和技巧:
1. 击球角度和力度:玩家需要掌握击球的角度和力度,以确保球能
够按照预定的路径移动,并最终被打入球袋。
2. 规划击球顺序:玩家需要考虑每一次击球的顺序和策略,以最大
限度地利用球的位置和台球桌的布局。
3. 精准的击球:玩家需要保持稳定的手部动作和准确的眼睛,以确保每一次击球都能够命中目标球。
挑战台球小游戏不仅考验玩家的技巧和策略,还能够提供乐趣和挑战。
玩家可以尝试不同的击球顺序和策略,以找到最适合自己的方法来取得胜利。
希望玩家能够充分享受这款经典台球游戏带来的乐趣!。
JS实现简单打砖块弹球⼩游戏本⽂实例为⼤家分享了JS实现打砖块弹球⼩游戏的具体代码,供⼤家参考,具体内容如下使⽤原⽣JS写的,还有⼀点瑕疵。
代码直接复制到html就能使⽤速度随机的因为设涉及横向和纵向速度,所以显⽰的⼩球速度值是他们的和速度(⽴⽅和开根号)。
按回车或者在滑块上单机左键开始游戏。
⿏标滑动或者键盘A(左)或者D(右)控制滑块⽅向接⼩球。
这个⼩demo的意义主要为了锻炼逻辑能⼒:<!DOCTYPE html><html><head><meta charset="UTF-8"><title>document</title><style>.container{width: 500px;height: 500px;border:1px solid #000;margin:auto;position:relative;}.brickBox{width: 500px;height: 300px;/* background-color: yellowgreen; */position:absolute;left: 0;top: 0;}.ball{width: 15px;height: 15px;background-color:purple;border-radius:50%;position:absolute;bottom:30px;left:235px;/* margin-left:-15px; */}.slider{width: 150px;height: 30px;background-color: #00f;position:absolute;/* left:50%; */left:175px;/* margin-left:-75px; */bottom:0;}</style></head><body><div class="container"><div class="brickBox"></div><div class="ball"></div><div class="slider"></div></div><div style="margin-left: 40%;font-size: 25px;">当前速度: <span id="speed"></span> </div><div style="margin-left: 40% ;font-size: 25px;">当前打掉的⽅块数: <span id="count"></span> </div></body><script>// 获取当前所有标签var container = document.querySelector('.container')var brickBox = container.querySelector('.brickBox')var ball = container.querySelector('.ball')var slider = container.querySelector('.slider')// 动态创建砖块// 定义砖块⼤⼩var brickWidth = 50;var brickHeight = 15;// 计算砖块数量var brickNum = brickBox.clientWidth * brickBox.clientHeight / (brickWidth * brickHeight)// console.log(brickNum);var brickColNum = brickBox.clientWidth / brickWidth// 根据数量去创建for(var i=0;i<brickNum;i++){var div = document.createElement('div')setStyle(div,{width:brickWidth + "px",height:brickHeight + "px",backgroundColor:getColor(true),position:'absolute',top:parseInt(i/brickColNum)*brickHeight + 'px',left:(i%brickColNum)*brickWidth + 'px'})brickBox.appendChild(div)}// 点击滑块让⼩球开始运动// 定义横向移动的值和纵向移动的值var speedX = getRandom(1,8);var speedY = getRandom(1,8);document.querySelector("#speed").innerHTML= Math.sqrt(Math.pow(speedX,2)+Math.pow(speedY,2))var timer;//点击移动slider.onclick = move;//回车键开始弹function move(){var count=0;clearInterval(timer)timer = setInterval(function(){// 开始移动// 获取⼩球的left和toplet left = ball.offsetLeft;let top = ball.offsetTop;// 让left和top增加速度// ⼩球和滑块相撞if(boom(slider,ball)){speedY = -speedY}// ⼩球和⼤盒⼦相撞if(left<=0 || left>=container.clientWidth - ball.offsetWidth){speedX = -speedX}if(top<=0){speedY = -speedY}// 检测所有砖块和⼩球是否相撞for(let i=0;i<brickBox.children.length;i++){if(boom(brickBox.children[i],ball)){speedY = -speedYbrickBox.removeChild(brickBox.children[i]);count++;}}console.log(count)document.querySelector("#count").innerHTML=count// GAME OVERif(top>=container.clientHeight-ball.offsetHeight){clearInterval(timer)if(confirm("GAME OVER,是否重玩")){location.reload();}else{alert('您最终分数'+count)}}left += speedXtop += speedY// 设置给⼩球的left和topball.style.left = left + "px"ball.style.top = top + "px"},20)}// 让滑块跟着⿏标移动slider.onmouseover = function(){document.onmousemove = function(e){var e = e || window.event;var x = e.pageX;var l = x - container.offsetLeft - 1 - slider.offsetWidth/2if(l<0){l = 0}if(l > container.clientWidth - slider.offsetWidth){l = container.clientWidth - slider.offsetWidth}slider.style.left = l + "px"}}//让滑块跟着左右键盘移动window.onload= function(){document.onkeydown = e=>{var e = e || window.event;var keycode = e.keyCode || e.which;var keyword = String.fromCharCode(keycode).toLowerCase();if(keycode==13){move();}if(keyword=='a'){console.log("1111")slider.style.left= slider.offsetLeft-15+"px"}else if(keyword=='d'){console.log("222")slider.style.left=slider.offsetLeft+15+"px"}console.log(slider.offsetLeft)}}// 封装检测相撞的函数function boom(node1,node2){// 不撞在⼀起的只有4中可能if(node1.offsetLeft+node1.offsetWidth<node2.offsetLeft || node1.offsetTop+node1.offsetHeight<node2.offsetTop || node2.offsetLeft+node2.offsetWidth<node1.offsetLeft || node2.offsetTop+node2.offsetHeight<node1.offsetTop){ return false;}else{return true;}}// 封装获取随机颜⾊的函数function getColor(hex=true){if(hex){var color = '#'for(var i=0;i<3;i++){var rgb = getRandom(256).toString(16);rgb = rgb.length===1?'0'+rgb:rgb;color += rgb}return color;}return `rgb(${getRandom(256)},${getRandom(256)},${getRandom(256)})`}// 封装设置样式的函数function setStyle(ele,styleObj){for(var attr in styleObj){ele.style[attr] = styleObj[attr]}}// 封装获取随机数的函数function getRandom(a,b=0){var max = Math.max(a,b);var min = Math.min(a,b)return Math.floor(Math.random() * (max-min)) + min}</script></html>效果图如图所⽰没⽤插件略微样式丑了点。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>台球by CNwander</title><style type="text/css">* {margin:0; padding:0}body {background:black; text-align:center; font-size:12px}h1 {font-size:12px; color:gray; font-weight:normal; line-height:200%}h1 .sub {vertical-align:super; color:red; font-size:9px; }.info {position:absolute; right:0; color:gray}#table {position:relative; width:800px; margin:20px auto 10px; height:544px; background:url(/articleimg/2009/10/7086/table.jpg) no-repeat}.ball {position:absolute; width:30px; height:30px}#dotWrap {position:absolute; z-index:2; left:32px; top:32px; width:736px; height:480px}.guide {z-index:3; background-image:url(/articleimg/2009/10/7086/dashed_ball.png);_background:none; _filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled='true', sizingMethod='scale', src="/articleimg/2009/10/7086/dashed_ball.png");background-repeat:no-repeat}.target {left:500px; top:250px; background-image:url(/articleimg/2009/10/7086/yellow_ball.png);_background:none; _filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled='true', sizingMethod='scale', src="/articleimg/2009/10/7086/yellow_ball.png");background-repeat:no-repeat}.cue {background-image:url(/articleimg/2009/10/7086/white_ball.png); _background:none; _filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled='true', sizingMethod='scale', src="/articleimg/2009/10/7086/white_ball.png");background-repeat:no-repeat}.bot {position:relative; width:800px; margin:10px auto 10px; height:70px}.ctrl {position:absolute; top:0; right:0; width:200px; height:80px; background:url(/articleimg/2009/10/7086/bg_controler.png) no-repeat} #force {position:absolute; left:0; top:18px; width:75px; height:20px; background:url(/articleimg/2009/10/7086/force_conver.png) no-repeat} #shootPos {position:absolute; top:0; right:14px; width:52px; height:52px}#dot {position:absolute; top:22px; left:22px; width:8px; height:8px; background:url(/articleimg/2009/10/7086/bule_dot.png) no-repeat; font-size:1px}#scoreBoard {position:absolute; z-index:3; top:230px; left:346px; font-size:50px; color:white; filter:alpha(opacity=0); -moz-opacity:0; opacity:0}#tips {padding:15px 0 0 20px; text-align:left; color:red; font-size:12px} </style><script type="text/javascript">// commonfunction $(str) {return document.getElementById(str);}function $tag(str,target) {target = target || document;return target.getElementsByTagName(str);}function addEventHandler(obj,eType,fuc){if(obj.addEventListener){obj.addEventListener(eType,fuc,false);}else if(obj.attachEvent){obj.attachEvent("on" + eType,fuc);}else{obj["on" + eType] = fuc;}}function removeEventHandler(obj,eType,fuc){if(obj.removeEventListener){obj.removeEventListener(eType,fuc,false);}else if(obj.attachEvent){obj.detachEvent("on" + eType,fuc);}}function randowNum(start,end) {return Math.floor(Math.random()*(end - start)) + start;}Array.prototype.remove=function(dx) {if(isNaN(dx)||dx>this.length){return false;}for(var i=0,n=0;i<this.length;i++){if(this[i]!=this[dx]){this[n++]=this[i]}}this.length-=1}//constvar TOTALR = 15, //球的半径(包括阴影)R = 12, //球真实半径POKER = 20,W = 736, //案宽H = 480, //案高THICKNESS = 32, //边缘厚度RA TE = 100, //刷新频率F = 0.01, //摩擦力LOSS = 0.2, // 碰撞速度损失TIPS = ["Tip1: 参考球,目标球,目标袋,三点一线,这是最基本的进球方法","Tip2: 右下角蓝条代表击球力度,小的力度更便于控制母球位置","Tip3: 右下角白球上的蓝点控制击球点,高杆,低杆,加塞都由它控制,高手与菜鸟的区别往往在此","Tip4: 桌球,其实打的不是目标球,是母球"];var table, //案子cueBall, //母球guideBall, //参考球dotWrap, //参考线speed = 12,rollUp = 0,rollRight = 0,timer,forceTimer,balls = [],movingBalls = [],pokes = [[0,0],[W/2,-5],[W,0],[0,H],[W/2,H+5],[W,H]],hasShot = false;shots = 0; //连击次数window.onload = function() {initTable();initShootPos();showTips();startGame();}function startGame() {initBall();addEventHandler(table,"mousemove",dragCueBall);addEventHandler(table,"mouseup",setCueBall);}function initTable() {table = $("table");var dotWrapDiv = document.createElement("div"),guideBallDiv = document.createElement("div");dotWrapDiv.id = "dotWrap";guideBallDiv.className = "guide ball";setStyle(guideBallDiv,"display","none");dotWrap = table.appendChild(dotWrapDiv);guideBall = table.appendChild(guideBallDiv);}function initBall() {//添加母球cueBall = new Ball("cue",170,H/2);balls.push(cueBall);//添加目标球for(var i = 0; i < 5; i++) {for(var j = 0; j <= i; j++) {var ball = new Ball("target",520 + i*2*R, H/2 - R*i + j*2*R); balls.push(ball);}}}function initShootPos() {var wrap = $("shootPos"),handler = $("dot"),arrowR = 18;addEventHandler(wrap,"mousedown",selectDot);function selectDot(e) {e = e || event;var pos = getElemPos(wrap),x = e.clientX - pos[0] - handler.offsetWidth/2,y = e.clientY - pos[1] - handler.offsetHeight/2;if(Math.sqrt((x-22)*(x-22) + (y-22)*(y-22)) > arrowR) {var angle = Math.atan2(x-22,y-22);x = arrowR*Math.sin(angle) + 22;y = arrowR*Math.cos(angle) + 22;}setPos(handler,x,y);}}function getElemPos(target,reference) {reference = reference || document;var left = 0,top = 0;return getPos(target);function getPos(target) {if(target != reference) {left += target.offsetLeft;top += target.offsetTop;return getPos(target.parentNode);} else {return [left,top];}}}// ball classfunction Ball(type,x,y) {var div = document.createElement("div");div.className = type + " ball";this.elem = table.appendChild(div);this.type = type;this.x = x; //位置this.y = y;this.angle = 0; //角度this.v = 0; //速度(不包含方向)setBallPos(this.elem,x,y);return this;}function setCueBall() {removeEventHandler(table,"mousemove",dragCueBall); removeEventHandler(table,"mouseup",setCueBall); startShot();}function startShot() {show(cueBall.elem);addEventHandler(table,"mousemove",showGuide); addEventHandler(table,"mousedown",updateForce); addEventHandler(table,"mouseup",shotCueBall);}function dragCueBall(e) {var toX,toY;e = e || event;toX = e.clientX - table.offsetLeft - THICKNESS,toY = e.clientY - table.offsetTop - THICKNESS;toX = toX >= R ? toX : R;toX = toX <= 170 ? toX : 170;toY = toY >= R ? toY : R;toY = toY <= H - R ? toY : H - R;setBallPos(cueBall,toX,toY);}function shotCueBall() {removeEventHandler(table,"mousemove",showGuide); removeEventHandler(table,"mousedown",updateForce); removeEventHandler(table,"mouseup",shotCueBall); window.clearInterval(forceTimer);speed = $("force").offsetWidth * 0.15;var dotDisX = $("dot").offsetLeft-22,dotDisY = $("dot").offsetTop-22,dotDis = Math.sqrt(dotDisX*dotDisX + dotDisY*dotDisY), dotAngle = Math.atan2(dotDisX,dotDisY);rollRight = Math.round(dotDis*Math.sin(dotAngle))/5;rollUp = -Math.round(dotDis*Math.cos(dotAngle))/5;var formPos = getBallPos(cueBall.elem),toPos = getBallPos(guideBall),angle = Math.atan2(toPos[0] - formPos[0],toPos[1] - formPos[1]); hide(dotWrap);hide(guideBall);cueBall.v = speed;cueBall.angle = angle;movingBalls.push(cueBall);timer = window.setInterval(roll,1000 / RATE);}function showGuide(e) {var fromX,fromY,toX,toY;e = e || event;toX = e.clientX - table.offsetLeft - THICKNESS,toY = e.clientY - table.offsetTop - THICKNESS;setBallPos(guideBall,toX,toY);show(dotWrap);show(guideBall);drawLine();//参考线function drawLine() {var dotNum = 16,pos = getBallPos(cueBall.elem);dotWrap.innerHTML = "";fromX = pos[0];fromY = pos[1];var partX = (toX - fromX) / dotNum,partY = (toY - fromY) / dotNum;for(var i = 1; i < dotNum; i++) {var x = fromX + partX * i,y = fromY + partY * i;drawDot(dotWrap, x, y);}}}function roll() {if(movingBalls.length <= 0) {if(!hasShot) shots = 0;else shots ++; //累计连击hasShot = false;setStyle($("force"),"width",80+"px"); setPos($("dot"),22,22);window.clearInterval(timer);if(shots > 1) showScore(shots); //显示连击数startShot();}for(var i = 0; i < movingBalls.length; i++) { var ball = movingBalls[i],sin = Math.sin(ball.angle),cos = Math.cos(ball.angle);ball.v -= F;//移除静止的小球if(Math.round(ball.v) == 0) {ball.v = 0;movingBalls.remove(i);continue;}var vx = ball.v * sin,vy = ball.v * cos;ball.x += vx;ball.y += vy;//入袋if(isPocket(ball.x,ball.y)) {hide(ball.elem);if(ball.type == "cue") {if(!hasShot) shots = 0;hasShot = false;window.setTimeout(function(){ball.v = 0;setBallPos(ball,170,250);},500);}else {//移除入袋小球hasShot = true;ball.v = 0;for(var k = 0, l =0; k < balls.length; k++) { if(balls[k] != ball) {balls[l++] = balls[k];}}balls.length -= 1;}return;}//边缘碰撞if(ball.x < R || ball.x > W - R) {ball.angle *= -1;ball.angle %= Math.PI;ball.v = ball.v * (1 - LOSS);vx = ball.v*Math.sin(ball.angle);vy = ball.v*Math.cos(ball.angle);if(ball.x < R) ball.x = R;if(ball.x > W - R) ball.x = W - R;//母球加塞if(ball.type == "cue") {if(ball.angle > 0) vy -= rollRight;else vy += rollRight;vx += rollUp;rollUp *= 0.2;rollRight *= 0.2;ball.v = Math.sqrt(vx*vx + vy*vy);ball.angle = Math.atan2(vx,vy);}}if(ball.y < R || ball.y > H - R) {ball.angle = ball.angle > 0 ? Math.PI - ball.angle : - Math.PI - ball.angle ; ball.angle %= Math.PI;ball.v = ball.v * (1 - LOSS);vx = ball.v*Math.sin(ball.angle);vy = ball.v*Math.cos(ball.angle);if(ball.y < R) ball.y = R;if(ball.y > H - R) ball.y = H - R;//母球加塞if(ball.type == "cue") {if(Math.abs(ball.angle) < Math.PI/2) vx += rollRight;else vx -= rollRight;vy += rollUp;rollUp *= 0.2;rollRight *= 0.2;ball.v = Math.sqrt(vx*vx + vy*vy);ball.angle = Math.atan2(vx,vy);}}//小球碰撞for(var j = 0; j < balls.length; j++) {var obj = balls[j];if(obj == ball) continue;var disX = obj.x - ball.x,disY = obj.y - ball.y,gap = 2 * R;if(disX <= gap && disY <= gap) {var dis = Math.sqrt(Math.pow(disX,2)+Math.pow(disY,2));if(dis <= gap) {//如果是静止的,则添加到数组movingBallsif(Math.round(obj.v) == 0)movingBalls.push(obj);//将坐标旋转到x轴进行碰撞计算// 计算角度和正余弦值- 精确值//var c = (obj.x*ball.y - obj.y*ball.x)/(2*R),// d = Math.sqrt(ball.x*ball.x + ball.y*ball.y),// angle = Math.asin(ball.y/d) - Math.asin(c/d) - ball.angle%(Math.PI/2), //angle = Math.asin(oy / (2 * R)),//还原两球相切状态- 近似值ball.x -= (gap - dis)*sin;ball.y -= (gap - dis)*cos;disX = obj.x - ball.x;disY = obj.y - ball.y;// 计算角度和正余弦值var angle = Math.atan2(disY, disX),hitsin = Math.sin(angle),hitcos = Math.cos(angle),objVx = obj.v * Math.sin(obj.angle),objVy = obj.v * Math.cos(obj.angle);//trace(angle*180/Math.PI);// 旋转坐标var x1 = 0,y1 = 0,x2 = disX * hitcos + disY * hitsin,y2 = disY * hitcos - disX * hitsin,vx1 = vx * hitcos + vy * hitsin,vy1 = vy * hitcos - vx * hitsin,vx2 = objVx * hitcos + objVy * hitsin,vy2 = objVy * hitcos - objVx * hitsin;// 碰撞后的速度和位置var plusVx = vx1 - vx2;vx1 = vx2;vx2 = plusVx + vx1;//母球加塞if(ball.type == "cue") {vx1 += rollUp;rollUp *= 0.2;}x1 += vx1;x2 += vx2;// 将位置旋转回来var x1Final = x1 * hitcos - y1 * hitsin,y1Final = y1 * hitcos + x1 * hitsin,x2Final = x2 * hitcos - y2 * hitsin,y2Final = y2 * hitcos + x2 * hitsin;obj.x = ball.x + x2Final;obj.y = ball.y + y2Final;ball.x = ball.x + x1Final;ball.y = ball.y + y1Final;// 将速度旋转回来vx = vx1 * hitcos - vy1 * hitsin;vy = vy1 * hitcos + vx1 * hitsin;objVx = vx2 * hitcos - vy2 * hitsin;objVy = vy2 * hitcos + vx2 * hitsin;//最终速度ball.v = Math.sqrt(vx*vx + vy*vy) * (1 - 0);obj.v = Math.sqrt(objVx*objVx + objVy*objVy) * (1 - 0);// 计算角度ball.angle = Math.atan2(vx , vy);obj.angle = Math.atan2(objVx , objVy);//break;}}}setBallPos(ball,ball.x,ball.y);}}function isPocket(x,y) {if(y < POKER) return check(0,2);else if (y > H - POKER) return check(3,5);else return false;function check(m,n) {for(var i=m; i<=n; i++) {if(x >= pokes[i][0] - POKER && x <= pokes[i][0] + POKER) {var dis = Math.sqrt(Math.pow(x - pokes[i][0],2) + Math.pow(y - pokes[i][1],2)); if(dis <= POKER) return true;else return false;}}}}function getBallPos(obj) {var pos = [];pos.push(obj.offsetLeft - THICKNESS + TOTALR);pos.push(obj.offsetTop - THICKNESS + TOTALR);return pos;}function setPos(obj,x,y) {obj.style.left = x + "px";obj.style.top = y + "px";}function setBallPos(ball,x,y) {if(ball.constructor == Ball) {ball.x = x;ball.y = y;ball = ball.elem;}setPos(ball,x + THICKNESS - TOTALR,y + THICKNESS - TOTALR); }function drawDot(wrap,x,y) {var elem = document.createElement("div");setStyle(elem,{position: "absolute",width: "1px",height: "1px",fontSize: "1px",background: "white"});setPos(elem,x,y);wrap.appendChild(elem);}function updateForce() {var obj = $("force"),len = 80,up = true;forceTimer = window.setInterval(update,10);function update() {if(up) setStyle(obj,"width",len+++"px");else setStyle(obj,"width",len--+"px");if(len > 136) up = false;if(len <= 0) up = true;}}function setStyle() {if(arguments.length == 2 && typeof arguments[1] == "object") {for(var key in arguments[1]) {arguments[0].style[key] = arguments[1][key];}} else if (arguments.length > 2) {arguments[0].style[arguments[1]] = arguments[2];}}function hide(obj) {setStyle(obj,"display","none");}function show(obj) {setStyle(obj,"display","block");}//输出信息function trace(sth,who) {who = who || $("tips");if(document.all) who.innerText = sth;else who.textContent = sth;return who;}function showScore(n) {var wrap = $("scoreBoard");trace(n+"连杆",wrap);fadeIn(wrap);}function fadeIn(obj){var fromY = 230,posStep = [8,14,19,23,26,28,29,29,30,30,30], opaStep = [0,0.05,0.1,0.15,0.2,0.25,0.3,0.4,0.5,0.6,0.8], fromOpa = 0,t = 0,step = posStep.length,inTimer = window.setInterval(showIn,20), outTimer;function showIn() {setOpacity(obj,opaStep[t]);obj.style.top = fromY + posStep[t] + "px";t++;if(t>=step) {window.clearInterval(inTimer);outTimer = window.setInterval(fadeOut,50);}}function fadeOut() {t--;setOpacity(obj,opaStep[t]);obj.style.top = fromY + posStep[t] + "px";if(t <= 0) {window.clearInterval(outTimer);hide(obj);}}}function setOpacity(obj,n) {obj.style.cssText = "filter:alpha(opacity="+ n*100 +"); -moz-opacity:"+ n +"; opacity:"+ n;}function showTips() {var i = 0;tip();window.setInterval(tip,3000);function tip() {trace(TIPS[i++]);if(i >= TIPS.length) i = 0;}}</script></head><body><div class="info">探讨:<a href="/thread-2951566-1-1.html">Blueidea</a> <a href="/blog/?p=11">Wander's space</a></div><h1>中国人民烎起来!<span class="sub">60周年</span></h1><div id="table"><div id="scoreBoard"></div></div><div class="bot"><div id="tips"></div><div class = "ctrl"><div id="force"></div><div id="shootPos"><div id="dot"></div></div></div></div></body></html>。