c写的贪吃蛇
程序代码:
#include <graphics.h> /*调用图象的函数的头文件*/ #include <stdlib.h> /*常用函数库*/ #include <time.h> #include <dos.h>/*DOS库*/ #define MAX_JOINTS 200 #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define ESC 0x011b #define MV_RIGHT 1 #define MV_LEFT 2 #define MV_UP 3 #define MV_DOWN 4 void InitGraph(void); /*图形驱动初始化函数*/ void DrawKFence(void); /*绘制游戏场景*/ void GameOver(int score); /*结束游戏*/ void GamePlay(void); /*玩游戏具体过程*/ void PrScore(int score); /*输出成绩*/ struct Food /*食物的结构体定义*/ { int x; /*食物的横坐标*/ int y; /*食物的纵坐标*/ int addFood; /*判断是否要出现食物的变量*/ }; struct Snake /*蛇的结构体定义*/ { int x[MAX_JOINTS]; /*保存蛇身每一节位于屏幕上的列坐标*/ int y[MAX_JOINTS]; /*保存蛇身每一节位于屏幕上的行坐标*/ int joint; /*蛇的节数*/ int direction; /*蛇移动方向*/ int life; /*蛇的生命,0活着,1死亡*/ }; /*主函数*/ void main(void) { InitGraph(); /*图形驱动*/ DrawKFence(); /*游戏场景*/ GamePlay(); /*玩游戏具体过程*/ Closegraph(); /*图形结束*/ } /*图形驱动初始化函数*/ void InitGraph(void) { int gd=DETECT,gm; initgraph(&gd,&gm," "); /*initgraph()中的第一个参数表示图形适配器的类型,第二个为在该类型下图形的显示模式,第三个参数指定驱动程序所在目录"c:\\tc"。*/ cleardevice(); /*清除图形屏幕*/ setbkcolor(BLUE); cleardecive(); setcolor(WHITE); settextstyle(DEFAULT_FONT,HORIZ_ZIR,3); outtextxy(170,150,"Greedy Snake"); outtextxy(219,254,"Ready?"); setcolor(BLUE); cleardecive(); } /*游戏开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/ void DrawKFence(void) { int i; setbkcolor(LIGHTGREEN); /*设置颜色*/ setbkcolor(11); setlinestyle(SOLID_LINE,0,THICK_WIDTH); /*设置线型*/SOLID_LINE/*为整数型,用来定义所画直线类型*/ 0/*为无符号整数型,该参数在需要用户自定义线型时使用 ,如果是使用系统预定义的线型则参数取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) { int i,key; int gamespeed=22000; /*控制游戏速度*/ int score=0; /*记录游戏得分*/ struct Food food; /*食物结构体变量*/ struce Snake snake; /*蛇结构体变量*/ food.addFood=1; /*1表示需要出现新食物,0表示已经存在食物*/ snake.life=0; /*置蛇的生命状态为活着*/ snake.direction=MV_RIGHT; /*置蛇头初始位置方向往右*/ snake.x[0]=100;snake.y[0]=100; snake.x[1]=110;snake.y[1]=100;/*先初始化了蛇头在X100,Y100的位置,然后蛇头在X方向向右移动了10个单位的位置*/ snake.joint=2; /*置蛇的初始节数为2*/ PrScore(score); /*显示游戏得分*/ /*重复玩游戏,直到压ESC键结束*/ srand(time(NULL)); while(1) { while(!kbhit()) /*在没有按键的情况下,蛇自己移动身体*/ /*检查当前按下的键*/ { if(food.addFood==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.addFood=0; /*画面上有食物了*/ } if(food.addFood==0) /*画面上有食物了就要显示*/ { setcolor(GREEN); rectangle(food.x,food.y,food.x+10,food.y-10); } for(i=snake.joint-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 MV_RIGHT:snake.x[0]+=10;break; case MV_LEFT: snake.x[0]-=10;break; case MV_UP: snake.y[0]-=10;break; case MV_DOWN: snake.y[0]+=10;break; } /*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/ for(i=3;i <snake.joint;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.joint]=-20;snake.y[snake.joint]=-20; snake.joint++; /*蛇的身体长一节*/ food.yes=1; /*画面上需要出现新的食物*/ score+=10; PrScore(score); /*输出新得分*/ } /*画出蛇*/ setcolor(4); for(i=0;i <snake.joint;i++) { rectangle(snake.x[i],snake.y[i],snake.x[i]+10, snake.y[i]-10); } delay(gamespeed); /*延时控制蛇的速度*/ /*用黑色去除蛇的的最后一节*/ setcolor(0); rectangle(snake.x[snake.joint-1],snake.y[snake.joint-1], snake.x[snake.joint-1]+10,snake.y[snake.joint-1]-10); } /*end of while(!kbhit)*/ if(snake.life==1) break; /*如果蛇死就跳出循环*/ key=bioskey(0); /*接收按键*/ /*判断按键,是否往相反方向移动,按ESC键退出*/ if(key==ESC) break; else if(key==UP&&snake.direction!=4) snake.direction=MV_UP; else if(key==RIGHT&&snake.direction!=MV_LEFT) snake.direction=MV_RIGHT; else if(key==LEFT&&snake.direction!=MV_RIGHT) snake.direction=MV_LEFT; else if(key==DOWN&&snake.direction!=MV_UP) snake.direction=MV_DOWN; } /*end of while(1)*/ } /*游戏结束*/ void GameOver(int score) { cleardevice(); PrScore(score); setcolor(RED); settextstyle(0,0,4); outtextxy(200,200,"GAME OVER"); getch(); } /*输出成绩*/ void PrScore(int score) { 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(); } 用tc运行后总说这两个语句参数太少,一个加参数后可以执行,但第二个无论加什么参数都运行不了!请高手前来赐教! /*游戏结束*/ void GameOver(int score)// <---这个函数是需要一个参数的,所以你标注的地方应当传一个合适的值 { cleardevice(); PrScore(score); setcolor(RED); settextstyle(0,0,4); outtextxy(200,200,"GAME OVER"); getch(); }