用慧編程做貪吃蛇代碼過程如下:
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡(jiǎn)單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:空間域名、雅安服務(wù)器托管、營(yíng)銷軟件、網(wǎng)站建設(shè)、臨川網(wǎng)站維護(hù)、網(wǎng)站推廣。
1、我們需要建立四個(gè)頭文件,然后分別設(shè)置蛇的狀態(tài),上下左右,這是蛇能夠有方向可走的前提,然后我們?cè)僭O(shè)置蛇身的節(jié)點(diǎn),定義一個(gè)簡(jiǎn)單的函數(shù),這樣蛇的全身以及他的行走方向就弄完了。
2、貪吃蛇不能穿墻代碼。
3、第二步,一個(gè)函數(shù)這個(gè)函數(shù)的目的是貪吃蛇不能穿墻,很簡(jiǎn)單的代碼分別設(shè)置長(zhǎng)寬的最大位移,在內(nèi)部范圍內(nèi)設(shè)置為一即可通過,否則不能穿墻。貪吃蛇隨機(jī)生成一個(gè)食物。
4、設(shè)置一個(gè)隨機(jī)函數(shù)。這樣貪吃蛇代碼就做好了。
慧編程是一款面向STEAM教育領(lǐng)域的積木式和代碼編程軟件,基于圖形化編程開發(fā)。
html
head
title貪吃蛇 Snake v2.4/title
style
body{
font-size:9pt;
}
table{
border-collapse: collapse;
border:solid #333 1px;
}
td{
height: 10px;
width: 10px;
font-size: 0px;
}
.filled{
background-color:blue;
}
/style
/head
script
function $(id){return document.getElementById(id);}
/**************************************************************
* javascript貪吃蛇 v2.4 br /
* author: sunxing007 05/14/2009br /
* 轉(zhuǎn)載請(qǐng)注明來自 謝謝!br /
* v2.4修正了蛇身顏色可以隨著蛇前進(jìn)而移動(dòng)
**************************************************************/
//貪吃蛇類
var Snake = {
tbl: null,
/**
* body: 蛇身,數(shù)組放蛇的每一節(jié),
* 數(shù)據(jù)結(jié)構(gòu){x:x0, y:y0, color:color0},
* x,y表示坐標(biāo),color表示顏色
**/
body: [],
//當(dāng)前移動(dòng)的方向,取值0,1,2,3, 分別表示向上,右,下,左, 按鍵盤方向鍵可以改變它
direction: 0,
//定時(shí)器
timer: null,
//速度
speed: 250,
//是否已經(jīng)暫停
paused: true,
//行數(shù)
rowCount: 30,
//列數(shù)
colCount: 30,
//初始化
init: function(){
var colors = ['red','orange','yellow','green','blue','purple','#ccc'];
this.tbl = $("main");
var x = 0;
var y = 0;
var colorIndex = 0;
//產(chǎn)生初始移動(dòng)方向
this.direction = Math.floor(Math.random()*4);
//構(gòu)造table
for(var row=0;rowthis.rowCount;row++){
var tr=this.tbl.insertRow(-1);
for(var col=0;colthis.colCount;col++) {
var td=tr.insertCell(-1);
}
}
//產(chǎn)生20個(gè)松散節(jié)點(diǎn)
for(var i=0; i10; i++){
x = Math.floor(Math.random()*this.colCount);
y = Math.floor(Math.random()*this.rowCount);
colorIndex = Math.floor(Math.random()*7);
if(!this.isCellFilled(x,y)){
this.tbl.rows[y].cells[x].style.backgroundColor = colors[colorIndex];
}
}
//產(chǎn)生蛇頭
while(true){
x = Math.floor(Math.random()*this.colCount);
y = Math.floor(Math.random()*this.rowCount);
if(!this.isCellFilled(x,y)){
this.tbl.rows[y].cells[x].style.backgroundColor = "black";
this.body.push({x:x,y:y,color:'black'});
break;
}
}
this.paused = true;
//添加鍵盤事件
document.onkeydown= function(e){
if (!e)e=window.event;
switch(e.keyCode | e.which | e.charCode){
case 13: {
if(Snake.paused){
Snake.move();
Snake.paused = false;
}
else{
//如果沒有暫停,則停止移動(dòng)
Snake.pause();
Snake.paused = true;
}
break;
}
case 37:{//left
//阻止蛇倒退走
if(Snake.direction==1){
break;
}
Snake.direction = 3;
break;
}
case 38:{//up
//快捷鍵在這里起作用
if(event.ctrlKey){
Snake.speedUp(-20);
break;
}
if(Snake.direction==2){//阻止蛇倒退走
break;
}
Snake.direction = 0;
break;
}
case 39:{//right
if(Snake.direction==3){//阻止蛇倒退走
break;
}
Snake.direction = 1;
break;
}
case 40:{//down
if(event.ctrlKey){
Snake.speedUp(20);
break;
}
if(Snake.direction==0){//阻止蛇倒退走
break;
}
Snake.direction = 2;
break;
}
}
}
},
//移動(dòng)
move: function(){
this.timer = setInterval(function(){
Snake.erase();
Snake.moveOneStep();
Snake.paint();
}, this.speed);
},
//移動(dòng)一節(jié)身體
moveOneStep: function(){
if(this.checkNextStep()==-1){
clearInterval(this.timer);
alert("Game over!\nPress Restart to continue.");
return;
}
if(this.checkNextStep()==1){
var _point = this.getNextPos();
var _x = _point.x;
var _y = _point.y;
var _color = this.getColor(_x,_y);
this.body.unshift({x:_x,y:_y,color:_color});
//因?yàn)槌粤艘粋€(gè)食物,所以再產(chǎn)生一個(gè)食物
this.generateDood();
return;
}
//window.status = this.toString();
var point = this.getNextPos();
//保留第一節(jié)的顏色
var color = this.body[0].color;
//顏色向前移動(dòng)
for(var i=0; ithis.body.length-1; i++){
this.body[i].color = this.body[i+1].color;
}
//蛇尾減一節(jié), 蛇尾加一節(jié),呈現(xiàn)蛇前進(jìn)的效果
this.body.pop();
this.body.unshift({x:point.x,y:point.y,color:color});
//window.status = this.toString();
},
//探尋下一步將走到什么地方
pause: function(){
clearInterval(Snake.timer);
this.paint();
},
getNextPos: function(){
var x = this.body[0].x;
var y = this.body[0].y;
var color = this.body[0].color;
//向上
if(this.direction==0){
y--;
}
//向右
else if(this.direction==1){
x++;
}
//向下
else if(this.direction==2){
y++;
}
//向左
else{
x--;
}
//返回一個(gè)坐標(biāo)
return {x:x,y:y};
},
//檢查將要移動(dòng)到的下一步是什么
checkNextStep: function(){
var point = this.getNextPos();
var x = point.x;
var y = point.y;
if(x0||x=this.colCount||y0||y=this.rowCount){
return -1;//觸邊界,游戲結(jié)束
}
for(var i=0; ithis.body.length; i++){
if(this.body[i].x==xthis.body[i].y==y){
return -1;//碰到自己的身體,游戲結(jié)束
}
}
if(this.isCellFilled(x,y)){
return 1;//有東西
}
return 0;//空地
},
//擦除蛇身
erase: function(){
for(var i=0; ithis.body.length; i++){
this.eraseDot(this.body[i].x, this.body[i].y);
}
},
//繪制蛇身
paint: function(){
for(var i=0; ithis.body.length; i++){
this.paintDot(this.body[i].x, this.body[i].y,this.body[i].color);
}
},
//擦除一節(jié)
eraseDot: function(x,y){
this.tbl.rows[y].cells[x].style.backgroundColor = "";
},
paintDot: function(x,y,color){
this.tbl.rows[y].cells[x].style.backgroundColor = color;
},
//得到一個(gè)坐標(biāo)上的顏色
getColor: function(x,y){
return this.tbl.rows[y].cells[x].style.backgroundColor;
},
//用于調(diào)試
toString: function(){
var str = "";
for(var i=0; ithis.body.length; i++){
str += "x:" + this.body[i].x + " y:" + this.body[i].y + " color:" + this.body[i].color + " - ";
}
return str;
},
//檢查一個(gè)坐標(biāo)點(diǎn)有沒有被填充
isCellFilled: function(x,y){
if(this.tbl.rows[y].cells[x].style.backgroundColor == ""){
return false;
}
return true;
},
//重新開始
restart: function(){
if(this.timer){
clearInterval(this.timer);
}
for(var i=0; ithis.rowCount;i++){
this.tbl.deleteRow(0);
}
this.body = [];
this.init();
this.speed = 250;
},
//加速
speedUp: function(time){
if(!this.paused){
if(this.speed+time10||this.speed+time2000){
return;
}
this.speed +=time;
this.pause();
this.move();
}
},
//產(chǎn)生食物。
generateDood: function(){
var colors = ['red','orange','yellow','green','blue','purple','#ccc'];
var x = Math.floor(Math.random()*this.colCount);
var y = Math.floor(Math.random()*this.rowCount);
var colorIndex = Math.floor(Math.random()*7);
if(!this.isCellFilled(x,y)){
this.tbl.rows[y].cells[x].style.backgroundColor = colors[colorIndex];
}
}
};
/script
body onload="Snake.init();"
/*************************************************************br /
* javascript貪吃蛇 v2.4br /
* author: sunxing007 05/14/2009br /
* 轉(zhuǎn)載請(qǐng)注明來自 a href="";/a 謝謝!br /
**************************************************************/br /
table id="main" border="1" cellspacing="0" cellpadding="0"/table
input type="button" id="btn" value="開始/暫停" /點(diǎn)左邊按鈕或按Enter開始/暫停游戲br /
input type="button" id="reset" value="重新開始" /br /
input type="button" id="upSpeed" value="加速" /點(diǎn)左邊按鈕或按Ctrl + ↑加速br /
input type="button" id="downSpeed" value="減速" /點(diǎn)左邊按鈕或按Ctrl + ↓減速
script
$('btn').onclick = function(){
if(Snake.paused){
Snake.move();
Snake.paused = false;
}
else{
Snake.pause();
Snake.paused = true;
}
};
$("reset").onclick = function(){
Snake.restart();
this.blur();
};
$("upSpeed").onclick = function(){
Snake.speedUp(-20);
};
$("downSpeed").onclick = function(){
Snake.speedUp(20);
};
/script
/body
/html
#include stdio.h
#include graphics.h
#include stdlib.h
#include dos.h /*引用的庫(kù)函數(shù)*/
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b/*宏定義鍵名*/
#define N 200
int i,key;
int level;/*游戲等級(jí)*/
int score=0;/*得分*/
int gamespeed;/*游戲速度*/
struct Food
{
int x;/*食物的橫坐標(biāo)*/
int y;/*食物的縱坐標(biāo)*/
int yes;/*判斷是否要出現(xiàn)食物的變量*/
}food;/*食物的結(jié)構(gòu)體*/
struct Snake
{
int x[N];
int y[N];
int node;/*蛇的節(jié)數(shù)*/
int direction;/*蛇移動(dòng)方向*/
int life;/* 蛇的生命,0活著,1死亡*/
}snake;/*蛇的結(jié)構(gòu)體*/
void Choicelevle(void);/*選擇游戲等級(jí)*/
void Init(void);/*圖形驅(qū)動(dòng)*/
void Close(void);/*圖形結(jié)束*/
void DRAW(void);/*游戲區(qū)域*/
void GameOver(void);/*結(jié)束游戲*/
void GamePlay(void);/*玩游戲具體過程*/
void PrScore(void);/*輸出成績(jī)*/
/*主函數(shù)*/
void main(void)
{
Init();/*圖形驅(qū)動(dòng)*/
Choicelevle();/*選擇游戲等級(jí)*/
DRAW();/*游戲區(qū)域*/
GamePlay();/*玩游戲具體過程*/
Close();/*圖形結(jié)束*/
}
/*圖形驅(qū)動(dòng)*/
void Init(void)
{
int gd=DETECT,gm;
initgraph(gd,gm,"\\turboc2"); /*初始化圖形系統(tǒng)*/
cleardevice(); /*清除圖形界面*/
}
/*選擇游戲等級(jí)*/
void Choicelevle(void)
{char name[20];
setcolor(YELLOW);
settextstyle(0,0,6);
outtextxy(150,150,"Snake");
setcolor(GREEN);
settextstyle(0,0,1);
outtextxy(200,250,"please put in your English name:");
outtextxy(200,270,"Choice levle from 1-9.");
outtextxy(300,320,"name:yangzilong");/*制作人姓名*/
outtextxy(300,350,"number:0902060226");/*制作人學(xué)號(hào)*/
outtextxy(300,380,"class:computer science 0602");/*制作人班級(jí)*/
getch();
printf("please putin your name:");
gets(name);
printf("please choice levle:");
scanf("%d",level);
gamespeed=100000-400*level-300*level*level;
if(level9||level1)
{cleardevice(); /*清除圖形界面*/
setcolor(YELLOW); /*設(shè)置字體顏色*/
settextstyle(0,0,2); /*設(shè)置字體類型*/
outtextxy(150,200,"level input error"); /*顯示文本*/
getch();
level=1;
}
}
void DRAW(void)
{cleardevice(); /*清屏*/
setcolor(2);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*設(shè)置線型*/
rectangle(45,45,465,325);
}
/*玩游戲具體過程*/
void GamePlay(void)
{setcolor(5);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*設(shè)置線型*/
randomize();/*隨機(jī)數(shù)發(fā)生器*/
food.yes=1;/*1表示需要出現(xiàn)新食物,0表示已經(jīng)存在食物*/
snake.life=0;/*活著*/
snake.direction=1;/*方向往右*/
snake.x[0]=320;snake.y[0]=240;/*蛇頭*/
snake.x[1]=330;snake.y[1]=240; /*蛇的第二節(jié)位置*/
snake.node=3;/*節(jié)數(shù)*/
PrScore();/*輸出得分*/
while(1)/*可以重復(fù)玩游戲,壓ESC鍵結(jié)束*/
{
while(!kbhit())/*在沒有按鍵的情況下,蛇自己移動(dòng)身體*/
{
if(food.yes==1)/*需要出現(xiàn)新食物*/
{
food.x=rand()%360+70;
food.y=rand()%250+60;
while(food.x%10!=0)/*食物隨機(jī)出現(xiàn)后必須讓食物能夠在整格內(nèi),這樣才可以讓蛇吃到*/
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;i0;i--)/*蛇的每個(gè)環(huán)節(jié)往前移動(dòng)*/
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
/*1,2,3,4表示右,左,上,下四個(gè)方向,通過這個(gè)控制來移動(dòng)蛇頭*/
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;isnake.node;i++)/*從蛇的第四節(jié)開始判斷是否撞到自己了,因?yàn)樯哳^為兩節(jié),第三節(jié)不可能拐過來*/
{
if(snake.x[i]==snake.x[0]snake.y[i]==snake.y[0])
{
GameOver();/*顯示失敗*/
snake.life=1; /*蛇死*/
break;
}
}
/*如果蛇頭碰到墻壁,蛇頭從對(duì)面墻出來*/
if(snake.x[0]50)
{snake.x[0]=450;/*如果蛇頭越過左邊界,則從右邊界進(jìn)入*/
snake.y[0]=snake.y[0];/*縱坐標(biāo)不變*/
for(i=snake.node-1;i0;i--)
{snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1]; /*蛇的其他節(jié)數(shù)向前推進(jìn)*/
}
{
setfillstyle(SOLID_FILL,0); /*設(shè)置填充模式和顏色,0表示黑色*/
bar(50,55,455,315);/*bar是表示填充的范圍的函數(shù)*/
}
}
else
if(snake.x[0]450)
{snake.x[0]=50;/*如果蛇頭越過右邊界,則蛇頭從左邊界進(jìn)入*/
snake.y[0]=snake.y[0];/*縱坐標(biāo)不變*/
for(i=snake.node-1;i0;i--)
{snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1]; /*蛇的其他節(jié)數(shù)向前推進(jìn)*/
}
{
setfillstyle(SOLID_FILL,0); /*設(shè)置填充模式和顏色,0表示黑色*/
bar(50,55,455,315);/*bar是表示填充的范圍的函數(shù)*/
}
}
else
if(snake.y[0]60)
{snake.y[0]=320;/*如果蛇頭越過上邊界,則從下邊界進(jìn)入*/
snake.x[0]=snake.x[0];/*橫坐標(biāo)不變*/
for(i=snake.node-1;i0;i--)
{snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1]; /*蛇的其他節(jié)數(shù)向前推進(jìn)*/
}
{
setfillstyle(SOLID_FILL,0); /*設(shè)置填充模式和顏色,0表示黑色*/
bar(50,55,455,315);/*bar是表示填充的范圍的函數(shù)*/
}
}
else
if(snake.y[0]320)
{snake.y[0]=60;/*如果蛇頭越過下邊界,則從上邊界進(jìn)入*/
snake.x[0]=snake.x[0];/*橫坐標(biāo)不變*/
for(i=snake.node-1;i0;i--)
{snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1]; /*蛇的其他節(jié)數(shù)向前推進(jìn)*/
}
{
setfillstyle(SOLID_FILL,0); /*設(shè)置填充模式和顏色,0表示黑色*/
bar(50,55,455,315);/*bar是表示填充的范圍的函數(shù)*/
}
}
if(snake.life==1)/*如果蛇死就跳出內(nèi)循環(huán),重新開始*/
break;
if(snake.x[0]==food.xsnake.y[0]==food.y)/*吃到食物以后*/
{
setcolor(0);/*把畫面上的食物東西去掉*/
rectangle(food.x,food.y,food.x+10,food.y-10); /*用當(dāng)前線型和顏色畫一矩形*/
snake.x[snake.node]=-20;snake.y[snake.node]=-20;
/*新的一節(jié)先放在看不見的位置,下次循環(huán)就取前一節(jié)的位置*/
snake.node++;/*蛇的身體長(zhǎng)一節(jié)*/
food.yes=1;/*畫面上需要出現(xiàn)新的食物*/
score+=10; /*每吃掉一食物,得分累加10分*/
if(score%100==0)
{level++;gamespeed=100000-400*level-300*level*level;/*每吃掉10食物提升一級(jí),速度加快*/
PrScore();/*輸出新得分*/
setcolor(YELLOW); /*設(shè)置字體顏色*/
settextstyle(0,0,4); /*設(shè)置字體類型*/
outtextxy(150,200,"LEVEL UP"); /*顯示文本*/
if(level==10)
{level=1,gamespeed=100000-400*level-300*level*level;}
delay(6000000);
delay(6000000);
delay(6000000);
delay(6000000);
delay(6000000);
delay(6000000);
delay(6000000);
bar(50,55,455,315);/*bar是表示填充的范圍的函數(shù)*/
}
PrScore();/*輸出新得分*/
}
setcolor(4);/*畫出蛇*/
for(i=0;isnake.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)*/ /*用黑色去除蛇的的最后一節(jié)*/
if(snake.life==1)/*如果蛇死就跳出循環(huán)*/
break;
key=bioskey(0);/*接收按鍵*/
if(key==ESC)/*按ESC鍵退出*/
break;
else
if(key==UPsnake.direction!=4)
/*判斷是否往相反的方向移動(dòng)*/
snake.direction=3;
else
if(key==RIGHTsnake.direction!=2)
snake.direction=1;
else
if(key==LEFTsnake.direction!=1)
snake.direction=2;
else
if(key==DOWNsnake.direction!=3)
snake.direction=4;
}/*endwhile(1)*/
}
/*游戲結(jié)束*/
void GameOver(void)
{
cleardevice(); /*清屏*/
PrScore();
setcolor(RED); /*設(shè)置字體顏色*/
settextstyle(0,0,4); /*設(shè)置字體類型*/
outtextxy(200,200,"GAME OVER"); /*顯示文本*/
getch();
}
/*輸出成績(jī)及游戲等級(jí)*/
void PrScore(void)
{
char str1[20];/*設(shè)置字符型數(shù)組*/
setfillstyle(SOLID_FILL,0);
bar(50,15,390,35); /*填充矩形框*/
setcolor(6); /*設(shè)置文本顏色*/
settextstyle(0,0,2); /*設(shè)置數(shù)組顯示位置*/
sprintf(str1,"score %d level %d",score,level);/*顯示數(shù)組內(nèi)容*/
outtextxy(55,20,str1);
setcolor(YELLOW); /*設(shè)置字體顏色*/
settextstyle(0,0,2); /*設(shè)置字體類型*/
outtextxy(250,400,"EXIT=ESC ");/*顯示文本*/
}
void Close(void)
{
closegraph();
}
沒找到,只有C的~
*要求改進(jìn):用圖形模式表示print()函數(shù)*/
#include mem.h
#include fcntl.h
#include conio.h
#include graphics.h
#include io.hchin a i t p oe er . co mugTTCrI
#include stdlib.h
#include stdio.h
#include bios.h
#include math.h
#define N 50
#define Time 10000
int A[N][N];
int IE=6;chin a i t p oe er . co mugTTCrI
int SCORE=0;
char a[]="9999";
void *ball;
int maxx;
unsigned int size;chin a i t p oe er . co mugTTCrI
int head=1;/*0,1,2,3*/
int i=3,j=0,ii=0,jj=0;
int length=3;
int x,y;/*蛇頭標(biāo)志*/
int add=1;/*食物標(biāo)志*/
int tii,tjj;/* 前蛇尾坐標(biāo) */
void start_image()
{
setlinestyle(SOLID_LINE,1,2);
setcolor(GREEN);
line(39,39,39,441);
line(39,441,441,441);
line(441,441,441,39);
line(441,39,39,39);chin a i t p oe er . co mugTTCrI
chin a i t p oe er . co mugTTCrI
}
void draw_image(int x,int y)
{
int i=x*400/N+40;
int j=y*400/N+40;
setfillstyle(1,4);
bar(j,i,j+400/N,i+400/N);
}
void eraser_image(int x,int y)
{
int i=x*400/N+40;
int j=y*400/N+40;
setfillstyle(1,0);
bar(j,i,j+400/N,i+400/N);
}chin a i t p oe er . co mugTTCrI
chin a i t p oe er . co mugTTCrI
void tu()
{/*tuxing jiemian*/
maxx=getmaxx();
size=imagesize(210,390,450,420);
ball=malloc(size);
setfillstyle(1,10);
bar(160,170,473,253);
setfillstyle(1,9);
bar(163,173,470,250);
setcolor(13);
outtextxy(200,200,"Welcome to Greedy Snake Game");
setcolor(14);
outtextxy(250,220,"Developer :Wu siyuan ");
outtextxy(290,240,"2003.5");
outtextxy(210,390,"Press any key to contunue...");
getimage(210,390,450,420,ball);chin a i t p oe er . co mugTTCrI
chin a i t p oe er . co mugTTCrI
while(!kbhit())
{/* 沒有鍵盤擊鍵 */
putimage(210,390,ball,XOR_PUT);
delay(30000);
}
cleardevice();
}
void print()/*輸出*/
{ /*要將轉(zhuǎn)化成圖形模式*/
int a,b;
/*start_image(); */chin a i t p oe er . co mugTTCrI
for(a=0;aN;a++)
{ for(b=0;bN;b++)
{if(A[a][b]1)draw_image(a,b);
if(A[a][b]==0)eraser_image(a,b); }chin a i t p oe er . co mugTTCrI
chin a i t p oe er . co mugTTCrI
chin a i t p oe er . co mugTTCrI
}
}chin a i t p oe er . co mugTTCrI
void snake() /*begin*/
{
int a,b;
for(a=0;aN;a++)
for(b=0;bN;b++)
A[a][b]=0;chin a i t p oe er . co mugTTCrI
A[i][j]=5;A[i-1][j]=4;A[i-2][j]=3;A[i-3][j]=2;
}
void del_tail()/*蛇尾的操作*/
{
int number=A[ii][jj];
tii=ii;tjj=jj;/*記錄前蛇尾*/chin a i t p oe er . co mugTTCrI
while(1)
{
if(A[ii][jj-1]==number+1||A[ii][jj-1]==2number==30)
{jj--;break;}chin a i t p oe er . co mugTTCrI
if(A[ii][jj+1]==number+1||A[ii][jj+1]==2number==30)
{jj++;break;}chin a i t p oe er . co mugTTCrI
if(A[ii-1][jj]==number+1||A[ii-1][jj]==2number==30)
{ii--;break;}chin a i t p oe er . co mugTTCrI
if(A[ii+1][jj]==number+1||A[ii+1][jj]==2number==30)
{ii++;break;}chin a i t p oe er . co mugTTCrI
}
}chin a i t p oe er . co mugTTCrI
void down()
{
head=1;
if(A[i+1][j]1A[i+1][j]!=99)
{printf("I hit myself!");exit(1);}
i++;
if(IE30)IE=2;
A[i][j]=IE;IE++;
del_tail();
A[tii][tjj]=0;chin a i t p oe er . co mugTTCrI
}
void up()
{
head=0;
if(A[i-1][j]1A[i-1][j]!=99)
{printf("I hit myself!");exit(1);}
i--;
if(IE30)IE=2;
A[i][j]=IE;IE++;
del_tail();
A[tii][tjj]=0;chin a i t p oe er . co mugTTCrI
}
void left()
{
head=2;
if(A[i][j-1]1A[i][j-1]!=99)
{printf("I hit myself!");exit(1);}
j--;
if(IE30)IE=2;
A[i][j]=IE;IE++;
del_tail();
A[tii][tjj]=0;chin a i t p oe er . co mugTTCrI
}
void right()
{
head=3;
if(A[i][j+1]1A[i][j+1]!=99)
{printf("I hit myself!");exit(1);}
j++;
if(IE30)IE=2;
A[i][j]=IE;IE++;
del_tail();
A[tii][tjj]=0;
}chin a i t p oe er . co mugTTCrI
void test()/*測(cè)試是否到達(dá)邊界*/
{
if(i0||iN-1||j0||jN-1)
{
printf("出界! Game over.");
exit(1);
}
}
void move()/*當(dāng)前移動(dòng)*/
{
switch(head)
{
case 0:up();break;
case 1:down();break;
case 2:left();break;
case 3:right();break;
/*default:printf("方向出錯(cuò)!\\n");*/
}chin a i t p oe er . co mugTTCrI
}
int keyboard()
{
/*判斷是否有鍵盤輸入
// 有返回值0,1,2,3
// int k=keyboard;
//判斷方向是否是有效方向
//無效則什么也不做
//若方向有效則改變head的值*/
int a,key,h;
for(a=0;a2;a++)
if(bioskey(1))break;
key=bioskey(0);chin a i t p oe er . co mugTTCrI
switch (key)
{
/*up*/
case 18432:h=0;break;
/*down*/
case 20480:h=1;break;
/*left*/
case 19200:h=2;break;
/*right*/
case 19712:h=3;break;
/*Esc*/
case 283:printf("You press the Esc key!");exit(1);break;
/*default: h=999 ;*/chin a i t p oe er . co mugTTCrI
}
return h;
}
void add_point()/* 用于產(chǎn)生食物 */
{chin a i t p oe er . co mugTTCrI
while(1){
x=random(100)%N;
y=random(100)%N;
if(A[x][y]==0)break;
}
A[x][y]=99;/*食物的標(biāo)志是5*/chin a i t p oe er . co mugTTCrI
add=0;/* 加食物標(biāo)志清0*/chin a i t p oe er . co mugTTCrI
}
void score()
{chin a i t p oe er . co mugTTCrI
chin a i t p oe er . co mugTTCrI
setcolor(9);
settextstyle(3,0,4);
outtextxy(450,40,"Score:");chin a i t p oe er . co mugTTCrI
setcolor(RED);
outtextxy(450,200,"Speed:");chin a i t p oe er . co mugTTCrI
}
void number_char(int x)
{chin a i t p oe er . co mugTTCrI
int a0,a1,a2,a3;
if(x9999){a[0]='9';a[1]='9';a[2]='9';a[3]='9';}
else {
a0=x/1000;
a[0]=a0+48;chin a i t p oe er . co mugTTCrI
a1=(x-a0*1000)/100;
a[1]=a1+48;chin a i t p oe er . co mugTTCrI
a2=(x-a0*1000-a1*100)/10;
a[2]=a2+48;chin a i t p oe er . co mugTTCrI
a3=(x-a0*1000-a1*100-a2*10);
a[3]=a3+48;
a[4]='\\0';chin a i t p oe er . co mugTTCrI
chin a i t p oe er . co mugTTCrI
}
}chin a i t p oe er . co mugTTCrI
void snake_get()/*吃到食物時(shí)*/
{
if(i==xj==y)
{
length++;chin a i t p oe er . co mugTTCrI
A[tii][tjj]=A[ii][jj]-1;/*蛇尾加長(zhǎng)*/chin a i t p oe er . co mugTTCrI
ii=tii;jj=tjj;/*蛇尾重新定義*/
add=1;/*食物標(biāo)志置1*/
setfillstyle(1,BLACK);
bar(520,100,650,140);/*clear score*/
setcolor(3);
number_char(SCORE+=100);
outtextxy(550,100,a);chin a i t p oe er . co mugTTCrI
}chin a i t p oe er . co mugTTCrI
}chin a i t p oe er . co mugTTCrI
chin a i t p oe er . co mugTTCrI
void main()
{
int get_head;/*定義鍵盤輸入*/
int gd=DETECT,gm;
clrscr();chin a i t p oe er . co mugTTCrI
/*regibgiobjdriver(public name)*/
initgraph(gd,gm,"c:\\\\bgi");chin a i t p oe er . co mugTTCrI
chin a i t p oe er . co mugTTCrI
setbkcolor(BLACK);chin a i t p oe er . co mugTTCrI
tu();
snake();/*初始化*/
start_image();
score();/*定義分?jǐn)?shù)界面*/chin a i t p oe er . co mugTTCrI
while(1)
{ while(bioskey(1)==0)/*是否有鍵盤輸入*/
{chin a i t p oe er . co mugTTCrI
if(add)add_point();/*是否可以增加食物*/chin a i t p oe er . co mugTTCrI
print();
move();
snake_get();/* 是否吃到食物 (test)*/
test();
delay(Time);
}
get_head=keyboard();
/* choose */chin a i t p oe er . co mugTTCrI
while(1){/*判斷得到的坐標(biāo)是否合法*/
if(get_head==0head==1)break;
if(get_head==1head==0)break;
if(get_head==2head==3)break;
if(get_head==3head==2)break;
else {head=get_head;break;}/*合法給head賦值*/
}chin a i t p oe er . co mugTTCrI
}chin a i t p oe er . co mugTTCrI
chin a i t p oe er . co mugTTCrI
}chin a i t p oe er . co mugTTCrI
制作貪吃蛇程序一吃就死是因?yàn)榇a輸入錯(cuò)誤,代碼有漏洞,同學(xué)們可以用window_size設(shè)置蛇可以活動(dòng)的區(qū)域大小。foods?是一個(gè)存儲(chǔ)著所有食物位置信息的列表,每次蛇體移動(dòng)后都會(huì)調(diào)用?check_eat_food?函數(shù)檢查是不是吃到了某一個(gè)食物。
可以發(fā)現(xiàn),檢查是不是吃到和吃下去這兩個(gè)動(dòng)作我分為了兩個(gè)函數(shù),以做到每個(gè)函數(shù)一心一意方便后期修改。但是作為一只能照顧自己的貪吃蛇,同學(xué)們還需要能夠判斷當(dāng)前自身狀態(tài)。
貪吃蛇的程序組成思路
貪吃蛇這個(gè)游戲可以分為三大塊:界面:負(fù)責(zé)顯示相關(guān)的所有工作;游戲流程控制:判斷游戲輸贏、游戲初始化等;蛇和食物:移動(dòng)自身、判斷是否死亡、是否被吃等。
每一塊都被做成了單獨(dú)的對(duì)象,通過相互配合實(shí)現(xiàn)游戲。對(duì)于貪吃蛇游戲里面的蛇來講,它可以做的事情有三種:移動(dòng),死亡(吃到自己,撞墻)和吃東西圍繞著這三個(gè)功能,同學(xué)們可以首先寫出一個(gè)簡(jiǎn)陋的蛇。