贪吃蛇程序设计报告python_贪吃蛇程序设计报告

展开全部

#include

#include

#include

#define LEFT 0x4b00

#define RIGHT 0x4d00

#define DOWN 0x5000

#define UP 0x4800

#define ESC 0x011b

int i,key;

int score=0;

int gamespeed=32000;

struct Food /*食物的结构体62616964757a686964616fe4b893e5b19e31333238656562*/

{

int x; /*食物的横坐标*/

int y; /*食物的纵坐标*/

int yes; /*食物是否出现的变量*/

}food;

struct Snack /*蛇的结构体*/

{

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 PrScore(void); /*分数输出函数*/

DELAY(char ch)/*调节游戏速度*/

{

if(ch=='3')

{

delay(gamespeed); /*delay是延迟函数*/

delay(gamespeed);

}

else if(ch=='2')

{

delay(gamespeed);

}

}

Menu()/*游戏开始菜单*/

{

char ch;

printf("Please choose the gamespeed:\n");

printf("1-Fast 2-Normal 3-Slow\n");

printf("\nPlease Press The numbers..\n");

do

{ch=getch();}

while(ch!='1'&&ch!='2'&&ch!='3');

clrscr();

return(ch);

}

/*主函数*/

void main(void)

{

int ch;

ch=Menu();

Init();

DrawK();

GamePlay(ch);

Close();

}

void Init(void)

{

int gd=DETECT,gm;

initgraph(&gd,&gm,"c:\\tc");

cleardevice();

}

void DrawK(void)

{

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(char ch)

{

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) /*可以重复游戏*/

{

while(!kbhit()) /*在没有按键的情况下蛇自己移动*/

{

if(food.yes==1) /*需要食物*/

{

food.x=rand()%400+60;

food.y=rand()%350+60; /*使用rand函数随机产生食物坐标*/

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]; /*贪吃蛇的身体移动算法*/

}

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

{

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

rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);

delay(gamespeed);

DELAY(ch);

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);

}

if(snake.life==1)

break;

key=bioskey(0); /*接受按键*/

if(key==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;

}

}

void GameOver(void)

{

cleardevice();

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,"scord:%d",score);

outtextxy(55,20,str);

}

void Close(void)

{

getch();

closegraph();

}

贪吃蛇

#include "graphics.h"

#include "stdio.h"

#define MAX 200

#define MAXX 30

#define MAXY 30

#define UP 18432

#define DOWN 20480

#define LEFT 19200

#define RIGHT 19712

#define ESC 283

#define ENTER 7181

#define PAGEUP 18688

#define PAGEDOWN 20736

#define KEY_U 5749

#define KEY_K 9579

#define CTRL_P 6512

#define TRUE 1

#define FALSE 0

#define GAMEINIT 1

#define GAMESTART 2

#define GAMEHAPPY 3

#define GAMEOVER 4

struct SPlace

{

int x;

int y;

int st;

} place[MAX];

int speed;

int count;

int score;

int control;

int head;

int tear;

int x,y;

int babyx,babyy;

int class;

int eat;

int game;

int gamedelay[]={5000,4000,3000,2000,1000,500,250,100};

int gamedelay2[]={1000,1};

static int hitme=TRUE,hit = TRUE;

void init(void);

void nextstatus(void);

void draw(void);

void init(void)

{

int i;

for(i=0;i

{

place[i].x = 0;

place[i].y = 0;

place[i].st = FALSE;

}

place[0].st = TRUE;

place[1].st = TRUE;

place[1].x = 1;

speed = 9;

count = 0;

score = 0;

control = 4;

head = 1;

tear = 0;

x = 1;

y = 0;

babyx = rand()%MAXX;

babyy = rand()%MAXY;

eat = FALSE;

game = GAMESTART;

}

void nextstatus(void)

{

int i;

int exit;

int xx,yy;

xx = x;

yy = y;

switch(control)

{

case 1: y--; yy = y-1; break;

case 2: y++; yy = y+1; break;

case 3: x--; xx = x-1; break;

case 4: x++; xx = x+1; break;

}

hit = TRUE;

if ( ((control == 1) || (control ==2 )) && ( (y < 1) ||(y >= MAXY-1)) ||

(((control == 3) || (control == 4)) && ((x < 1) ||(x >= MAXX-1) ) ) )

{

hit = FALSE;

}

if ( (y < 0) ||(y >= MAXY) ||

(x < 0) ||(x >= MAXX) )

{

game = GAMEOVER;

control = 0;

return;

}

for (i = 0; i < MAX; i++)

{

if ((place[i].st) &&

(x == place[i].x) &&

(y == place[i].y) )

{

game = GAMEOVER;

control = 0;

return;

}

if ((place[i].st) &&

(xx == place[i].x) &&

(yy == place[i].y) )

{

hit = FALSE;

goto OUT;

}

}

OUT:

if ( (x == babyx) && (y == babyy) )

{

eat = TRUE;

count ++;

score += (1+class) * 10;

}

head ++;

if (head >= MAX) head = 0;

place[head].x = x;

place[head].y = y;

place[head].st= TRUE;

if (eat == FALSE)

{

place[tear].st = FALSE;

tear ++;

if (tear >= MAX) tear = 0;

}

else

{

eat = FALSE;

exit = TRUE;

while(exit)

{

babyx = rand()%MAXX;

babyy = rand()%MAXY;

exit = FALSE;

for( i = 0; i< MAX; i++ )

if( (place[i].st)&&( place[i].x == babyx) && (place[i].y == babyy))

exit ++;

}

}

if (head == tear) game = GAMEHAPPY;

}

void draw(void)

{

char temp[50];

int i,j;

for (i = 0; i < MAX; i++ )

{

setfillstyle(1,9);

if (place[i].st)

bar(place[i].x*15+1,place[i].y*10+1,place[i].x*15+14,place[i].y*10+9);

}

setfillstyle(1,4);

bar(babyx*15+1,babyy*10+1,babyx*15+14,babyy*10+9);

setcolor(8);

setfillstyle(1,8);

bar(place[head].x*15+1,place[head].y*10+1,place[head].x*15+14,place[head].y*10+9);

/* for( i = 0; i <= MAXX; i++ )

line( i*15,0, i*15, 10*MAXY);

for( j = 0; j <= MAXY; j++ )

line( 0, j*10, 15*MAXX, j*10);

*/

rectangle(0,0,15*MAXX,10*MAXY);

sprintf(temp,"Count: %d",count);

settextstyle(1,0,2);

setcolor(8);

outtextxy(512,142,temp);

setcolor(11);

outtextxy(510,140,temp);

sprintf(temp,"1P: %d",score);

settextstyle(1,0,2);

setcolor(8);

outtextxy(512,102,temp);

setcolor(12);

outtextxy(510,100,temp);

sprintf(temp,"Class: %d",class);

setcolor(8);

outtextxy(512,182,temp);

setcolor(11);

outtextxy(510,180,temp);

}

main()

{

int pause = 0;

char temp[50];

int d,m;

int key;

int p;

static int keydown = FALSE;

int exit = FALSE;

int stchange = 0;

d = VGA;

m = VGAMED;

initgraph( &d, &m, "" );

setbkcolor(3);

class = 3;

init();

p = 1;

while(!exit)

{

if (kbhit())

{

key = bioskey(0);

switch(key)

{

case UP: if( (control != 2)&& !keydown)

control = 1;

keydown = TRUE;

break;

case DOWN: if( (control != 1)&& !keydown)

control = 2;

keydown = TRUE;

break;

case LEFT: if( (control != 4)&& !keydown)

control = 3;

keydown = TRUE;

break;

case RIGHT: if( (control != 3)&& !keydown)

control = 4;

keydown = TRUE;

break;

case ESC: exit = TRUE;break;

case ENTER: init();break;

case PAGEUP: class --; if (class<0) class = 0; break;

case PAGEDOWN: class ++;if (class>7) class = 7; break;

case KEY_U: if( ( (control ==1) ||(control ==2))&& !keydown)

control = 3;

else if(( (control == 3) || (control == 4))&& !keydown)

control = 1;

keydown = TRUE;

break;

case KEY_K: if( ( (control ==1) ||(control ==2))&& !keydown)

control = 4;

else if(( (control == 3) || (control == 4))&& !keydown)

control = 2;

keydown = TRUE;

break;

case CTRL_P:pause = 1 - pause; break;

}

}

stchange ++ ;

putpixel(0,0,0);

if (stchange > gamedelay[class] + gamedelay2[hit])

{

stchange = 0;

keydown = FALSE;

p = 1 - p;

setactivepage(p);

cleardevice();

if (!pause)

nextstatus();

else

{

settextstyle(1,0,4);

setcolor(12);

outtextxy(250,100,"PAUSE");

}

draw();

if(game==GAMEOVER)

{

settextstyle(0,0,6);

setcolor(8);

outtextxy(101,101,"GAME OVER");

setcolor(15);

outtextxy(99,99,"GAME OVER");

setcolor(12);

outtextxy(100,100,"GAME OVER");

sprintf(temp,"Last Count: %d",count);

settextstyle(0,0,2);

outtextxy(200,200,temp);

}

if(game==GAMEHAPPY)

{

settextstyle(0,0,6);

setcolor(12);

outtextxy(100,300,"YOU WIN");

sprintf(temp,"Last Count: %d",count);

settextstyle(0,0,2);

outtextxy(200,200,temp);

}

setvisualpage(p);

}

}

closegraph();

}

具体的编译和界面还是要靠你。

本回答被提问者采纳

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

你可能感兴趣的:(贪吃蛇程序设计报告python)