重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
用慧编程做贪吃蛇代码过程如下:
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:空间域名、雅安服务器托管、营销软件、网站建设、临川网站维护、网站推广。
1、我们需要建立四个头文件,然后分别设置蛇的状态,上下左右,这是蛇能够有方向可走的前提,然后我们再设置蛇身的节点,定义一个简单的函数,这样蛇的全身以及他的行走方向就弄完了。
2、贪吃蛇不能穿墙代码。
3、第二步,一个函数这个函数的目的是贪吃蛇不能穿墙,很简单的代码分别设置长宽的最大位移,在内部范围内设置为一即可通过,否则不能穿墙。贪吃蛇随机生成一个食物。
4、设置一个随机函数。这样贪吃蛇代码就做好了。
慧编程是一款面向STEAM教育领域的积木式和代码编程软件,基于图形化编程开发。
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 /
* 转载请注明来自 谢谢!br /
* v2.4修正了蛇身颜色可以随着蛇前进而移动
**************************************************************/
//贪吃蛇类
var Snake = {
tbl: null,
/**
* body: 蛇身,数组放蛇的每一节,
* 数据结构{x:x0, y:y0, color:color0},
* x,y表示坐标,color表示颜色
**/
body: [],
//当前移动的方向,取值0,1,2,3, 分别表示向上,右,下,左, 按键盘方向键可以改变它
direction: 0,
//定时器
timer: null,
//速度
speed: 250,
//是否已经暂停
paused: true,
//行数
rowCount: 30,
//列数
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;
//产生初始移动方向
this.direction = Math.floor(Math.random()*4);
//构造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);
}
}
//产生20个松散节点
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];
}
}
//产生蛇头
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{
//如果没有暂停,则停止移动
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;
}
}
}
},
//移动
move: function(){
this.timer = setInterval(function(){
Snake.erase();
Snake.moveOneStep();
Snake.paint();
}, this.speed);
},
//移动一节身体
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});
//因为吃了一个食物,所以再产生一个食物
this.generateDood();
return;
}
//window.status = this.toString();
var point = this.getNextPos();
//保留第一节的颜色
var color = this.body[0].color;
//颜色向前移动
for(var i=0; ithis.body.length-1; i++){
this.body[i].color = this.body[i+1].color;
}
//蛇尾减一节, 蛇尾加一节,呈现蛇前进的效果
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--;
}
//返回一个坐标
return {x:x,y:y};
},
//检查将要移动到的下一步是什么
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;//触边界,游戏结束
}
for(var i=0; ithis.body.length; i++){
if(this.body[i].x==xthis.body[i].y==y){
return -1;//碰到自己的身体,游戏结束
}
}
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);
}
},
//擦除一节
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;
},
//得到一个坐标上的颜色
getColor: function(x,y){
return this.tbl.rows[y].cells[x].style.backgroundColor;
},
//用于调试
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;
},
//检查一个坐标点有没有被填充
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();
}
},
//产生食物。
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 /
* 转载请注明来自 a href="";/a 谢谢!br /
**************************************************************/br /
table id="main" border="1" cellspacing="0" cellpadding="0"/table
input type="button" id="btn" value="开始/暂停" /点左边按钮或按Enter开始/暂停游戏br /
input type="button" id="reset" value="重新开始" /br /
input type="button" id="upSpeed" value="加速" /点左边按钮或按Ctrl + ↑加速br /
input type="button" id="downSpeed" value="减速" /点左边按钮或按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 /*引用的库函数*/
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b/*宏定义键名*/
#define N 200
int i,key;
int level;/*游戏等级*/
int score=0;/*得分*/
int gamespeed;/*游戏速度*/
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 Choicelevle(void);/*选择游戏等级*/
void Init(void);/*图形驱动*/
void Close(void);/*图形结束*/
void DRAW(void);/*游戏区域*/
void GameOver(void);/*结束游戏*/
void GamePlay(void);/*玩游戏具体过程*/
void PrScore(void);/*输出成绩*/
/*主函数*/
void main(void)
{
Init();/*图形驱动*/
Choicelevle();/*选择游戏等级*/
DRAW();/*游戏区域*/
GamePlay();/*玩游戏具体过程*/
Close();/*图形结束*/
}
/*图形驱动*/
void Init(void)
{
int gd=DETECT,gm;
initgraph(gd,gm,"\\turboc2"); /*初始化图形系统*/
cleardevice(); /*清除图形界面*/
}
/*选择游戏等级*/
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");/*制作人学号*/
outtextxy(300,380,"class:computer science 0602");/*制作人班级*/
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); /*设置字体颜色*/
settextstyle(0,0,2); /*设置字体类型*/
outtextxy(150,200,"level input error"); /*显示文本*/
getch();
level=1;
}
}
void DRAW(void)
{cleardevice(); /*清屏*/
setcolor(2);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/
rectangle(45,45,465,325);
}
/*玩游戏具体过程*/
void GamePlay(void)
{setcolor(5);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/
randomize();/*随机数发生器*/
food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/
snake.life=0;/*活着*/
snake.direction=1;/*方向往右*/
snake.x[0]=320;snake.y[0]=240;/*蛇头*/
snake.x[1]=330;snake.y[1]=240; /*蛇的第二节位置*/
snake.node=3;/*节数*/
PrScore();/*输出得分*/
while(1)/*可以重复玩游戏,压ESC键结束*/
{
while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/
{
if(food.yes==1)/*需要出现新食物*/
{
food.x=rand()%360+70;
food.y=rand()%250+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;i0;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;isnake.node;i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/
{
if(snake.x[i]==snake.x[0]snake.y[i]==snake.y[0])
{
GameOver();/*显示失败*/
snake.life=1; /*蛇死*/
break;
}
}
/*如果蛇头碰到墙壁,蛇头从对面墙出来*/
if(snake.x[0]50)
{snake.x[0]=450;/*如果蛇头越过左边界,则从右边界进入*/
snake.y[0]=snake.y[0];/*纵坐标不变*/
for(i=snake.node-1;i0;i--)
{snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1]; /*蛇的其他节数向前推进*/
}
{
setfillstyle(SOLID_FILL,0); /*设置填充模式和颜色,0表示黑色*/
bar(50,55,455,315);/*bar是表示填充的范围的函数*/
}
}
else
if(snake.x[0]450)
{snake.x[0]=50;/*如果蛇头越过右边界,则蛇头从左边界进入*/
snake.y[0]=snake.y[0];/*纵坐标不变*/
for(i=snake.node-1;i0;i--)
{snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1]; /*蛇的其他节数向前推进*/
}
{
setfillstyle(SOLID_FILL,0); /*设置填充模式和颜色,0表示黑色*/
bar(50,55,455,315);/*bar是表示填充的范围的函数*/
}
}
else
if(snake.y[0]60)
{snake.y[0]=320;/*如果蛇头越过上边界,则从下边界进入*/
snake.x[0]=snake.x[0];/*横坐标不变*/
for(i=snake.node-1;i0;i--)
{snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1]; /*蛇的其他节数向前推进*/
}
{
setfillstyle(SOLID_FILL,0); /*设置填充模式和颜色,0表示黑色*/
bar(50,55,455,315);/*bar是表示填充的范围的函数*/
}
}
else
if(snake.y[0]320)
{snake.y[0]=60;/*如果蛇头越过下边界,则从上边界进入*/
snake.x[0]=snake.x[0];/*横坐标不变*/
for(i=snake.node-1;i0;i--)
{snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1]; /*蛇的其他节数向前推进*/
}
{
setfillstyle(SOLID_FILL,0); /*设置填充模式和颜色,0表示黑色*/
bar(50,55,455,315);/*bar是表示填充的范围的函数*/
}
}
if(snake.life==1)/*如果蛇死就跳出内循环,重新开始*/
break;
if(snake.x[0]==food.xsnake.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; /*每吃掉一食物,得分累加10分*/
if(score%100==0)
{level++;gamespeed=100000-400*level-300*level*level;/*每吃掉10食物提升一级,速度加快*/
PrScore();/*输出新得分*/
setcolor(YELLOW); /*设置字体颜色*/
settextstyle(0,0,4); /*设置字体类型*/
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是表示填充的范围的函数*/
}
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)*/ /*用黑色去除蛇的的最后一节*/
if(snake.life==1)/*如果蛇死就跳出循环*/
break;
key=bioskey(0);/*接收按键*/
if(key==ESC)/*按ESC键退出*/
break;
else
if(key==UPsnake.direction!=4)
/*判断是否往相反的方向移动*/
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)*/
}
/*游戏结束*/
void GameOver(void)
{
cleardevice(); /*清屏*/
PrScore();
setcolor(RED); /*设置字体颜色*/
settextstyle(0,0,4); /*设置字体类型*/
outtextxy(200,200,"GAME OVER"); /*显示文本*/
getch();
}
/*输出成绩及游戏等级*/
void PrScore(void)
{
char str1[20];/*设置字符型数组*/
setfillstyle(SOLID_FILL,0);
bar(50,15,390,35); /*填充矩形框*/
setcolor(6); /*设置文本颜色*/
settextstyle(0,0,2); /*设置数组显示位置*/
sprintf(str1,"score %d level %d",score,level);/*显示数组内容*/
outtextxy(55,20,str1);
setcolor(YELLOW); /*设置字体颜色*/
settextstyle(0,0,2); /*设置字体类型*/
outtextxy(250,400,"EXIT=ESC ");/*显示文本*/
}
void Close(void)
{
closegraph();
}
没找到,只有C的~
*要求改进:用图形模式表示print()函数*/
#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;/*蛇头标志*/
int add=1;/*食物标志*/
int tii,tjj;/* 前蛇尾坐标 */
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()/*输出*/
{ /*要将转化成图形模式*/
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()/*测试是否到达边界*/
{
if(i0||iN-1||j0||jN-1)
{
printf("出界! Game over.");
exit(1);
}
}
void move()/*当前移动*/
{
switch(head)
{
case 0:up();break;
case 1:down();break;
case 2:left();break;
case 3:right();break;
/*default:printf("方向出错!\\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()/* 用于产生食物 */
{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;/*食物的标志是5*/chin a i t p oe er . co mugTTCrI
add=0;/* 加食物标志清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()/*吃到食物时*/
{
if(i==xj==y)
{
length++;chin a i t p oe er . co mugTTCrI
A[tii][tjj]=A[ii][jj]-1;/*蛇尾加长*/chin a i t p oe er . co mugTTCrI
ii=tii;jj=tjj;/*蛇尾重新定义*/
add=1;/*食物标志置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();/*定义分数界面*/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){/*判断得到的坐标是否合法*/
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
制作贪吃蛇程序一吃就死是因为代码输入错误,代码有漏洞,同学们可以用window_size设置蛇可以活动的区域大小。foods 是一个存储着所有食物位置信息的列表,每次蛇体移动后都会调用 check_eat_food 函数检查是不是吃到了某一个食物。
可以发现,检查是不是吃到和吃下去这两个动作我分为了两个函数,以做到每个函数一心一意方便后期修改。但是作为一只能照顾自己的贪吃蛇,同学们还需要能够判断当前自身状态。
贪吃蛇的程序组成思路
贪吃蛇这个游戏可以分为三大块:界面:负责显示相关的所有工作;游戏流程控制:判断游戏输赢、游戏初始化等;蛇和食物:移动自身、判断是否死亡、是否被吃等。
每一块都被做成了单独的对象,通过相互配合实现游戏。对于贪吃蛇游戏里面的蛇来讲,它可以做的事情有三种:移动,死亡(吃到自己,撞墙)和吃东西围绕着这三个功能,同学们可以首先写出一个简陋的蛇。