導航:首頁 > 源碼編譯 > js貪吃蛇的演算法

js貪吃蛇的演算法

發布時間:2022-06-01 01:51:53

① 用javascript寫貪吃蛇中蛇的轉向原理或代碼

...先弄一張圖片。。讓他上下左右移動。。而蛇的本身就是多個點獲得圖片。。。
一張圖片
向上。就是X軸不動Y軸-
向下。就是X軸不動Y軸+
向左。就是Y軸不動X軸-
向下。就是Y軸不動X軸+

② 貪吃蛇原理啥

#define N 200
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
int i,key;
int score=0;/*得分*/
int gamespeed=50000;/*游戲速度自己調整*/
struct Food
{
int x;/*食物的橫坐標*/
int y;/*食物的縱坐標*/
int yes;/*判斷是否要出現食物的變數*/
}food;/*食物的結構體*/
struct Snake
{
int x[N];
int y[N];
int node;/*蛇的節數*/
int direction;/*蛇移動方向*/
int life;/* 蛇的生命,0活著,1死亡*/
}snake;
void Init(void);/*圖形驅動*/
void Close(void);/*圖形結束*/
void DrawK(void);/*開始畫面*/
void GameOver(void);/*結束游戲*/
void GamePlay(void);/*玩游戲具體過程*/
void PrScore(void);/*輸出成績*/
/*主函數*/
void main(void)
{
Init();/*圖形驅動*/
DrawK();/*開始畫面*/
GamePlay();/*玩游戲具體過程*/
Close();/*圖形結束*/
}
/*圖形驅動*/
void Init(void)
{
int gd=DETECT,gm;
registerbgidriver(EGAVGA_driver);
initgraph(&gd,&gm,"c:\\program files\\winyes\\tc20h\\bgi");
cleardevice();
}
/*開始畫面,左上角坐標為(50,40),右下角坐標為(610,460)的圍牆*/
void DrawK(void)
{
/*setbkcolor(LIGHTGREEN);*/
setcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*設置線型*/
for(i=50;i<=600;i+=10)/*畫圍牆*/
{
rectangle(i,40,i+10,49); /*上邊*/
rectangle(i,451,i+10,460);/*下邊*/
}
for(i=40;i<=450;i+=10)
{
rectangle(50,i,59,i+10); /*左邊*/
rectangle(601,i,610,i+10);/*右邊*/
}
}
/*玩游戲具體過程*/
void GamePlay(void)
{
randomize();/*隨機數發生器*/
food.yes=1;/*1表示需要出現新食物,0表示已經存在食物*/
snake.life=0;/*活著*/
snake.direction=1;/*方嚮往右*/
snake.x[0]=100;snake.y[0]=100;/*蛇頭*/
snake.x[1]=110;snake.y[1]=100;
snake.node=2;/*節數*/
PrScore();/*輸出得分*/
while(1)/*可以重復玩游戲,壓ESC鍵結束*/
{
while(!kbhit())/*在沒有按鍵的情況下,蛇自己移動身體*/
{
if(food.yes==1)/*需要出現新食物*/
{
food.x=rand()%400+60;
food.y=rand()%350+60;
while(food.x%10!=0)/*食物隨機出現後必須讓食物能夠在整格內,這樣才可以讓蛇吃到*/
food.x++;
while(food.y%10!=0)
food.y++;
food.yes=0;/*畫面上有食物了*/
}
if(food.yes==0)/*畫面上有食物了就要顯示*/
{
setcolor(GREEN);
rectangle(food.x,food.y,food.x+10,food.y-10);
}
for(i=snake.node-1;i>0;i--)/*蛇的每個環節往前移動,也就是貪吃蛇的關鍵演算法*/
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
/*1,2,3,4表示右,左,上,下四個方向,通過這個判斷來移動蛇頭*/
switch(snake.direction)
{
case 1:snake.x[0]+=10;break;
case 2: snake.x[0]-=10;break;
case 3: snake.y[0]-=10;break;
case 4: snake.y[0]+=10;break;
}
for(i=3;i<snake.node;i++)/*從蛇的第四節開始判斷是否撞到自己了,因為蛇頭為兩節,第三節不可能拐過來*/
{
if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
{
GameOver();/*顯示失敗*/
snake.life=1;
break;
}
}
if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||
snake.y[0]>455)/*蛇是否撞到牆壁*/
{
GameOver();/*本次游戲結束*/
snake.life=1; /*蛇死*/
}
if(snake.life==1)/*以上兩種判斷以後,如果蛇死就跳出內循環,重新開始*/
break;
if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以後*/
{
setcolor(0);/*把畫面上的食物東西去掉*/
rectangle(food.x,food.y,food.x+10,food.y-10);
snake.x[snake.node]=-20;snake.y[snake.node]=-20;
/*新的一節先放在看不見的位置,下次循環就取前一節的位置*/
snake.node++;/*蛇的身體長一節*/
food.yes=1;/*畫面上需要出現新的食物*/
score+=10;
PrScore();/*輸出新得分*/
}
setcolor(4);/*畫出蛇*/
for(i=0;i<snake.node;i++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,
snake.y[i]-10);
delay(gamespeed);
setcolor(0);/*用黑色去除蛇的的最後一節*/
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],
snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);
} /*endwhile(!kbhit)*/
if(snake.life==1)/*如果蛇死就跳出循環*/
break;
key=bioskey(0);/*接收按鍵*/
if(key==ESC)/*按ESC鍵退出*/
break;
else
if(key==UP&&snake.direction!=4)
/*判斷是否往相反的方向移動*/
snake.direction=3;
else
if(key==RIGHT&&snake.direction!=2)
snake.direction=1;
else
if(key==LEFT&&snake.direction!=1)
snake.direction=2;
else
if(key==DOWN&&snake.direction!=3)
snake.direction=4;
}/*endwhile(1)*/
}
/*游戲結束*/
void GameOver(void)
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"GAME OVER");
getch();
}
/*輸出成績*/
void PrScore(void)
{
char str[10];
setfillstyle(SOLID_FILL,YELLOW);
bar(50,15,220,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"score:%d",score);
outtextxy(55,20,str);
}
/*圖形結束*/
void Close(void)
{
getch();
closegraph();
}

③ java貪吃蛇原理

用一個數組將蛇頭的行徑記錄下來,然後第二段的下一個方格設置為蛇頭走過的方格,這樣子蛇走過的路徑都是前一段走過的,最後將跟著蛇頭走了,比如
蛇身的路徑
for(int i=snakeLength-1;i>0;i--){
rows[i]=rows[i-1];//依次將蛇前面一段走過行的路段賦值給蛇的下一段
cols[i]=cols[i-1];//依次將蛇前面一段走過列的路段賦值給蛇的下一段
}
for(int i=1;i<snakeLength;i++){
gamePanel[rows[i]][cols[i]].setBackground(Color.red);//將整個面板上蛇身走過的行和列設置為不同的顏色,當然可以用圖片來設置
}
蛇頭走過的行和列(rows[0],cols[i])要根據不同的方向加減1來將面板設置成不同的顏色
如gamePanel[rows[i]-1][cols[i]+1].setBackground(Color.red)

④ js貪吃蛇速度怎麼控制

吃掉一個後 clearIntervar(變數); 然後再重新定義一個 setInterval(function(){}, 250);

var speed = 500;
var go = function(){
//蛇運動的方法

if(吃到一個){
clearIntervar(_intervar );
_intervar = setsetInterval(go,speed*0.9);
}

};
var _intervar = setsetInterval(go,speed);

⑤ 用JS寫貪吃蛇游戲的問題

<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""

<htmlxmlns="

<head>
<metahttp-equiv="Content-Type"content="text/html;charset=gb2312"/>
<title>無標題文檔</title>
<style>
table{width:auto;height:12px;}
tabletr{border-right:1pxsolid#808080;float:left;}
tabletd{border:1pxsolid#808080;border-right:none;float:left;width:10px;height:10px;font-size:0;line-height:0;overflow:hidden;margin:0px;padding:0px;}
.hs{background:#000;}
.hs{background:#ffff;}
</style>
</head>

<body>
<script>
functiona()
{
for(i=1;i<=10;i++)
{
document.getElementById("d"+i).className="hs";
}
}
varsu=1;//速度
vartar=1;//當前目標
varflag=true;//正反向
vartar_pre;//上一個
vartar_next;//下一個
functiona1(){
vartarTd=document.getElementById("d"+tar).className="hs";

if(flag){
tar_pre=tar-1;//用於滅掉前面的背景,當然如果是上下移動就不是減1了,你可以再研究
tar_next=tar+1;//試探下一個是否有
if(document.getElementById("d"+tar_next)!=null){
tar+=1;//這里加1也是只針對於橫向
}else{
flag=false;
tar-=1;
}
}else{
tar_pre=tar+1;
tar_next=tar-1;//試探下一個是否有
if(document.getElementById("d"+tar_next)!=null){
tar-=1;//這里加1也是只針對於橫向
}else{
flag=true;
tar+=1;
}
}

if(document.getElementById("d"+tar_pre)!=null){
document.getElementById("d"+tar_pre).className="hs1"
}

setTimeout("a1()",1000)
}
</script>
<tableborder="0">
<tr>
<tdwidth="10"height="10"id="d1"></td>
<tdwidth="10"height="10"id="d2"></td>
<tdwidth="10"height="10"id="d3"></td>
<tdwidth="10"height="10"id="d4"></td>
<tdwidth="10"height="10"id="d5"></td>
<tdwidth="10"height="10"id="d6"></td>
<tdwidth="10"height="10"id="d7"></td>
<tdwidth="10"height="10"id="d8"></td>
<tdwidth="10"height="10"id="d9"></td>
<tdwidth="10"height="10"id="d10"></td>
</tr>
</table>
<inputname=""type="button"value="開始"onclick="a1()"/>
</body>
</html>

我沒寫過貪吃蛇,不過可以一起學習,這是我的一個思路,望交流,qqqun21.77/7/12




我突然覺得更好的辦法是用二維數組

安卓系統單機版的貪吃蛇核心演算法和技術

《貪吃蛇》的最簡演算法就是用鏈表了
用鏈表的節點表示蛇
增加的減少都有很方便
移動的時候只須增加一個頭節點並去掉尾節點就行了
吃食物是只須增加一個頭節點
鏈表和蛇本來就很相似
用鏈表編《貪吃蛇》最合適不過了
網上有很多這種《貪吃蛇》的代碼,可以下載來直接使用

⑦ 誰能詳細的給俺講下 js 貪吃蛇的 思路 演算法

演算法是不分語言的,簡單點想就是利用一個數組存取蛇,蛇在方格子里走,一個方格是一步,每次畫圖的時候把數組最後一個去掉,變成頭部,吃一個數組增加一個,就這么簡單。

⑧ 用js做一個貪吃蛇的游戲,謝謝,最好有注釋

以前做的一個 部分注釋 核心部分由注釋 其實就是一個最後一個跟隨前面一個位置的演算法

<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<styletype="text/css">
.body{width:600px;margin:100pxauto;text-align:center;}
#main{height:300px;border:1pxsolid#f00;position:relative;}
#maindiv{width:20px;height:20px;background-color:green;position:absolute;}
#maindiv.snake{background-color:#ff0;}
.score{font-size:14px;}
.scorestrong{color:Red;}
</style>
<scripttype="text/javascript">
window.onload=function(){
varomain=document.getElementById("main");
varr=15,c=30;
varasnake=[];
varspeed=150;
varodiv=document.createElement("div");
asnake.push({l:Math.floor(Math.random()*c),t:Math.floor(Math.random()*r),div:odiv,d:"l"});
omain.appendChild(odiv);
setPosition(asnake[0]);
//設置位置
functionsetPosition(obj){
obj.div.style.left=obj.l*20+"px";
obj.div.style.top=obj.t*20+"px";
}
varaEat=null;
vard="l";
//創建吃的
functioncreateEat(){
varl=Math.floor(Math.random()*c);
vart=Math.floor(Math.random()*r);
varisexist=false;
//判斷是否存在在設數組裡面
for(vari=0;i<asnake.length;i++){
if(l==asnake[i].l&&t==asnake[i].t){
isexist=true;
break;
}
}
//如果存在再創建一個蛇
if(isexist){
createEat();
return;
}
varonewdiv=document.createElement("div");
onewdiv.className="snake";
aEat={l:l,t:t,div:onewdiv,d:"l"};
omain.appendChild(onewdiv);
setPosition(aEat);
}
createEat();

varobtn=document.getElementById("btn");
varoscore=document.getElementById("score");
varoaddspeed=document.getElementById("addspeed");

varotimer=null;
varisitem=true;
oaddspeed.onclick=function(){
clearInterval(otimer);
speed=speed<50?50:speed-20;
setasnke();
}
obtn.onclick=function(){
if(!isitem){
clearInterval(otimer);
obtn.value="繼續游戲";
isitem=true;
returnfalse;
}
obtn.value="暫停游戲";
setasnke();
isitem=false;
}

functionsetasnke(){

otimer=setInterval(function(){
for(vari=asnake.length-1;i>0;i--){
asnake[i].l=asnake[i-1].l;
asnake[i].t=asnake[i-1].t;
asnake[i].d=asnake[i-1].d;
}
switch(d){
case"l":
asnake[0].l--;
break;
case"r":
asnake[0].l++;
break;
case"t":
asnake[0].t--;
break;
case"b":
asnake[0].t++;
break;
}
//判斷蛇是否撞牆了
if(asnake[0].l<0||asnake[0].l>=c||asnake[0].t<0||asnake[0].t>=r){
alert("你死掉了");
clearInterval(otimer);
return;
}
//判斷蛇是否撞到自己了
for(varn=1;n<asnake.length;n++){
if(asnake[0].l==asnake[n].l&&asnake[0].t==asnake[n].t){
alert("你已經死掉了");
clearInterval(otimer);
return;
}
}
//判斷蛇是否吃到東西了
if(asnake[0].l==aEat.l&&asnake[0].t==aEat.t){
aEat.div.className="";
oscore.innerHTML=parseInt(oscore.innerHTML)+1;
asnake.push(aEat);
createEat();
}
//重新設置蛇的位置
for(varj=0;j<asnake.length;j++){
setPosition(asnake[j]);
}
},speed);
}

//鍵盤改變蛇的方向
document.onkeydown=function(event){
varoEn=event||window.event;
varoCode=oEn.keyCode;
switch(oCode){
case37:
d="l";
break;
case38:
d="t";
break;
case39:
d="r";
break;
case40:
d="b";
break;
}
}
}
</script>
</head>
<body>
<divclass="body">
<inputtype="button"value="加速"id="addspeed"/><inputtype="button"id="btn"value="開始游戲"/>&nbsp;&nbsp;<spanclass="score">積分:<strongid="score">0</strong></span>
<divid="main">

</div>
</div>
</body>
</html>

⑨ 20行js代碼實現的貪吃蛇大戰

稍等,我先留個坑,一會兒上電腦看看

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"><title>貪吃蛇重構</title><style>
body {display: flex;height: 100vh;margin: 0;padding: 0;justify-content: center;align-items: center;}</style>
</head>
<body>
<canvas id="can" width="400" height="400" style="background-color: black">對不起,您的瀏覽器不支持canvas</canvas>
<script>var snake = [41, 40], //snake隊列表示蛇身,初始節點存在但不顯示direction = 1, //1表示向右,-1表示向左,20表示向下,-20表示向上
food = 43, //食物的位置
n, //與下次移動的位置有關box = document.getElementById('can').getContext('2d');//從0到399表示box里[0~19]*[0~19]的所有節點,每20px一個節點function draw(seat, color) {box.fillStyle = color;box.fillRect(seat % 20 *20 + 1, ~~(seat / 20) * 20 + 1, 18, 18);//用color填充一個矩形,以前兩個參數為x,y坐標,後兩個參數為寬和高。}
document.onkeydown = function(evt) {//當鍵盤上下左右鍵摁下的時候改變directiondirection = snake[1] - snake[0] == (n = [-1, -20, 1, 20][(evt || event).keyCode - 37] || direction) ? direction : n;};
!function() {snake.unshift(n = snake[0] + direction);//此時的n為下次蛇頭出現的位置,n進入隊列 if(snake.indexOf(n, 1) > 0 || n < 0 || n > 399 || direction == 1 && n % 20 == 0 || direction == -1 && n % 20 == 19) {//if語句判斷貪吃蛇是否撞到自己或者牆壁,碰到時返回,結束程序return alert("GAME OVER!");}draw(n, "lime"); //畫出蛇頭下次出現的位置if(n == food) { //如果吃到食物時,產生一個蛇身以外的隨機的點,不會去掉蛇尾while (snake.indexOf(food = ~~(Math.random() * 400)) >= 0);draw(food, "yellow");} else { //沒有吃到食物時正常移動,蛇尾出隊列draw(snake.pop(),"black");}setTimeout(arguments.callee, 150);//每隔0.15秒執行函數一次,可以調節蛇的速度
}();
</script>
</body>
</html>

這不是我寫的,是我看見的那個網址裡面寫的詳細的。這個提交是電腦端,我發現一提交就自動壓縮,亂了。

⑩ JavaScript製作貪吃蛇游戲代碼

蛇的身體:數組
食物:在規定范圍內生成的隨機數
蛇的身體累加:數組元素個數增加
蛇碰牆死:數組首個元素的x值或y值小於0或者大於地圖的寬度活高度
蛇咬自己死:數組首個元素的x值和y值和其他元素值重復
移動速度:在指定的時間內調用移動方法
開始:開始調用方法
暫停:暫停調用方法
積分:蛇沒吃一個食物,全局變數加1
自己做吧,很簡單,做完進步很大

閱讀全文

與js貪吃蛇的演算法相關的資料

熱點內容
程序員那麼可愛小說結局 瀏覽:862
zenity命令 瀏覽:564
監禁風暴哪個app有 瀏覽:865
程序員的愛心是什麼 瀏覽:591
java中對字元串排序 瀏覽:290
單片機用數模轉換生成三角波 瀏覽:634
外網怎麼登陸伺服器地址 瀏覽:133
什麼人要懂編譯原理 瀏覽:150
源碼改單 瀏覽:712
pdfzip 瀏覽:875
壓縮空氣25兆帕會變成液體嗎 瀏覽:50
linux測試伺服器性能 瀏覽:950
dlp硬碟加密 瀏覽:361
應用加密裡面打不開 瀏覽:857
基於單片機的超聲波測距儀的設計 瀏覽:741
xp自動備份指定文件夾 瀏覽:663
我的世界伺服器如何讓世界平坦 瀏覽:170
伺服器和電腦如何共享 瀏覽:689
程序員早期症狀 瀏覽:573
學小學生編程哪裡學 瀏覽:951