DOS贪吃蛇程序设计思路及代码
超简单贪吃蛇c语言代码编写
超简单贪吃蛇c语言代码编写贪吃蛇其实就是实现以下几步——1:蛇的运动(通过“画头擦尾”来达到蛇移动的视觉效果)2:生成食物3:蛇吃食物(实现“画头不擦尾”)4:游戏结束判断(也就是蛇除了食物,其余东西都不能碰)#include<stdio.h>#include<stdlib.h>#include<windows.h>#include<conio.h>#include<time.h>#define width 60#define hight 25#define SNAKESIZE 200//蛇身的最长长度int key=72;//初始化蛇的运动方向,向上int changeflag=1;//用来标识是否生成食物,1表示蛇还没吃到食物,0表示吃到食物int speed=0;//时间延迟struct {int len;//用来记录蛇身每个方块的坐标int x[SNAKESIZE];int y[SNAKESIZE];int speed;}snake;struct{int x;int y;}food;void gotoxy(int x,int y)//调用Windows的API函数,可以在控制台的指定位置直接操作,这里可暂时不用深究{COORD coord;coord.X = x;coord.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); }//■○void drawmap(){//打印图框for (int _y = 0; _y < hight; _y++){for (int x = 0; x < width; x+=2){if (x == 0 || _y == 0 || _y == hight - 1 || x == width - 2){gotoxy(x, _y);printf("■");}}}//打印蛇头snake.len=3;snake.x[0]=width/2;snake.y[0]=hight/2;gotoxy(snake.x[0],snake.y[0]);printf("■");//打印蛇身for(int i=1;i<snake.len;i++){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1]+1;gotoxy(snake.x[i],snake.y[i]);printf("■");}//初始化食物的位置food.x=20;food.y=20;gotoxy(food.x,food.y);printf("○");}/**控制台按键所代表的数字*“↑”:72*“↓”:80*“←”:75*“→”:77*/void snake_move()//按键处理函数{int history_key=key;if (_kbhit()){fflush(stdin);key = _getch();key = _getch();}if(changeflag==1)//还没吃到食物,把尾巴擦掉{gotoxy(snake.x[snake.len-1],snake.y[snake.len-1]);printf(" ");}for(int i=snake.len-1;i>0;i--){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];}if(history_key==72&&key==80)key=72;if(history_key==80&&key==72)key=80;if(history_key==75&&key==77)key=75;if(history_key==77&&key==75)key=77;switch(key){case 72:snake.y[0]--;break;case 75:snake.x[0]-= 2;break;case 77:snake.x[0]+= 2;break;case 80:snake.y[0]++;break;}gotoxy(snake.x[0],snake.y[0]);printf("■");gotoxy(0,0);changeflag=1;}void creatfood(){if(snake.x[0] == food.x && snake.y[0] == food.y)//只有蛇吃到食物,才能生成新食物{changeflag=0;snake.len++;if(speed<=100)speed+=10;while(1){srand((unsigned int) time(NULL));food.x=rand()%(width-6)+2;//限定食物的x范围不超出围墙,但不能保证food.x 为偶数food.y=rand()%(hight-2)+1;for(int i=0;i<snake.len;i++){if(food.x==snake.x[i]&&food.y==snake.y[i])//如果产生的食物与蛇身重合则退出break;}if(food.x%2==0)break;//符合要求,退出循环}gotoxy(food.x,food.y);printf("○");}}bool Gameover(){//碰到围墙,OVERif(snake.x[0]==0||snake.x[0]==width-2)return false;if(snake.y[0]==0||snake.y[0]==hight-1) return false;//蛇身达到最长,被迫OVERif(snake.len==SNAKESIZE)return false;//头碰到蛇身,OVERfor(int i=1;i<snake.len;i++){if(snake.x[0]==snake.x[i]&&snake.y[0]==snake.y[i])return false;}return true;}int main(){system("mode con cols=60 lines=27");drawmap();while(Gameover()){snake_move();creatfood();Sleep(350-speed);//蛇的移动速度}return 0;}。
贪吃蛇游戏程序的设计说明
测控技术与仪器专业课程设计题单班级0982011 学生某某课程名称计算机课程设计课题贪吃蛇游戏程序设计设计要求 1.学习游戏设计有关知识。
2.设计贪吃蛇游戏程序。
3.调试并修改程序。
4.完成课程设计论文。
课题发给日期2011年6月25日课程设计完成日期2011年7月09日指导教师余某某评语:贪吃蛇游戏学生:某某班级:0882011指导老师:余某某摘要:编写C语言程序实现贪吃蛇游戏,贪吃蛇游戏是一个深受人们喜爱的游戏,一条蛇在密闭的围墙,在围墙随机出现一个食物,通过按键盘上的四个光标键控制蛇向上下左右四个方向移动,蛇头撞到食物,则表示食物被蛇吃掉,这时蛇的身体长一节,同时计10分,接着又出现食物,等待被蛇吃掉,如果蛇在移动过程中,撞到墙壁或身体交叉蛇头撞到自己的身体游戏结束。
作为一个完整的程序,必须考虑人机交流与用户体验。
游戏的界面不能太丑,更不能连个简单的界面都没有。
游戏应该有个比较漂亮的界面,在有必要硬件支持和软件的支持下,游戏开发者必须最大限度的使游戏美观。
游戏的美观是一方面,游戏的在素质是另一方面。
一个游戏的优劣,最终由玩家决定。
在游戏与玩家见面之前,游戏开发者要设计一种让玩家投入的游戏模式,并且在一定的游戏规则下进行。
关键词:贪吃蛇流程图c语言源程序目录1 前言 (1)2 课设容 (3)2.1课设目的 (3)2.2设计功能 (3)2.3结构设计 (7)3结论 (11)参考文献 (15)附录A (16)1 前言C语言是一种易学易懂的通用程序设计语言,由于它具有功能性强,运用简洁,灵活兼有高级语言与低级语言的优点,以及“目标程序效率高”可移植性和能在各种系统上普遍实现等特点使它成为当今世界上的主流程序设计语言之一,同时被选作目前全世界广泛应用,同时也是大学生必修的科目。
作为一位当代的大学生更要很好的利用它,学好一门设计语言,实现学以至用。
制作C程序报告,可以巩固和加深自己对C语言课程的基本知识的理解和掌握,并且能够掌握C语言编程和程序调试的基本技能。
DOS下模拟 贪吃蛇游戏
/*DOS下模拟贪吃蛇游戏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━符号常数数值含义符号常数数值含义———————————————————————————————————BLACK 0 黑色DARKGRAY8 深灰BLUE 1 兰色LIGHTBLUE 9 深兰GREEN 2 绿色LIGHTGREEN 10 淡绿CY AN 3 青色LIGHTCY AN 11 淡青RED 4 红色LIGHTRED 12 淡红MAGENTA 5 洋红LIGHTMAGENTA13 淡洋红BROWN 6 棕色YELLOW 14 黄色LIGHTGRAY7 淡灰WHITE 15 白色━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━*/#include <graphics.h>#include <stdlib.h>#include <bios.h>#include <time.h>#include "dos.h"/*定义几个游戏中要用到的功能按键*/#define ESC 0x11b /*强行退出游戏*/#define UP 0x4800 /*上下左右四个按键移动光标*/#define DOWN 0x5000#define LEFT 0x4b00#define RIGHT 0x4d00#define SPACE 0x3920 /* */#define ENTER 0x1c0d /* */int a[20][10]={0}; /* 存放she的数组*/int aa=0;char num[]={'0','1','2','3','4','5','6','7','8','9'}; /*用于在图形模式下输出数字*/char sc[10];char gd[10];int y=0,x=3;int d=1;int n,nnext;int xx=150,yy=40;int b[20][4][4]={{{1,1,1,1}}, /* 横条形状*/{{1}, /* 竖条形状*/{1},{1},{1}},{{2,2}, /* 方块形状*/{2,2},},{{3,3,3}, /* 镰刀形状*/{3}},{{3,3},{0,3},{0,3},},{{0,0,3},{3,3,3}},{{3},{3},{3,3}},{{4,4,4}, /* 反镰刀形状*/{0,0,4}},{{0,4},{0,4},{4,4},},{{4},{4,4,4}},{{4,4},{4},{4}},{{5,5,5},{0,5}},{{0,5},{5,5},{0,5},},{{0,5,0},{5,5,5}},{{5},{5,5},{5}},{{6,6},{0,6,6}},{{0,6},{6,6},{6}},{{0,7,7},{7,7}},{{7},{7,7},{0,7}}}; /* 存放不同形状(颜色)方块的数组*/long int score=0; /*积分*/int grade=1;/*等级*/main(){int k;int gdriver = DETECT, gmode;registerbgidriver(gdriver);initgraph(&gdriver, &gmode, "c:\\turboc2");redraw();srand(time(NULL));n=random(19);nnext=random(19);while(1) /* 反复从键盘获得程序需要的按键*/{run();if(y%5==0) redraw();if(bioskey(1)) /* 判断是否有按键*/{k=bioskey(0); /* 将按键存入变量k */switch(k) /* 对按键进行分情况处理*/{case ESC: /* ESC键退出*/exit(0); break;case LEFT: /* ESC键退出*/x--;outleft(); break;case RIGHT: /* ESC键退出*/x++;outright(); break;case DOWN: /* ESC键退出*/aa=1; break;case SPACE: /* ESC键退出*/rotate(); break;}}showscore();}closegraph();}outleft(){int i,j;for(i=0;i<4;i++)for(j=0;j<4;j++)if((b[n][i][j] && a[i+y/5][j+x]))x++;if(x<0) x++;}outright(){int i,j;for(i=0;i<4;i++)for(j=0;j<4;j++)if(b[n][i][j] && x+j>9) x--;for(i=0;i<4;i++)for(j=0;j<4;j++)if((b[n][i][j] && a[i+y/5][j+x]))x--;}run(){int i;for(i=0;i<=165-grade*10;i++)delay(aa?5:200);y++;aa=0;ground();}ground(){int i,j,k=0;for(i=0;i<4;i++)for(j=0;j<4;j++)if((b[n][i][j] && a[i+y/5][j+x]) || (y/5+i>19 && b[n][i][j])){y-=10;count();x=3,y=0;return(0);}}count(){int i,j,m,h=0,k[20]={0};for(i=0;i<4;i++)for(j=0;j<4;j++)if(b[n][i][j])a[i+y/5+1][j+x]=b[n][i][j];for(i=0;i<20;i++){ for(j=0;j<10;j++)if(a[i][j])k[i]++;h+=(k[i]/10);}switch(h){case 4: score+=1500;break;case 3: score+=700; break;case 2: score+=300; break;case 1: score+=100; break;}for(m=0;m<20;m++)if(k[m]/10)for(i=m-1;i>=0;i--)for(j=0;j<10;j++)a[i+1][j]=a[i][j];randnext();}/*redraw重画函数在用户有操作或者时间到达后,重画游戏画面*/redraw(){int dd=20,i,j;cleardevice();setbkcolor(BLUE);setcolor(5);/* settextstyle(SANS_SERIF_FONT,HORIZ_DIR,4);outtextxy(170,30,"RUSIA ");settextstyle(SANS_SERIF_FONT,HORIZ_DIR,2);outtextxy(220,70,"By Jack");*/setfillstyle(1,8);bar(xx,yy,xx+dd*10,yy+dd*20);bar(xx+dd*11,yy,xx+dd*15,yy+dd*4);for(i=0;i<20;i++)for(j=0;j<10;j++)if(a[i][j])xiaofangkuai(xx+j*dd,yy+i*dd,dd,a[i][j]);for(i=0;i<4;i++)for(j=0;j<4;j++)if(b[n][i][j])xiaofangkuai(xx+(j+x)*dd,yy+(i+y/5)*dd,dd,b[n][i][j]);for(i=0;i<4;i++)for(j=0;j<4;j++)if(b[nnext][i][j])xiaofangkuai(xx+(j+11)*dd,yy+i*dd,dd,b[nnext][i][j]);}rotate(){switch(n){ case 0 : n=1; break;case 1 : n=0; break;case 2 : break;case 3 : n=4; break;case 4 : n=5; break;case 5 : n=6; break;case 6 : n=3; break;case 7 : n=8; break;case 8 : n=9; break;case 9 : n=10; break;case 10: n=7; break;case 11: n=12; break;case 12: n=13; break;case 13: n=14; break;case 14: n=11; break;case 15: n=16; break;case 16: n=15; break;case 17: n=18; break;case 18: n=17; break;}}randnext(){n=nnext;nnext=random(19);}xiaofangkuai(int x,int y,int d,int color){setcolor(15);setfillstyle(1,color);bar(x,y,x+d,y+d);rectangle(x,y,x+d,y+d);}showscore(){long int s,i,k=0,t;settextstyle(SMALL_FONT,HORIZ_DIR,7);outtextxy(500,100,"SCORE:");s=score;do{t=s%10;s=s/10;for(i=k-1;i>=0;i--)sc[i+1]=sc[i];k++;sc[0]=t+48;}while(s);outtextxy(500,150,sc);outtextxy(500,200,"GRADE:");k=0;s=grade;do{t=s%10;s=s/10;for(i=k-1;i>=0;i--)gd[i+1]=gd[i];k++;gd[0]=t+48;}while(s);outtextxy(500,250,gd);}over(){int i,j,x,y;for(i=0;i<n;i++){for(j=0;j<n;j++)if(i!=j)if(a[i][0]==a[j][0] && a[i][1]==a[j][1])showover();if(a[i][0]*a[i][1]<0 || a[i][0]>30 ||a[i][1]>30)showover();}}showover(){int dd=10,i,j;cleardevice();setbkcolor(BLUE);setcolor(15);setfillstyle(1,8);bar(100,100,100+dd*30,100+dd*30);for(i=0;i<16;i++){setbkcolor((i+1)%16);settextstyle(SANS_SERIF_FONT,HORIZ_DIR,4);outtextxy(170,50,"GAME OVER!!");setcolor((i+6)%16);setfillstyle(1,(i+12)%16);for(j=0;j<=60;j+=5){pieslice(100+30*dd/2,100+30*dd/2,60-j,300+j,i*dd);}showscore();}getch();exit(0);}。
贪吃蛇代码
#include<stdio.h>#include<conio.h>#include<time.h>#include<windows.h>int length=1;//蛇的当前长度,初始值为1int line[100][2];//蛇的走的路线int head[2]={40,12};//蛇头int food[2];//食物的位置char direction;//蛇运动方向int x_min=1,x_max=77,y_min=2,y_max=23;//设置蛇的运动区域int tail_before[2]={40,12};//上一个状态的蛇尾char direction_before='s';//上一个状态蛇的运动方向int live_death=1;//死活状态,0死,1活int eat_flag=0;//吃食物与否的状态。
0没吃1吃了int max=0;int delay;//移动延迟时间void gotoxy(int x, int y)//x为列坐标,y为行坐标{COORD pos = {x,y};HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hOut, pos);}void hidden()//隐藏光标{HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_CURSOR_INFO cci;GetConsoleCursorInfo(hOut,&cci);cci.bVisible=0;//赋1为显示,赋0为隐藏SetConsoleCursorInfo(hOut,&cci);}void update_score()//更新分数{gotoxy(2,1);printf("我的分数:%d",length);gotoxy(42,1);printf("最高记录:%d",max);}void create_window(){gotoxy(0,0);printf("╔══════════════════╦═══════════════════╗");prin tf("║ ║ ║");printf("╠══════════════════╩═══════════════════╣");printf("║║");printf("║║");printf("║║");printf("║║");printf("║║");printf("║║");printf("║║");printf("║║");printf("║║");printf("║║");printf("║║");printf("║║");printf("║║");printf("║║");printf("║║");printf("║║");printf("║║");printf("║║");printf("║║");printf("║║");printf("╚══════════════════════════════════════╝");}void update_line()//更新蛇的线路{int i;if(eat_flag==0)//吃了食物就不用记住上一个状态的蛇尾,否则会被消掉{tail_before[0]=line[0][0];//记住上一个状态的蛇尾tail_before[1]=line[0][1];for(i=0;i<length-1;i++)//更新蛇头以后部分{line[i][0]=line[i+1][0];line[i][1]=line[i+1][1];}line[length-1][0]=head[0];//更新蛇头line[length-1][1]=head[1];}}void initial()//初始化{FILE *fp;gotoxy(head[0],head[1]);printf("蛇");line[0][0]=head[0];//把蛇头装入路线line[0][1]=head[1];if((fp=fopen("highest","r"))==NULL){fp=fopen("highest","w");fprintf(fp,"%d",0);max=0;fclose(fp);}//第一次使用时,初始化奖最高分为0else{fp=fopen("highest","r");fscanf(fp,"%d",&max);}update_score();}void createfood()//产生食物{int flag,i;srand((unsigned)time(NULL));for(;;){for(;;){food[0]=rand()%(x_max+1);if(food[0]%2==0 && food[0]>x_min)break;}//产生一个偶数横坐标for(;;){food[1]=rand()%(y_max);if(food[1]>y_min)break;}for(i=0,flag=0;i<length;i++)//判断产生的食物是否在蛇身上,在flag=1,否则为0 if(food[0]==line[i][0] && food[1]==line[i][1]){ flag=1; break; }if(flag==0)// 食物不在蛇身上结束循环break;}gotoxy(food[0],food[1]);printf("蛇");}void show_snake(){gotoxy(head[0],head[1]);printf("蛇");if(eat_flag==0)//没吃食物时消去蛇尾{gotoxy(tail_before[0],tail_before[1]);printf(" ");//消除蛇尾}elseeat_flag=0;//吃了食物就回到没吃状态}char different_direction(char dir)//方向{switch(dir){case 'a': return 'd';case 'd': return 'a';case 'w': return 's';case 's': return 'w';}}void get_direction(){direction_before=direction;//记住蛇上一个状态的运动方向while(kbhit()!=0) //调试direction=getch();if( direction_before == different_direction(direction) || (direction!='a' && direction!='s' && direction!='d' && direction!='w') ) //新方向和原方向相反,或获得的方向不是wasd时,保持原方向direction=direction_before;switch(direction){case 'a': head[0]-=2; break;case 'd': head[0]+=2; break;case 'w': head[1]--; break;case 's': head[1]++; break;}}void live_state()//判断蛇的生存状态{FILE *fp;int i,flag;for(i=0,flag=0;i<length-1;i++)//判断是否自己咬到自己if( head[0]==line[i][0] && head[1]==line[i][1]){flag=1;break;}if(head[0]<=x_min || head[0]>=x_max || head[1]<=y_min || head[1]>=y_max || flag==1) {system("cls");//游戏结束create_window();update_score();gotoxy(35,12);printf("游戏结束!\n");Sleep(500);live_death=0;fp=fopen("highest","w");fprintf(fp,"%d",max);//保存最高分}}void eat(){if(head[0]==food[0]&&head[1]==food[1]){length++;line[length-1][0]=head[0];//更新蛇头line[length-1][1]=head[1];eat_flag=1;createfood();if(length>max)max=length;update_score();//if(delay>100)delay-=30;//加速}}main(){int x=0,y=0;int i;hidden();//隐藏光标create_window();initial();createfood();for(direction='s',delay=600;;){get_direction();//得到键盘控制方向eat();//吃食物update_line();//更新路线live_state();//判断生死状态if(live_death==1){show_snake();}elsebreak;Sleep(delay);//暂停}}。
基于C语言实现的贪吃蛇游戏完整实例代码
基于C语⾔实现的贪吃蛇游戏完整实例代码本⽂以实例的形式讲述了基于C语⾔实现的贪吃蛇游戏代码,这是⼀个⽐较常见的游戏,代码备有⽐较详细的注释,对于读者理解有⼀定的帮助。
贪吃蛇完整实现代码如下:#include <graphics.h>#include <conio.h>#include <stdlib.h>#include <dos.h>#define NULL 0#define UP 18432#define DOWN 20480#define LEFT 19200#define RIGHT 19712#define ESC 283#define ENTER 7181struct snake{int centerx;int centery;int newx;int newy;struct snake *next;};struct snake *head;int grade=60; /*控制速度的*******/int a,b; /* 背静遮的位置*/void *far1,*far2,*far3,*far4; /* 蛇⾝指针背静遮的指针⾍⼦*/int size1,size2,size3,size4; /* **全局变量**/int ch=RIGHT; /**************存按键开始蛇的⽅向为RIGHT***********/int chy=RIGHT;int flag=0; /*********判断是否退出游戏**************/int control=4; /***********判断上次⽅向和下次⽅向不冲突***/int nextshow=1; /*******控制下次蛇⾝是否显⽰***************/int scenterx; /***************随即矩形中⼼坐标***************/int scentery;int sx; /*******在a b 未改变前得到他们的值保证随机矩形也不在此出现*******/int sy;/************************蛇⾝初始化**************************/void snakede(){struct snake *p1,*p2;head=p1=p2=(struct snake *)malloc(sizeof(struct snake));p1->centerx=80;p1->newx=80;p1->centery=58;p1->newy=58;p1=(struct snake *)malloc(sizeof(struct snake));p2->next=p1;p1->centerx=58;p1->newx=58;p1->centery=58;p1->newy=58;p1->next=NULL;}/*******************end*******************/void welcome() /*************游戏开始界⾯ ,可以选择 速度**********/{int key;int size;int x=240;int y=300;int f;void *buf;setfillstyle(SOLID_FILL,BLUE);bar(98,100,112,125);setfillstyle(SOLID_FILL,RED);buf=malloc(size);getimage(98,100,112,125,buf);cleardevice();setfillstyle(SOLID_FILL,BLUE);bar(240,300,390,325);outtextxy(193,310,"speed:");setfillstyle(SOLID_FILL,RED);bar(240,312,390,314);setcolor(YELLOW);outtextxy(240,330,"DOWN");outtextxy(390,330,"UP");outtextxy(240,360,"ENTER to start..." );outtextxy(270,200,"SNAKE");fei(220,220);feiyang(280,220);yang(340,220);putimage(x,y,buf,COPY_PUT);setcolor(RED);rectangle(170,190,410,410);while(1){ if(bioskey(1)) /********8选择速度部分************/key=bioskey(0);switch(key){case ENTER:f=1;break;case DOWN:if(x>=240){ putimage(x-=2,y,buf,COPY_PUT);grade++;key=0;break;}case UP:if(x<=375){ putimage(x+=2,y,buf,COPY_PUT);grade--;key=0;break;}}if (f==1)break;} /********** end ****************/free(buf);}/*************************随即矩形*****************//***********当nextshow 为1的时候才调⽤此函数**********/void ran(){ int nx;int ny;int show; /**********控制是否显⽰***********/int jump=0;struct snake *p;p=head;if(nextshow==1) /***********是否开始随机产⽣***************/while(1){show=1;randomize();nx=random(14);ny=random(14);scenterx=nx*22+58;scentery=ny*22+58;while(p!=NULL){if(scenterx==p->centerx&&scentery==p->centery||scenterx==sx&&scentery==sy)}elsep=p->next;if(jump==1)break;}if(show==1){putimage(scenterx-11,scentery-11,far3,COPY_PUT); nextshow=0;break;}}}/***********过关动画**************/void donghua(){ int i;cleardevice();setbkcolor(BLACK);randomize();while(1){for(i=0;i<=5;i++){putpixel(random(640),random(80),13);putpixel(random(640),random(80)+80,2);putpixel(random(640),random(80)+160,3);putpixel(random(640),random(80)+240,4);putpixel(random(640),random(80)+320,1);putpixel(random(640),random(80)+400,14);}setcolor(YELLOW);settextstyle(0,0,4);outtextxy(130,200,"Wonderful!!");setfillstyle(SOLID_FILL,10);bar(240,398,375,420);feiyang(300,400);fei(250,400);yang(350,400);if(bioskey(1))if(bioskey(0)==ESC){flag=1;break;}}}/*************************end************************//***********************初始化图形系统*********************/ void init(){int a=DETECT,b;int i,j;initgraph(&a,&b,"");}/***************************end****************************//***画⽴体边框效果函数******/void tline(int x1,int y1,int x2,int y2,int white,int black) { setcolor(white);line(x1,y1,x2,y1);line(x1,y1,x1,y2);setcolor(black);line(x2,y1,x2,y2);line(x1,y2,x2,y2);}/****end*********//*************飞洋标志**********/int feiyang(int x,int y){int feiyang[18][18]={ {0,0,0,0,0,0,1,1,1,1,1,1,0,1,1,0,0,0}, {0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,0,0,0},{0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0},{0,0,1,1,0,1,1,1,1,1,1,0,0,0,0,0,0,0},{0,0,1,1,1,1,1,0,0,1,0,0,1,1,0,0,0,0},{0,0,1,1,1,0,0,0,0,1,0,1,1,1,0,0,0,0},{0,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0},{0,0,1,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0},{0,0,1,1,0,0,0,1,1,0,0,1,1,0,0,1,0,0},{0,0,1,1,1,0,0,1,1,0,0,1,1,0,0,1,0,0},{0,0,1,1,1,1,0,1,1,1,1,1,1,0,1,1,0,0},{0,0,0,1,1,1,0,1,1,1,1,1,0,0,1,0,0,0},{0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0},{0,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0},{0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0}};int i,j;for(i=0;i<=17;i++)for(j=0;j<=17;j++){if (feiyang[i][j]==1)putpixel(j+x,i+y,RED);}}/********"飞"字*************/int fei(int x,int y){int fei[18][18]={{1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0},{0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0},{0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0},{0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0},{0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,0,0},{0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0},{0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0},{0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1},{0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1},{0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0}};int i,j;for(i=0;i<=17;i++)for(j=0;j<=17;j++){if (fei[i][j]==1)putpixel(j+x,i+y,BLUE);}}/*********"洋"字**************/int yang(int x,int y){int yang[18][18]={{0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, {1,1,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0},{0,1,1,1,0,0,0,1,1,1,0,1,1,0,0,0,0,0},{0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,1,0,0},{0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0},{0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0},{1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},{0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0},{0,0,1,1,0,0,0,1,1,1,1,1,1,1,1,0,0,0},{0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0},{0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0},{0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,1,1,0},{0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1},{0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0},{1,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0},{0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0},{0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},{0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}};int i,j;for(i=0;i<=17;i++)for(j=0;j<=17;j++)}/******************主场景**********************/int bort(){ int a;setfillstyle(SOLID_FILL,15);bar(49,49,71,71);setfillstyle(SOLID_FILL,BLUE);bar(50,50,70,70);size1=imagesize(49,49,71,71);far1=(void *)malloc(size1);getimage(49,49,71,71,far1);cleardevice();setfillstyle(SOLID_FILL,12);bar(49,49,71,71);size2=imagesize(49,49,71,71);far2=(void *)malloc(size2);getimage(49,49,71,71,far2);setfillstyle(SOLID_FILL,12);bar(49,49,71,71);setfillstyle(SOLID_FILL,GREEN);bar(50,50,70,70);size3=imagesize(49,49,71,71);far3=(void *)malloc(size3);getimage(49,49,71,71,far3);cleardevice(); /*取蛇⾝节点背景节点⾍⼦节点end*/setbkcolor(8);setfillstyle(SOLID_FILL,GREEN);bar(21,23,600,450);tline(21,23,600,450,15,8); /***开始游戏场景边框⽴体效果*******/ tline(23,25,598,448,15,8);tline(45,45,379,379,8,15);tline(43,43,381,381,8,15);tline(390,43,580,430,8,15);tline(392,45,578,428,8,15);tline(412,65,462,85,15,8);tline(410,63,464,87,15,8);tline(410,92,555,390,15,8);tline(412,94,553,388,15,8);tline(431,397,540,420,15,8);tline(429,395,542,422,15,8);tline(46,386,377,428,8,15);tline(44,384,379,430,8,15);setcolor(8);outtextxy(429,109,"press ENTER ");outtextxy(429,129,"---to start"); /*键盘控制说明*/outtextxy(429,169,"press ESC ");outtextxy(429,189,"---to quiet");outtextxy(469,249,"UP");outtextxy(429,289,"LEFT");outtextxy(465,329,"DOWN");outtextxy(509,289,"RIGHT");setcolor(15);outtextxy(425,105,"press ENTER ");outtextxy(425,125,"---to start");outtextxy(425,165,"press ESC ");outtextxy(425,185,"---to quiet");outtextxy(465,245,"UP");outtextxy(425,285,"LEFT");outtextxy(461,325,"DOWN");outtextxy(505,285,"RIGHT"); /*******end*************/setcolor(8);outtextxy(411,52,"score");outtextxy(514,52,"left");setcolor(15);outtextxy(407,48,"score");outtextxy(510,48,"left");size4=imagesize(409,62,465,88); /****分数框放到内存********/far4=(void *)malloc(size4);getimage(409,62,465,88,far4);outtextxy(415,70,"0"); /***************输⼊分数为零**********/outtextxy(512,70,"20"); /*************显⽰还要吃的⾍⼦的数⽬*********/ bar(46,46,378,378);feiyang(475,400);fei(450,400);yang(500,400);outtextxy(58,390,"mailto:************************");outtextxy(58,410,"snake game");outtextxy(200,410,"made by yefeng");while(1){ if(bioskey(1))a=bioskey(0);if(a==ENTER)break;}}/******************gameover()******************/void gameover(){ char *p="GAME OVER";int cha;setcolor(YELLOW);settextstyle(0,0,6);outtextxy(100,200,p);while(1){if(bioskey(1))cha=bioskey(0);if(cha==ESC){flag=1;break;}}}/***********显⽰蛇⾝**********************/void snakepaint(){struct snake *p1;p1=head;putimage(a-11,b-11,far2,COPY_PUT);while(p1!=NULL){putimage(p1->newx-11,p1->newy-11,far1,COPY_PUT);p1=p1->next;}}/****************end**********************//*********************蛇⾝刷新变化游戏关键部分 *******************/void snakechange(){struct snake *p1,*p2,*p3,*p4,*p5;int i,j;static int n=0;static int score;static int left=20;char sscore[5];char sleft[1];p2=p1=head;while(p1!=NULL){ p1=p1->next;if(p1->next==NULL){a=p1->newx;b=p1->newy; /************记录最后节点的坐标************/sx=a;sy=b;}p1->newx=p2->centerx;p1->newy=p2->centery;p2=p1;}p1=head;p1=p1->next;}/********判断按键⽅向*******/if(bioskey(1)){ ch=bioskey(0);if(ch!=RIGHT&&ch!=LEFT&&ch!=UP&&ch!=DOWN&&ch!=ESC) /********chy为上⼀次的⽅向*********/ ch=chy;}switch(ch){case LEFT: if(control!=4){head->newx=head->newx-22;head->centerx=head->newx;control=2;if(head->newx<47)gameover();}else{ head->newx=head->newx+22;head->centerx=head->newx;control=4;if(head->newx>377)gameover();}chy=ch;break;case DOWN:if(control!=1){ head->newy=head->newy+22;head->centery=head->newy;control=3;if(head->newy>377)gameover();}else{ head->newy=head->newy-22;head->centery=head->newy;control=1;if(head->newy<47)gameover();}chy=ch;break;case RIGHT: if(control!=2){ head->newx=head->newx+22;head->centerx=head->newx;control=4;if(head->newx>377)gameover();}else{ head->newx=head->newx-22;head->centerx=head->newx;control=2;if(head->newx<47)gameover();}chy=ch;break;case UP: if(control!=3){ head->newy=head->newy-22;head->centery=head->newy;control=1;if(head->newy<47)gameover();}else{ head->newy=head->newy+22;head->centery=head->newy;control=3;if(head->newy>377)gameover();case ESC:flag=1;break;}/* if 判断是否吃蛇*/if(flag!=1){ if(head->newx==scenterx&&head->newy==scentery){ p3=head;while(p3!=NULL){ p4=p3;p3=p3->next;}p3=(struct snake *)malloc(sizeof(struct snake));p4->next=p3;p3->centerx=a;p3->newx=a;p3->centery=b;p3->newy=b;p3->next=NULL;a=500;b=500;putimage(409,62,far4,COPY_PUT); /********** 分数框挡住**************/putimage(500,62,far4,COPY_PUT); /*********把以前的剩下⾍⼦的框挡住********/ score=(++n)*100;left--;itoa(score,sscore,10);itoa(left,sleft,10);setcolor(RED);outtextxy(415,70,sscore);outtextxy(512,70,sleft);nextshow=1;if(left==0) /************判断是否过关**********/donghua(); /*******如果过关,播放过关动画*********************/}p5=head; /*********************判断是否⾃杀***************************/p5=p5->next;p5=p5->next;p5=p5->next;p5=p5->next; /****从第五个节点判断是否⾃杀************/while(p5!=NULL){if(head->newx==p5->centerx&&head->newy==p5->centery){ gameover();break;}elsep5=p5->next;}}}/************snakechange()函数结束*******************//*****************************主函数******************************************/int main(){ int i;init(); /**********初始化图形系统**********/welcome(); /*********8欢迎界⾯**************/bort(); /*********主场景***************/snakede(); /**********连表初始化**********/while(1){ snakechange();if(flag==1)break;snakepaint();ran();for(i=0;i<=grade;i++)delay(3000);free(far3);free(far4);closegraph(); return 0;}。
贪吃蛇程序设计报告(附C源码)
《计算机程序设计基础》课程设计题目用户管理系统学生姓名王孟学号 0909082920 指导教师郭克华学院信息科学与工程学院专业班级电气类 0829 完成时间 2009-7-1目录1.课程设计内容 (3)2.课程设计目的 (3)3.背景知识(可选项) (3)4.工具/准备工作(可选项) (4)5.设计步骤、方法等 (4)5.1. 步骤1:步骤名称(二级标题) (4)5.1.1. 步骤1.1:步骤名称(三级标题) ............................................ 错误!未定义书签。
5.2. 步骤2:步骤名称 (6)5.3. 步骤n:步骤名称 (8)6.设计结果及分析 (10)7.设计结论 (10)8.问题及心得体会 (10)9.对本设计过程及方法、手段的改进建议 (11)10.参考文献 (12)报告名称1. 课程设计内容产生一个固定大小没有边界的游戏区域,蛇从区域的中心开始,由玩家通过键盘控制蛇的运动方向,用蛇头去吃随机分布在游戏区域内的食物;蛇的运动限制在游戏区域内,游戏区域没有边界,所以蛇在区域内作循环运动;蛇的运动方向为直线运动,只走横和竖的方向,不走斜线;蛇的运动速度由游戏的难度来控制,难度越高,速度越快,游戏难度分为9个等级;蛇身体的长度从1开始每吃掉一份食物就增加一个长度;食物的出现安照随机分布的原则,蛇吃掉一份后随即在游戏区域内放一份新的食物;每吃掉一份食物得分为10*游戏的难度,游戏结束后统计全部的得分;游戏结束的条件为:在控制蛇的过程中蛇头碰到蛇的身体的任何部位;2. 课程设计目的(1)、通过c语言编程实现贪吃蛇游戏的运行。
(2)、对代码进行进一步的调试优化,以使游戏高效运行,操作化强,人性化强。
(3)、通过编程,使自己掌握C语言编程的基本方法,有独立编程的能力,并学到实战经验。
3. 背景知识(可选项)本程序主要是一个交互式的游戏程序,通过玩家的键盘上下左右键控制贪吃蛇的运动方向。
贪吃蛇源码和设计思路
长为 1°。具体要求如下:
1. 三角函数计算程序采用汇编语言编写;
2. 汇编语言程序可以采用独立汇编模块,也可以采用嵌入式汇编,鼓励尝试两种方法;
3. 主程序可以采用 Turbo C 或 Visual C++。
解:
① 设计思路
输入输出可以用C语言编写,主程序用汇编语言编写,汇编语言中有计算sin,cos,
TIME DW ?
YLABEL DB ?
;蛋的位置
XLABEL DB ?
SSIZE DB 14
;蛇的长度
BEFOR DB 13
;蛇前一次的长度
AA DW ?
;前一次的时间
TAILX DB ?
;蛇尾的位置
TAILY DB ?
DATA ENDS
STACK SEGMENT STACK
DB 100 DUP(?)
④ 遇到的问题及解决方法
遇到的最大问题是蛇的自动移动,开始时由于出栈入栈的方式记录上次读取的时间,由
于初始时没有入栈的就先出栈,导致报错。后来实在受不了了,就采用了 DI 寄存器记
录。
开始时,每次按键时没有更新上次时间,使得按键和自动前进可能发生冲突,导致记录
的是两次前的时间值。后来加上一条语句就好了。
//求正切
FDIV ST,ST(1)
//求余切
FSTP COT
FSTP TAN
}
cout<<SIN<<"______"<<COS<<"______"<<TAN<<"_______"<<COT<<endl;
DOS简易版C语言贪吃蛇
DOS简易版C语⾔贪吃蛇本⽂实例为⼤家分享了C语⾔实现贪吃蛇的具体代码,供⼤家参考,具体内容如下#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <time.h>#include <windows.h>#define WALL_LENGTH 22#define LEFT 0x4b#define RIGHT 0x4d#define DOWN 0x50#define UP 0x48struct Snakes{int x;int y;struct Snakes *prev;struct Snakes *next;};struct Food{int x;int y;};struct Snakes *header;struct Snakes *tailer;struct Food *food;int wall[WALL_LENGTH][WALL_LENGTH];int direction = RIGHT;/**/void init();void draw();void move();void doMove(int x1, int y1);void eat();void keydown();void foods();int isOver();int isDrawSnake(int x, int y);int isDrawFood(int x, int y);int main(){init();while(1){if(isOver()){break;}move();eat();draw();_sleep( 100 );keydown();}printf("GAME OVER!");system("pause");}void init(){int y, x;for(y=0; y < WALL_LENGTH; y++){for(x=0; x < WALL_LENGTH; x++){if(y == 0 || y == WALL_LENGTH - 1 || x == 0 || x == WALL_LENGTH - 1){ wall[y][x] = 1;}}}header=(struct Snakes *)malloc(sizeof(struct Snakes));header->x=10;header->y=10;header->prev=NULL;tailer=(struct Snakes *)malloc(sizeof(struct Snakes));tailer->x=9;tailer->y=10;tailer->next=NULL;tailer->prev=header;header->next=tailer;foods();}void draw(){int y, x;system("cls");for(y=0; y < WALL_LENGTH; y++){for(x=0; x < WALL_LENGTH; x++){if(wall[y][x] == 1){printf("[]");}else if(isDrawSnake(x, y)){printf("[]");}else if(isDrawFood(x, y)){printf("()");}else{printf(" ");}}printf("\n");}}void move(){switch(direction){case LEFT :doMove(-1, 0);break;case RIGHT :doMove(1, 0);break;case UP :doMove(0, -1);break;case DOWN :break;}}void doMove(int x1, int y1){struct Snakes *temp_tailer = tailer->prev;tailer->x=header->x + x1;tailer->y=header->y + y1;tailer->next=header;tailer->prev->next = NULL;tailer->prev = NULL;header->prev=tailer;header = tailer;tailer = temp_tailer;}void eat(){if(header->x == food->x && header->y == food->y){int x1=0, y1 =0;struct Snakes *temp_tailer = tailer;tailer=(struct Snakes *)malloc(sizeof(struct Snakes));switch(direction){case LEFT :x1 = -1;y1 = 0;break;case RIGHT :x1 = 1;y1 = 0;break;case UP :x1 = 0;y1 = -1;break;case DOWN :x1 = 0;y1 = 1;break;}tailer->x=temp_tailer->x + x1;tailer->y=temp_tailer->y + y1;tailer->next=NULL;tailer->prev=temp_tailer;temp_tailer->next = tailer;foods();}}void foods(){int y,x;struct Snakes *temp = header;_sleep(20);srand((unsigned)time(NULL));y=rand()%WALL_LENGTH;x=rand()%WALL_LENGTH;if(y == 0 || y == WALL_LENGTH - 1 || x == 0 || x == WALL_LENGTH - 1 ){}do{if(temp->x == x && temp->y == y){return foods();}temp = temp->next;}while(temp != NULL);if(food == NULL){food=(struct Food *)malloc(sizeof(struct Food)); }food->x = x;food->y = y;}void keydown(){char keycode;if(_kbhit()&&(keycode =_getch())) {switch(keycode) {case LEFT:if(RIGHT!=direction) {direction=LEFT;// move();// draw();}break;case RIGHT:if(LEFT!=direction) {direction=RIGHT;// move();// draw();}break;case UP:if(DOWN!=direction) {direction=UP;// move();// draw();}break;case DOWN:if(UP!=direction){direction=DOWN;// move();// draw();}break;}}}int isDrawSnake(int x, int y){struct Snakes *temp = header;do{if(temp->x == x && temp->y == y){return 1;}temp = temp->next;}while(temp != NULL);return 0;}int isDrawFood(int x, int y){if(food->x == x && food->y == y){return 1;}return 0;}int isOver(){int x1=0, y1 =0;switch(direction){case LEFT :x1 = -1;y1 = 0;break;case RIGHT :x1 = 1;y1 = 0;break;case UP :x1 = 0;y1 = -1;break;case DOWN :x1 = 0;y1 = 1;break;}if(header->x + x1 <= 0 || header->x + x1 >= WALL_LENGTH - 1|| header->y + y1 <= 0 || header->y + y1 >= WALL_LENGTH - 1){return 1;}return 0;}好久没写过C语⾔了,随便写个贪吃蛇玩⼀玩,BUG不少,当记录了。
(完整word版)贪吃蛇游戏程序设计一课程设
贪吃蛇游戏程序设计__一、课程设.txt同志们:别炒股,风险太大了,还是做豆腐最安全!做硬了是豆腐干,做稀了是豆腐脑,做薄了是豆腐皮,做没了是豆浆,放臭了是臭豆腐!稳赚不亏呀!贪吃蛇游戏程序设计一、课程设计任务贪吃蛇小游戏程序设计二、设计要求通过游戏程序设计,提高编程兴趣与编程思路,巩固C语言中所学的知识,合理的运用资料,实现理论与实际相结合。
(1).收集资料,分析课题,分解问题,形成总体设计思路;(2).对于设计中用到的关键函数,要学会通过查资料,弄懂其用法,要联系问题进行具体介绍;(3).上机调试,查错,逐步分析不能正常运行的原因,确保所设计的程序正确,并且能正常运行;(4).完成课程设计报告,并进行答辩三、需求分析3.1、程序功能贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。
3.2、设计思想程序关键在于表示蛇的图形及蛇的移动。
用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用俩节表示。
移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。
食物的出现与消失也是画矩形块和覆盖矩形块。
为了便于理解,定义两个结构体:食物与蛇。
3.3、流程图开始初始化界面和蛇身放置食物蛇开始运动蛇吃到食?蛇长大蛇死亡?继续?退出界面NYNY游戏者按键选择Y四、设计的具体实现(1)函数定义函数定义是对各个基础函数的定义,并且设置需要运用的信息,便于调用#define N 200#define M 200#include"graphics.h"#include<stdlib.h>#include<stdio.h>#include<string.h>#include<iostream.h>#include<dos.h>#include<conio.h>#include <windows.h>#define LEFT 97//A#define RIGHT 100//D#define DOWN 115//S#define UP 119//W#define Esc 0x011bint i,key;int score=0;int gamespeed=250;//游戏速度可根据实际情况自行调整struct Food{int x;//食物的横坐标int y;//食物的纵坐标int yes;//判断是否要出现食物的变量}food;//食物的结构体struct Snake{int x[M];int y[M];int node;//蛇的节数int direction;//蛇的移动方向int life;//蛇的生命,0表示活着,1表示死亡}snake;void Init();//图形驱动void Close();//图形结束void DrawK();//开始画面void GamePlay();//玩游戏的具体过程void GameOver();//游戏结束void PrScore();//输出成绩(2)主函数main( ) 主函数是程序的主流程,首先定义使用到的常数、全局变量及函数原型说明,然后初始化图形系统,调用函数DrawK()画出开始画面,调用函数GamePlay(),即玩游戏的具体过程,游戏结束后调用Close()关闭图形系统,结束程序void main()//主函数{Init();//图形驱动DrawK();//开始画面GamePlay();//玩游戏的具体过程Close();//图形结束}void Init()//图形驱动{int gd=DETECT,gm;initgraph(&gd,&gm," ");/*此处为turboc的路径,读者可以根据自己的电脑而改*/cleardevice();}(3)画界面函数DrawK( )主界面是一个封闭的围墙,用两个循环语句分别在水平和垂直方向输出连续的宽度和高度均的矩形方块,表示围墙,为了醒目,设置为白色。
贪吃蛇设计思路
贪吃蛇游戏的开发与设计一、需求分析1.功能需求(1)控制游戏:按方向键"W","S","A","D"能控制蛇的移动;(2)蛇在固定的范围内移动,不能撞到自身,否则,游戏结束。
(3)固定范围内随机出现食物,蛇每吃一个白子长长一格,长度增加。
2.非功能需求(1)界面友好,图形界面,方便玩家使用;(2)具有较好的容错能力,玩家在游戏过程中,除了规定的按键外,其他按键均忽略。
3游戏界面二、系统设计1.游戏思路贪吃蛇游戏核心算法的设计与实现主游戏类的设计主游戏类主要负责贪吃蛇及果实的显示和更新。
1.果实出现的设计思路(1)采用随机数生成果实出现坐标。
(2)判断当前生成的果实是否在贪吃蛇的身体范围内。
(3)如果在,重新生成知道不在为止。
如果不在,则把坐标位置返回给调用对象。
2.贪吃蛇更新的设计思路(1)接受玩家按下的方向键消息,并保存到方向向量中。
(2)定义一个时间定时器。
(3)当每次时间间隔到达时,则根据方向变量来更新贪吃蛇BODY 向量。
(4)判断BODY向量的第一个元素的坐标数是否碰到边界或者蛇身,如果有,转到第(7)步。
(5)判断BODY向量的第一个元素中的坐标数据是否与当前果实坐标重合,如果有,表示贪吃蛇已经吃到果实。
这时就像贪吃蛇BODY向量添加一个元素,并重新生成一个果实。
(6)重绘整个贪吃蛇界面及果实。
重复前面步骤(1)~(6)。
(7)游戏结束时,计算当前游戏得分,并显示游戏所用时间。
3.主游戏类的实现主游戏类声明中包含了绘制蛇函数、初始化游戏函数、随机分配果实函数等函数的声明。
贪吃蛇游戏代码
贪吃蛇游戏代码贪吃蛇是一个经典的小游戏,可以在很多平台和设备上找到。
如果你想自己开发一个贪吃蛇游戏,这里有一个简单的Python版本,使用pygame库。
首先,确保你已经安装了pygame库。
如果没有,可以通过pip来安装:bash复制代码pip install pygame然后,你可以使用以下代码来创建一个简单的贪吃蛇游戏:python复制代码import pygameimport random# 初始化pygamepygame.init()# 颜色定义WHITE = (255, 255, 255)RED = (213, 50, 80)GREEN = (0, 255, 0)BLACK = (0, 0, 0)# 游戏屏幕大小WIDTH, HEIGHT = 640, 480screen = pygame.display.set_mode((WIDTH, HEIGHT))pygame.display.set_caption("贪吃蛇")# 时钟对象来控制帧速度clock = pygame.time.Clock()# 蛇的初始位置和大小snake = [(5, 5), (6, 5), (7, 5)]snake_dir = (1, 0)# 食物的初始位置food = (10, 10)food_spawn = True# 游戏主循环running = Truewhile running:for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN:if event.key == pygame.K_UP:snake_dir = (0, -1)elif event.key == pygame.K_DOWN:snake_dir = (0, 1)elif event.key == pygame.K_LEFT:snake_dir = (-1, 0)elif event.key == pygame.K_RIGHT:snake_dir = (1, 0)# 检查蛇是否吃到了食物if snake[0] == food:food_spawn = Falseelse:del snake[-1]if food_spawn is False:food = (random.randint(1, (WIDTH // 20)) * 20, random.randint(1, (HEIGHT // 20)) * 20)food_spawn = Truenew_head = ((snake[0][0] + snake_dir[0]) % (WIDTH // 20), (snake[0][1] + snake_dir[1]) % (HEIGHT // 20))snake.insert(0, new_head)# 检查游戏结束条件if snake[0] in snake[1:]:running = False# 清屏screen.fill(BLACK)# 绘制蛇for segment in snake:pygame.draw.rect(screen, GREEN, (segment[0], segment[1], 20, 20))# 绘制食物pygame.draw.rect(screen, RED, (food[0], food[1], 20, 20))# 更新屏幕显示pygame.display.flip()# 控制帧速度clock.tick(10)pygame.quit()这个代码实现了一个基本的贪吃蛇游戏。
贪吃蛇游戏代码
贪吃蛇游戏可以使用Python的pygame库来实现。
以下是一份完整的贪吃蛇游戏代码:```pythonimport pygameimport sysimport random#初始化pygamepygame.init()#设置屏幕尺寸和标题screen_size=(800,600)screen=pygame.display.set_mode(screen_size)pygame.display.set_caption('贪吃蛇')#设置颜色white=(255,255,255)black=(0,0,0)#设置蛇和食物的大小snake_size=20food_size=20#设置速度clock=pygame.time.Clock()speed=10snake_pos=[[100,100],[120,100],[140,100]]snake_speed=[snake_size,0]food_pos=[random.randrange(1,(screen_size[0]//food_size))*food_size,random.randrange(1,(screen_size[1]//food_size))*food_size]food_spawn=True#游戏主循环while True:for event in pygame.event.get():if event.type==pygame.QUIT:pygame.quit()sys.exit()keys=pygame.key.get_pressed()for key in keys:if keys[pygame.K_UP]and snake_speed[1]!=snake_size:snake_speed=[0,-snake_size]if keys[pygame.K_DOWN]and snake_speed[1]!=-snake_size:snake_speed=[0,snake_size]if keys[pygame.K_LEFT]and snake_speed[0]!=snake_size:snake_speed=[-snake_size,0]if keys[pygame.K_RIGHT]and snake_speed[0]!=-snake_size:snake_speed=[snake_size,0]snake_pos[0][0]+=snake_speed[0]snake_pos[0][1]+=snake_speed[1]#碰撞检测if snake_pos[0][0]<0or snake_pos[0][0]>=screen_size[0]or\snake_pos[0][1]<0or snake_pos[0][1]>=screen_size[1]or\snake_pos[0]in snake_pos[1:]:pygame.quit()sys.exit()#蛇吃食物if snake_pos[0]==food_pos:food_spawn=Falseelse:snake_pos.pop()if not food_spawn:food_pos=[random.randrange(1,(screen_size[0]//food_size))*food_size,random.randrange(1,(screen_size[1]//food_size))*food_size] food_spawn=True#绘制screen.fill(black)for pos in snake_pos:pygame.draw.rect(screen,white,pygame.Rect(pos[0],pos[1],snake_size,snake_size)) pygame.draw.rect(screen,white,pygame.Rect(food_pos[0],food_pos[1],food_size, food_size))pygame.display.flip()clock.tick(speed)```这个代码实现了一个简单的贪吃蛇游戏,包括基本的游戏循环、蛇的移动、食物的生成和碰撞检测。
贪吃蛇程序设计说明书
贪吃蛇程序设计说明书贪吃蛇游戏程序设计说明书题目:贪吃蛇游戏学校:系别:专业班级:姓名:学号:指导老师:日期:一、设计题目:贪吃蛇是一款经典的休闲游戏,一条蛇在密闭的围墙内,随机出现一个食物,通过控制方向键操作小蛇不停的朝着食物前进,直到吃掉食物。
每吃一个食物,小蛇都会长长一截,随之难度增大;当小蛇头撞到墙或自己时,小蛇死亡。
二、功能设计:本游戏要求实现以下几个功能:(1)用上、下、左、右键控制游戏区蛇的运动方向,使之吃食而使身体变长;(2)用户可以调节蛇的运行速度来选择不同的难度;(3)游戏分多个难度级别;(4)用户可自选颜色;(5)记录成绩前五名的游戏玩家;(6)增加背景音乐;(7)提高障碍物和游戏级别。
三、程序模块图:贪吃蛇游戏初始化图模块控制模块设置模块帮助模块墙体蛇身食物移动食物死亡变长绩等级音效四、算法流程图:是否否是否是开始初始化界面和蛇身放置食物获取按键开始运动碰到边界蛇吃到食蛇长大蛇死亡继续结束五、函数原型与功能1.主函数:void main()启动程序,触动其他函数。
2.初始化:void init ()设置背景框大小、蛇体初始值,随机产生食物。
3.随机产生食物:void setfoodcrd()设置食物生成坐标,0表示食物被吃。
4.画食物:void showfood()用矩形框来画食物5.画蛇:void showsnake()根据蛇的坐标和节数,循环用矩形框来画蛇。
6.蛇移动:void snakemove()根据按键,重设坐标7.改变蛇的方向:void changeskdir()响应用户的运动方向8.判断蛇是否死亡:void judgeslod判断蛇是否碰到自己或墙。
9.判断蛇是否吃到食物:void judgefood()判断是否吃到食物,吃食后变0,蛇增长一节。
10.结束游戏:void gameover()结束话语,并执行下一步。
六、基本代码#include#include#include#pragma comment(lib,"Winmm.lib")#include "MyTimer.h"#define SIZEMAX 100 /*蛇最大长度*/#define SPEED 100 /*初始速度*/#define len 20 /*蛇宽度*/#define lm 10 /*蛇每次移动距离*/#define initlen 600 /*初始化窗口正方形的长度*/ #define Min_snakelen 2 /*蛇的最小长度*/ typedef struct {int x,y;}DIR;int snakelen=Min_snakelen; /*蛇的长度*/int isfood=1; /*食物状态*/int isover=0; /*游戏状态*/int ispause=1; /*暂停状态*/int ismusic=1; /*音乐播放状态*/char dir; /*记录蛇运动的方向*/char c='d';DIR snake[500],food; /*定义蛇节点和食物的类型*/int speed=SPEED;void drawmap() /*画地图函数*/ {IMAGE img;char str[10];loadimage(&img,"贪吃蛇.jpg"); /*游戏界面*/ putimage(0,0,&img);loadimage(&img,"7.jpg"); /*侧栏提示*/putimage(600,0,&img);sprintf(str,"%d",snakelen);setfont(30,0,"宋体");setbkmode(TRANSPARENT);outtextxy(620,10,"操作说明:");setfont(20,0,"宋体");outtextxy(615,50,"awsd控制方向键");outtextxy(615,80,"p键暂停");outtextxy(615,110,"o键继续");outtextxy(615,200,"esc键退出");outtextxy(615,140,"l键暂停音乐");outtextxy(615,170,"k键继续播放");outtextxy(730,250,str);outtextxy(620,250,"蛇当前长度");}void init() /*初始化蛇函数*/ {int i;IMAGE img;snake[0].x=9*len+lm;snake[0].y=4*len+lm;loadimage(&img,"1.jpg");putimage(snake[0].x-lm,snake[0].y-lm,&img); for(i=1;i<snakelen;i++)< p="">{snake[i].x=len*(9-i)+lm;snake[i].y=len*4+lm;loadimage(&img, "2.jpg");putimage(snake[i].x-lm,snake[i].y-lm, &img); }}void showsnake() /*画蛇函数*/{int i;IMAGE img;loadimage(&img, "1.jpg");putimage(snake[0].x-lm,snake[0].y-lm , &img); loadimage(&img, "2.jpg");for(i=1;i<snakelen;i++)< p="">putimage(snake[i].x-lm,snake[i].y-lm, &img); }void snakemove() /*画动蛇函数*/{int i;int mx=snake[0].x;int my=snake[0].y;switch(dir){case 'a':mx-=len;break;case 'd':mx+=len;break;case 'w':my-=len;break;case 's':my+=len;break;default:break;}for(i=snakelen-1;i>=0;i--){snake[i+1].x=snake[i].x;snake[i+1].y=snake[i].y;}snake[0].x=mx;snake[0].y=my;showsnake();}int ceshiover() /*检测游戏结束函数*/{int i;if(snake[0].x<0||snake[0].x>30*len-lm||snake[0].y<0||snake[0].y>30*len-lm) return 1;for(i=1;i<snakelen;i++)< p="">{if(snake[0].x==snake[i].x&&snake[0].y==snake[i].y) return 1;}return 0;}int foodinsnake() /*检测食物是否在蛇上函数*/ {for(int i=0;i<snakelen;i++)< p="">if(food.x==snake[i].x&&food.y==snake[i].y)return 1;elsereturn 0;}void showfood() /*画食物函数*/{IMAGE img;do{food.x=(rand()%30)*len+lm;food.y=(rand()%30)*len+lm;}while(foodinsnake());loadimage(&img, "3.jpg");putimage(food.x-lm,food.y-lm , &img);isfood=0;}void kmusic(){if(ismusic==0)mciSendString("pause mymusic",NULL,0,NULL);if(ismusic==1)mciSendString("resume mymusic",NULL,0,NULL);}void playbkmusic() /*播放背景音乐函数*/{mciSendString("open 超级玛丽.mp3 alias mymusic", NULL, 0, NULL);mciSendString("play mymusic repeat", NULL, 0, NULL);}void playgame() /*玩游戏函数*/{c='d'; //蛇开始向右移动isover=0;snakelen=Min_snakelen;dir='d';IMAGE img;MyTimer t; //定义精确延时对象int T=200; // 延长时间drawmap(); //画游戏地图init(); //画小蛇初始位置while(!isover){if(ispause){snakemove();FlushBatchDraw(); //批量绘图EndBatchDraw(); //结束批量绘图if(snake[0].x==food.x&&snake[0].y==food.y){ snakelen++;isfood=1;}if(isfood)showfood();if(snakelen<35)T=200-3*snakelen;t.Sleep(T);BeginBatchDraw(); // 开始批量绘图模式,防止闪烁问题drawmap();loadimage(&img, "3.jpg"); // 加载食物图片putimage(food.x-lm,food.y-lm , &img);};//按键控制if(kbhit())c=getch();switch(c){case 'a':if(dir!='d'){dir=c;}break;case 'd':if(dir!='a'){dir=c;}break;case 'w':if(dir!='s'){dir=c;}break;case 's':if(dir!='w'){dir=c;}break;case 27: exit(0); break; //游戏退出case 'p': ispause=0;break; //p暂停case 'o': ispause=1;break; //o继续游戏case 'l': ismusic=0;break; //l暂停音乐case 'k': ismusic=1;break; //k继续播放default:break;}kmusic(); //音乐控制播放//判断游戏结束if(ceshiover())isover=1;//判断是否重新再来HWND wnd = GetHWnd(); //获取窗口句柄if(isover)if (MessageBox(wnd, "游戏结束。
“贪吃蛇”游戏程序代码
CPoint m_snakePoint[MAX]; //蛇身定义
CPoint m_direction;//蛇运动方向
int m_snakeNum; //蛇身结点数
int m_icon;//用来设定食物是那种图标的
int turnUP;//用来表示玩家“上”键设的键int turnDOWN;//用来表示玩家“下”键设的键int turnLEFT;//用来表示玩家“左”键设的键int turnRIGHT;//用来表示玩家“右”键设的键
LPARAM lParam // keystroke-message information
)
{
if(wParam == game.turnUP)
{
if(game.m_direction.y == 0) game.m_direction = UP;
}
else if(wParam == game.turnDOWN)
}
else if(game.m_num == 1)
{
++m_icon2;
str.Format("%d",m_icon2);
GetDlgItem(IDC_EDIT2)->SetWindowTextA(str);
}
else
{
++m_icon3;
str.Format("%d",m_icon3);
GetDlgItem(IDC_EDIT3)->SetWindowTextA(str);
{
if(game.m_direction.y == 0) game.m_direction = DOWN;
贪吃蛇代码
#include <stdlib.h>#include <graphics.h>#include <dos.h>#include <bios.h>#include <conio.h>#include <stdio.h>#define ESC 0x11B#define UP 0x4800#define DOWN 0x5000#define LEFT 0x4b00#define RIGHT 0x4d00#define N 200#define MAXX 619#define MAXY 459#define MINX 20#define MINY 20struct snake{int x[N];int y[N];int joint;int direction;int life;}snake;struct food{int x;int y;int exist;}food;int i,key;int score=0;unsignedint gamespeed=65000;char str1[8]={231,165,231,24,24,231,165,231}; char str2[8]={24,90,24,231,231,24,90,24}; void initgra();void welcome();void title();void flashtxt(int x,int y,int dx,int dy,char c[20]); void drawbg();void gameover();void printscore();void staff();void close();int control();void eatfood();void drawsnake();void snakemove();void drawfood();void initgame();void replay();main(){initgra();welcome();sleep(1);getch();title();sleep(2);flashtxt(220,382,200,50,"press any key"); getch();setviewport(0,0,639,478,0); clearviewport();drawbg();initgame();while(1){while(!kbhit()){drawfood();snakemove();if(checkover()==0){gameover();snake.life=0;break;}drawsnake();eatfood();}if(control()==0)break;}close();}void initgra(){int gdriver=VGA,gmode=VGAHI; initgraph(&gdriver,&gmode,"\\tc");}void welcome(){cleardevice();setbkcolor(15);setlinestyle(0,0,3);setcolor(0);settextstyle(4,0,7);outtextxy(18,100,"Welcome To the Game"); setcolor(8);settextstyle(4,0,7);outtextxy(14,100,"Welcome To the Game"); setcolor(1);settextstyle(4,0,7);outtextxy(10,100,"Welcome To the Game"); setcolor(0);settextstyle(2,0,10);outtextxy(193,230,"presented by"); setcolor(8);settextstyle(2,0,10);outtextxy(189,230,"presented by"); setcolor(4);settextstyle(2,0,10);outtextxy(185,230,"presented by"); setcolor(0);settextstyle(1,0,7);outtextxy(208,300,"SHANAN");setcolor(8);settextstyle(1,0,7);outtextxy(204,300,"SHANAN");setcolor(2);settextstyle(1,0,7);outtextxy(200,300,"SHANAN");delay(2000);}void title(){cleardevice();setbkcolor(0);setcolor(4);line(0,78,639,78);line(0,382,639,382);setcolor(14);setfillstyle(12,BLUE);setfillpattern(str1, BLUE);bar(0,80,639,380);floodfill(10,120,5);setcolor(10);settextstyle(3,0,8);setusercharsize(5,1,8,1);outtextxy(35,90,"SNAKE");setcolor(14);settextstyle(1,0,8);setusercharsize(4,1,10,1);outtextxy(400,65," TC");setcolor(15);settextstyle(2,0,5);outtextxy(218,450,"copyright (c) 2006,shanan,all rights reserved,ver.0.953");}void drawbg(){cleardevice();setcolor(15);setlinestyle(0,0,1);for(i=0;i<=MAXX+MINX;i+=MINX){rectangle(i,0,i+MINX,MINY);rectangle(i,MAXY,i+MINX,MAXY+MINY);}for(i=MINY;i<=MAXY+MINY;i+=MINY){rectangle(0,i,MINX,i+MINY);rectangle(MAXX,i,MAXX+MINX,i+MINY);}for(i=0;i<=31;i++){setfillstyle(1,i);floodfill(10+MINX*i,10,15);floodfill(10+MINX*i,469,15);}for(i=21;i>=0;i--){setfillstyle(1,i);floodfill(10,10+MINY*i,15);floodfill(629,10+MINY*i,15);}}void gameover(){setviewport(200,200,439,279,1);setcolor(4);rectangle(0,0,239,79);setfillpattern(str1,1);setfillstyle(12,1);floodfill(2,50,4);setcolor(14);settextstyle(3,0,5);settextjustify(1,1);outtextxy(120,39,"GAME OVER");sleep(1);getch();close();}void printscore(){char str[10];setfillstyle(SOLID_FILL,BLACK);bar(280,1,385,19);setcolor(11);settextstyle(2,0,7);sprintf(str,"score:%d",score);outtextxy(325,8,str);}void close(){cleardevice();setviewport(0,0,639,479,0);setbkcolor(15);setcolor(15);setfillstyle(1,9);circle(480,80,200);floodfill(0,50,15);setcolor(5);setfillstyle(1,2);circle(290,340,100);floodfill(290,340,5);setcolor(13);setfillstyle(1,13);circle(480,450,20);floodfill(480,450,13);setlinestyle(0,0,3);setcolor(5);line(0,15,639,15);line(0,17,639,17);bar(15,0,70,479);setcolor(13);settextstyle(1,0,9);settextjustify(1,1);outtextxy(320,200,"Bye bye!");sleep(2);getch();closegraph();}void initgame(){randomize();food.exist=0;snake.life=1;snake.direction=1;snake.x[0]=100;snake.y[0]=100;snake.x[1]=120;snake.y[1]=100;snake.joint=2;}void drawfood()if(food.exist==0){randomize();food.x=random(MAXX-2*MINX);food.x=food.x-food.x%20+2*MINX+10;food.y=random(MAXY-2*MINY);food.y=food.y-food.y%10+2*MINY;setcolor(4);circle(food.x,food.y,5);setfillstyle(1,4);floodfill(food.x,food.y,4);food.exist=1;}}void snakemove(){for(i=snake.joint-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;}}int checkover(){for(i=3;i<snake.joint;i++){if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])return 0;}if(snake.x[0]<=MINX||snake.x[0]>=MAXX||snake.y[0]<=MINY|| snake.y[0]>=MAXY)return 0;}void drawsnake()putpixel(snake.x[0],snake.y[0],4);setcolor(2);for(i=0;i<snake.joint;i++)circle(snake.x[i],snake.y[i],5);delay(gamespeed-snake.joint*10);putpixel(snake.x[snake.joint-1],snake.y[snake.joint-1],0);setcolor(0);circle(snake.x[snake.joint-1],snake.y[snake.joint-1],5); }void eatfood(){if(snake.x[0]==food.x&&snake.y[0]==food.y){setcolor(0);circle(food.x,food.y,5);setfillstyle(1,0);floodfill(food.x,food.y,0);snake.x[snake.joint]=-20;snake.y[snake.joint]=-20;snake.joint++;food.exist=0;score+=1;printscore();}}int control(){if(snake.life==0||score==198)return 0;key=bioskey(0);if(key==ESC)return 0;elseif(key==UP&&snake.direction!=4)snake.direction=3;elseif(key==RIGHT&&snake.direction!=2)snake.direction=1;elseif(key==LEFT&&snake.direction!=1)snake.direction=2;elseif(key==DOWN&&snake.direction!=3)snake.direction=4;}void flashtxt(int x,int y,int dx,int dy,char c[20]) {setviewport(x,y,x+dx,y+dy,1);setbkcolor(0);settextstyle(2,0,7);settextjustify(1,1);for(;!kbhit();delay(700)){setcolor(15);outtextxy(dx/2,dy/2,c);delay(500);setcolor(7);outtextxy(dx/2,dy/2,c);delay(500);setcolor(8);outtextxy(dx/2,dy/2,c);delay(500);setcolor(0);outtextxy(dx/2,dy/2,c);delay(1000);setcolor(15);outtextxy(dx/2,dy/2,c);delay(500);setcolor(11);outtextxy(dx/2,dy/2,c);delay(500);setcolor(15);outtextxy(dx/2,dy/2,c);delay(500);setcolor(9);outtextxy(dx/2,dy/2,c);delay(500);setcolor(3);outtextxy(dx/2,dy/2,c);delay(500);setcolor(15);outtextxy(dx/2,dy/2,c);delay(500);} }。
贪吃蛇游戏实现思路及源代码
贪吃蛇游戏实现思路及源代码HTML5 贪吃蛇游戏实现思路及源代码点评:游戏难点是怎么模拟贪吃蛇的移动。
如果只是一个方块的话显然很简单。
但是当蛇的长度变长之后要怎么样控制,下面为大家简要介绍下具体的实现,感兴趣的朋友可以参考下,希望对大家有所帮助游戏操作说明通过方向键控制贪吃蛇上下左右移动。
贪吃蛇吃到食物之后会变长一个长度。
游戏具体实现游戏难点是怎么模拟贪吃蛇的移动。
如果只是一个方块的话显然很简单。
但是当蛇的长度变长之后要怎么样控制每个方块的移动呢?如果观察蛇的移动,可以发现,从蛇的头部到尾部,每个方块在下一时刻的位置就是它的前一个方块在当前时刻的位置。
因此我们需要做的只是控制贪吃蛇的头部的运动。
其他部分的位置都可以依次类推。
另外一个值得注意的问题是贪吃蛇吃下食物之后,新增加的方块应该放在哪个位置。
答案就是在下一时刻,新增加的方块应该出现在当前时刻的尾部位置。
因此,在吃下食物之后应该在更新蛇的每个位置之前,增加一个方块,并且将其位置设定在当前时刻的尾部位置。
然后在当前时刻更新出了新增方块之外的所有方块的位置index.htmlsnake.js复制代码代码如下:var canvas;var ctx;var timer;//measuresvar x_cnt = 15;var y_cnt = 15;var unit = 48;var box_x = 0;var box_y = 0;var box_width = 15 * unit;var box_height = 15 * unit;var bound_left = box_x;var bound_right = box_x + box_width;var bound_up = box_y;var bound_down = box_y + box_height;//imagesvar image_sprite;//objectsvar snake;var food;var food_x;var food_y;//functionsfunction Role(sx, sy, sw, sh, direction, status, speed, image, flag) {this.x = sx;this.y = sy;this.w = sw;this.h = sh;this.direction = direction;this.status = status;this.speed = speed;this.image = image;this.flag = flag;}function transfer(keyCode){switch (keyCode){case 37:return 1;case 38:return 3;case 39:return 2;case 40:return 0;}}function addFood(){//food_x=box_x+Math.floor(Math.random()*(box_width-unit));//food_y=box_y+Math.floor(Math.random()*(box_height-unit));food_x = unit * Math.floor(Math.random() * x_cnt);food_y = unit * Math.floor(Math.random() * y_cnt);food = new Role(food_x, food_y, unit, unit, 0, 0, 0, image_sprite, true);}function play(event){var keyCode;if (event == null){keyCode = window.event.keyCode;window.event.preventDefault();}else{keyCode = event.keyCode;event.preventDefault();}var cur_direction = transfer(keyCode);snake[0].direction = cur_direction;}function update(){//add a new part to the snake before move the snakeif (snake[0].x == food.x && snake[0].y == food.y){var length = snake.length;var tail_x = snake[length - 1].x;var tail_y = snake[length - 1].y;var tail = new Role(tail_x, tail_y, unit, unit, snake[length - 1].direction, 0, 0, image_sprite, true); snake.push(tail);addFood();}//modify attributes//move the headswitch (snake[0].direction){case 0: //downsnake[0].y += unit;if (snake[0].y > bound_down - unit) snake[0].y = bound_down - unit; break;case 1: //leftsnake[0].x -= unit;if (snake[0].x < bound_left)snake[0].x = bound_left;break;case 2: //rightsnake[0].x += unit;if (snake[0].x > bound_right - unit) snake[0].x = bound_right - unit; break;case 3: //upsnake[0].y -= unit;if (snake[0].y < bound_up)snake[0].y = bound_up;break;}//move other part of the snakefor (var i = snake.length - 1; i >= 0; i--) {if (i > 0)//snake[i].direction=snake[i-1].direction; {snake[i].x = snake[i - 1].x;snake[i].y = snake[i - 1].y;}}}function drawScene(){ctx.clearRect(box_x, box_y, box_width, box_height); ctx.strokeStyle = "rgb(0,0,0";ctx.strokeRect(box_x, box_y, box_width, box_height); //detection collisions//draw imagesfor (var i = 0; i < snake.length; i++){ctx.drawImage(image_sprite, snake[i].x, snake[i].y); }ctx.drawImage(image_sprite, food.x, food.y);}function init(){canvas = document.getElementById("scene");ctx = canvas.getContext('2d');//imagesimage_sprite = new Image();image_sprite.src = "images/sprite.png";image_sprite.onLoad = function (){}//ojectssnake = new Array();var head = new Role(0 * unit, 0 * unit, unit, unit, 5, 0, 1, image_sprite, true); snake.push(head);window.addEventListener('keydown', play, false);addFood();setInterval(update, 300); //notesetInterval(drawScene, 30); }。
贪吃蛇游戏详细代码与详细分析
开发过手机游戏的人就知道手机开发的三要素:画布(用来绘画游戏的画面)键盘事件,实时刷新。我们知道一般的游戏画面都是由地图,精灵(由游戏的主角,怪物组成),那我们现在就看看贪吃蛇是怎样他的地图的:
if (mDirection != WEST) {
mNextDirection = EAST;
}
return (true);
}
以上的代码大家一看就明白,就是通过判断那个键按下,然后再给要走的方向(mDirection)赋值。
以下的代码就是通
switch (mDirection) {
case EAST: {
最近我关注到,中国移动推出了OPhone手机,OPhone手机兼容Android的所有应用,你开发的Android软件和游戏,很容易的就可以移植到OPhone手机上来。目前中国移动用户已经超过6.8亿,中国移动如果在这6.8个亿的市场里,推广OPhone手机,赚钱的机会可想而知。
现在,国内手机上网的用户突破8000万,2007年,中国手机游戏市场运营收入达到1。5亿元,成为继互联网企业之后又一就业热点,2008年手机网游仍将高速增长。随着3G的发展,到2009年底手机游戏市场规模可以达到16亿元,而以往的手机游戏市场都被一些有经济实力的游戏公司或者SP来运营,对于我们技术人员只能是望洋兴叹了。Android和OPhone OS在开发游戏方面更加简单便捷。而中国移动推出mmarket手机软件商店平台,提供了一个全新的模式,未来很有可能代替SP的地位,不管你是个人和还是公司,人人都可以参与的。
贪吃蛇代码
贪吃蛇编写思路及C语言源码规则:每吃上一个点,就长大一点,不能撞墙或者撞上自己身体。
教训:在有限的空间里,可以贪吃,但是要注意安全哦。
这个游戏是我刚工作一年的时候写的,当时对C语言有了些了解,想做点东西,刚好看到同事的手机上有这个游戏(那时我还没有手机呢,呵呵),觉得挺好玩,要实现的话也还比较简单,就在电脑上用TC上做出来了。
刚做出来的时候,那种喜悦,确实不是玩别人的游戏所能带来的。
这个程序是入门级别的,适合编程刚入门的朋友们试一试。
高手达人们请跳过。
下面我简单说一下我的思路,理解下面几点会比较清楚一些。
1,基础:你首先要能画出一个带颜色的方块。
举一反三:可以画一个就可以画很多个了。
(TC中画方块用到了这个文件)2,移动:一个方块消失,相邻地方一个方块出现,在视觉上就是移动了。
3,消失:用背景颜色在同样的地方画同样大小的方块。
4,相对坐标:视觉上像素这个单位太小,用方块的大小作为相对坐标的单位。
5,随机点:使用伪随机函数,参数一般用上系统当前时间,你再随意捏造个四则运算,就会产生出独一无二的随机数了。
6,链表:这个是精髓啊,你看那蛇不是就像一个链表吗,这个可是我认为在这个游戏中使用的最高深的结构了,呵呵。
7,长大:链表头遇上一个食物(随机产生的方块),链表上添加一个节点。
8,死亡:链表头撞上了自身或者撞墙。
也就这么多,理解了这几点,整个框架也就出来了。
下面就是源代码:#include <>#include <>#include <>#include <>#define LEN sizeof(struct list)#define uchar unsigned charint n,sco,r,t,speed=8800;uchar i,a,x1,y1,hit,long1=16,cycy=0,str1[200],xisu;struct list{int x,y;struct list * next,* last;};struct list * p1,* p2,* head,* eof1;void up(void); void down(); void left(); void right(); void unit(uchar,uchar,uchar); void score();void dl(int); void save1(); void load1(); void save(); main(){int driver=VGA,mode=VGAHI;unsigned char ss[8];initgraph(&driver,&mode,"c:\\tc");setfillstyle(1,8);setcolor(8);bar(2,2,600,400);setfillstyle(1,7);setcolor(7);bar(117,117,170,140);setfillstyle(1,8);setcolor(8);bar(118,118,170,140);setcolor(14);/* settextstyle(2,0,5);*/sprintf(ss,"enter");outtextxy(120,125,ss);setcolor(0);line(118,141,171,141);line(118,142,172,142);line(171,118,171,141);line(172,118,172,142);setfillstyle(1,14);setcolor(14);circle(15,15,10); sprintf(ss," fast"); /* three statuses,select use 'Tab' */outtextxy(30,15,ss);circle(15,55,10); sprintf(ss," normol");outtextxy(30,55,ss);circle(15,95,10); sprintf(ss," slow"); outtextxy(30,95,ss);circle(15,15,6);floodfill(15,15,14);xisu=0;do{a=getch();if(a==9) /* Tab */{setcolor(14);setfillstyle(1,14);a=8;xisu++;circle(15,15+(xisu%3)*40,6);floodfill(15,15+(xisu%3)*40,14);setfillstyle(1,7);setcolor(7);circle(15,15+((xisu-1)%3)*40,6);floodfill(15,15+((xisu-1)%3)*40,7);}if((a==76)||(a==108)) /* 'L'or'l' load the status of last time */ {load1();xisu=2;goto LOOP;}}while(a!=13);setcolor(8);line(118,141,171,141);line(171,118,171,141);dl(speed);p2=(struct list *)malloc(LEN);hit=1; /* head of snake */p1=p2; head=p2;p2->x=20;p2->y=20;p2->last=NULL;p2->next=NULL;rectangle(0,0,600,450);setfillstyle(1,0);setcolor(0);bar(1,1,599,449);setfillstyle(1,14);setcolor(14);speed=speed*(xisu%3+1);for(i=0;i<15;i++) / * 16 units when creating */{p2=(struct list *)malloc(LEN);p2->x=21+i;p2->y=20;unit(21+i,20,14);p1->next=p2;p2->last=p1;p2->next=NULL;eof1=p2;p1=p2;}unit(head->x,head->y,14);/*srand(100);*/LOOP: while(1){if(hit==1) /* create a random unit */ {randomize();x1=random(30);y1=random(20);x1=x1+3;y1=y1+3;p2=head;p1=p2;while(p1->next!=NULL){if((x1==p2->x)&&(y1==p2->y)) /* make the unit not in the snake */ {x1=random(30)+3;y1=random(20)+3;p2=head;p1=p2;} /* if in,new */else{p1=p2;p2=p1->next;}}unit(x1,y1,14);hit=0;}if(kbhit()!=0)a=getch();switch(a) /* do with key-down */{case 72 : up(); break;case 80 : down(); break;case 75 : left(); break;case 77 : right(); break;case 83 :case 115: dl(500); save1(); break; /*'S'or's' save status and exit */ }if(cycy==1)break;}do{a=getch();}while((a>14)||(a<13)); /* while 'Enter',exit */closegraph();}void up(void){p2=head->next;p1=p2;while(p1->next!=NULL){if((head->x==p2->x)&&(head->y-1==p2->y)) /* if hit self ,out */{score();break;}else{p1=p2;p2=p1->next;}}if((hit==0)&&(head->x==x1)&&(head->y-1==y1)) /* if hit new unit ,add */ {p2=(struct list *)malloc(LEN);p2->x=x1;p2->y=y1;p2->next=head;head->last=p2;head=p2; hit=1;long1++; }else{p2=eof1;eof1=p2->last;/*p2->last=NULL;*/eof1->next=NULL; /* eof1 disappear,head add 1 unit */unit(p2->x,p2->y,0);p2->x=head->x;p2->y=head->y-1;p2->next=head;head->last=p2;head=p2;head->last=NULL;unit(p2->x,p2->y,14);if(p2->y<1)score();}dl(speed);}void down(void){p2=head->next;p1=p2;while(p1->next!=NULL){if((head->x==p2->x)&&(head->y+1==p2->y)) /* hit self ,out */ {score();break;else{p1=p2;p2=p1->next;}}if((hit==0)&&(head->x==x1)&&(head->y+1==y1)) /* hit unit ,add */ {p2=(struct list *)malloc(LEN);p2->x=x1;p2->y=y1;p2->next=head;head->last=p2;head=p2;hit=1;long1++;}elsep2=eof1;eof1=p2->last;eof1->next=NULL;unit(p2->x,p2->y,0);p2->next=head;head->last=p2;p2->x=head->x;p2->y=head->y+1;head=p2;head->last=NULL;unit(p2->x,p2->y,14);if(p2->y>=30) /* hit wall ,out */score();}dl(speed);}void left(void){p2=head->next;p1=p2;while(p1->next!=NULL){if((head->x-1==p2->x)&&(head->y==p2->y)) {score();break;}else{p1=p2;p2=p1->next;}}if((hit==0)&&(head->x-1==x1)&&(head->y==y1)) {p2=(struct list *)malloc(LEN);p2->x=x1;p2->y=y1;p2->next=head; head->last=p2;head=p2;hit=1;long1++;}else{p2=eof1; eof1=p2->last;eof1->next=NULL;unit(p2->x,p2->y,0);p2->next=head;head->last=p2;p2->x=head->x-1;p2->y=head->y;head=p2;head->last=NULL;unit(p2->x,p2->y,14);if(p2->x<1)score();}dl(speed);}void right(void){p2=head->next;p1=p2;while(p1->next!=NULL){if((head->x+1==p2->x)&&(head->y==p2->y)) {score();break;}else{p1=p2;p2=p1->next;}}if((hit==0)&&(head->x+1==x1)&&(head->y==y1)) {p2=(struct list *)malloc(LEN);p2->x=x1;p2->y=y1;p2->next=head;head->last=p2;head=p2;hit=1;long1++;}else{p2=eof1;eof1=p2->last;eof1->next=NULL;unit(p2->x,p2->y,0); p2->next=head;head->last=p2;p2->x=head->x+1;p2->y=head->y;head=p2;head->last=NULL;unit(p2->x,p2->y,14); if(p2->x>=40)score();}dl(speed);}void dl(int a){int r,n;for(r=0;r<a;r++)for(n=0;n<6000;n++) {n++;n--;}}void unit(uchar x,uchar y,uchar color) {setfillstyle(1,color);setcolor(color);bar(x*15,y*15,(x+1)*15-2,(y+1)*15-2);}void score(void){uchar ss[20];if(long1>50)sco=(long1-50)*3+(long1-30)*2+14; else if(long1>30)sco=(long1-30)*2+14;elsesco=long1-16;sprintf(ss,"your score is %d",sco); outtextxy(50,50,ss);cycy=1;save();}void save(void){FILE * fp;int i;i=0;fp=fopen("","rb+");i=(int)(fgetc(fp))-48;if(fp==NULL)i=0;fclose(fp);if(i<sco){fp=fopen("","wb+");fprintf(fp,"%d",sco);fclose(fp);printf("\n");printf("Your score: %d are the highest!",sco); }/* getch();*/}void save1(){FILE *fl1;i=0;dl(1500);p1=head;p2=p1;while(p1!=NULL){str1[i]=(char)(p1->x+30);str1[i+1]=(char)(p1->y+30);i=i+2;p2=p1;p1=p2->next;}dl(1500);fl1=fopen("","w+");if(fl1!=NULL){fwrite(str1,i,1,fl1);dl(1500);fclose(fl1);}elseprintf("bad\n");dl(1500);cycy=1;}void load1(){FILE *fl1;int cc;i=0;fl1=fopen("","r");if(fl1!=NULL){fseek(fl1,0,SEEK_SET);while(feof(fl1)==0) {str1[i++]=fgetc(fl1); }cc=i-1;/* fread(str1,200,1,fl1);*/cc=ftell(fl1);fclose(fl1);}elseprintf("bad\n");setcolor(8);line(118,141,171,141);line(171,118,171,141);dl(speed);p2=(struct list *)malloc(LEN); hit=1;p1=p2;head=p2;p2->x=(int)(str1[0])-30;p2->y=(int)(str1[1])-30;p2->last=NULL;p2->next=NULL;rectangle(0,0,600,450); setfillstyle(1,0);setcolor(0);bar(1,1,599,449);setfillstyle(1,14);setcolor(14);xisu=1;speed=speed*(xisu%3+1);for(i=2;i<cc;i+=2){p2=(struct list *)malloc(LEN); p2->x=(int)(str1[i])-30;p2->y=(int)(str1[i+1])-30;unit(p2->x,p2->y,14);p1->next=p2;p2->last=p1;p2->next=NULL;eof1=p2;p1=p2;}long1=cc/2;unit(head->x,head->y,14);}里面有个速度设置,这样一句话:“speed=8800;” 其实是个延迟时间,各位根据电脑CPU 的速度可以改动一下,到你自己舒服为止哦。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
游戏背景及设计原因蛇引诱夏娃吃了苹果之后,就被贬为毒虫,成为阴险的象征。
而蛇吃东西是整只动物吞进去的,很久以前(大概文艺复兴的时候)就有人发明了一种游戏,就是现在贪吃蛇的前身,后来慢慢的发展就变成了今天的贪吃蛇了—一个很受欢迎、为人熟知、给很多人美好时光的经典小游戏。
贪吃蛇在我们曾经的岁月里留下了很多美好的记忆,也伴随我们走过了很长一段的人生路,对于贪吃蛇这个游戏有着特殊的感情,也一直很好奇这个游戏是怎么设计的,所以这次我们就选择了这个题目。
一是弄清楚这个游戏的设计;二是学习程序的编辑过程和对编程的进一步深入了解。
程序结构图程序流程图程序设计及说明1、边墙(Wall)该类规定游戏的范围大小。
2、蛇类(Snake)用该类生成一个实例蛇snake。
3、移动(Move)该类用于实现对蛇的操作控制,即蛇头方向的上下左右的移动操作。
4、食物类(Food)该类是游戏过程中食物随机产生的控制和显示。
5、判断死亡(Dead)该类是对游戏过程中判断玩家操作是否导致蛇的死亡,其中包括蛇头咬食自己身体和蛇头是否触及游戏“边墙”。
6、蛇结点(SnakeNode)该类是蛇吃下随机产生的食物从而增加长度的控制类,其中包括蛇长度增加和尾部的变化。
7、计分统计(Score)该类由于玩家的游戏成绩记录,及游戏结束时的得分输出。
...部分函数及说明1.Char menu();/*用于玩家选择的游戏速度,返回一个char值*/2.DELAY(char ch1);/*用于控制游戏速度*/3.void drawmap();/*绘制游戏地图函数*4、void menu()/*游戏帮助信息的输出*...部分类细节解说1、蛇的构建—Snakeclass Snake{public:int x[n];int y[n];int node; //蛇身长度int direction;//蛇运动方向int life;//蛇生命,判断死亡}2、随机食物Food利用rand()函数进行随机数产生,然后就行坐标定位void Food(void){...int pos_x = 0;int pos_y = 0;pos_x = rand() % length;//x坐标的确定pos_y = rand() % (width-1);//y坐标的确定...}3、蛇头方向确定利用switch语句进行方向确定...switch(){case VK_UP:{OutChar2.Y--;y--;break;}case VK_LEFT:{OutChar2.Y++;y++;break;}case VK_DOWN:{OutChar2.X---;x--;break;}case 'VK_RIGHT:{OutChar2.X++;x++;break;}}代码#include <iostream>#include <ctime>#include <conio.h>#include <windows.h>#include <time.h>using namespace std;int score=0,t=300,f=1;//得分与时间间隔/ms(控制贪吃蛇的速度)double ss=0,tt=0;//统计时间所用参数class Node{Node(): x(0), y(0), prior(0), next(0) { }int x;int y;Node *prior;Node *next;friend class Snake;};class Snake{public:Snake();~Snake();void output();void move();void change_point(char);private:Node *head;Node *tail;enum p{ UP, RIGHT, DOWN, LEFT }point; //方向int food_x, food_y; //食物的坐标static const int N = 23;int game[N][N];void add_head(int, int); //添加坐标为a,b的结点void delete_tail(); //删除最后一个结点void greate_food(); //产生食物void gotoxy(int, int);};void menu(); //游戏操作菜单int main(){ system("color a"); //初始cmd窗口颜色为黑(背景)淡绿(文字)cout<<"\n\n\n\n\n\n ";for(int i=0;i<23;i++){char star[]={"Welcome To Snake Game!"};cout<<star[i];Sleep(170);}cout<<"\n\n 祝你好运!"<<endl; Sleep(3000);if(kbhit()){char kk=getch();if(kk==9)f=5;} //如果执行,吃一颗星加5分system("cls");Snake s;menu();system("color 1a");s.output();while (true){char keydown = getch();if(keydown==32)getch();if(keydown==27)return 0;s.change_point(keydown);while (!kbhit()){clock_t start,end;start=clock();s.move();s.output();Sleep(t);end=clock();tt=(double)(end-start)/CLOCKS_PER_SEC;ss+=tt;cout<<" 时间:"<<(int)ss;}}return 0;}void menu(){ system("color 1a");cout << "\n\n\n 操作方法:上↑下↓左←右→";cout << "\n\n\n 暂停Space 退出Esc";cout << "\n\n\n\n 好天";cout << "\n\n 好天";cout << "\n\n 学向";cout << "\n\n 习上";}void gameover() //游戏结束后的信息以及操作{ system("cls");system("color 5e");cout<< "\n\n\n\n -_-。
sorry!你已经挂了!!!";cout<< "\n\n 你的最后战绩score:"<<score<<" 时间:"<<(int)ss;cout<< "\n\n 秽土转生请按:1 退出请按2";cout<< "\n\n make your chioce:";char keydown=getch();while(keydown!='1'&&keydown!='2'){system("cls");cout<< "\n\n\n\n\n 你的输入有误,请重新选择:秽土转生请按:1 退出请按2:";cout<< "\n\n make your chioce:";keydown=getch();}if(keydown=='1'){score=0;t=300;f=1;ss=0;tt=0;system("cls");main();}else if(keydown=='2')exit(0);}Snake::Snake(): head(0), tail(0), point(RIGHT), food_x(0), food_y(0){int i;for (i = 0; i < N; ++i){game[i][0] = game[i][N-1] = 1; //每行的第一列和最后一列赋为game[0][i] = game[N-1][i] = 1; //每行的第一行和最后一行赋为}head = tail;add_head(6, 4);add_head(6, 5);add_head(6, 6);greate_food();}Snake::~Snake(){while (head){Node *temp = head;head = head->next;delete temp;}}void Snake::add_head(int a, int b){Node *temp = new Node;temp->x = a;temp->y = b;if (NULL == head) //如果头结点为空,那么就将这个点设为头结点{head = tail = temp;}else //否则添加到头结点的前面,作为新的头结点{head->prior = temp;temp->next = head;head = head->prior; //这里head前移,使head一直指向头结点}game[a][b] = 1;}void Snake::delete_tail(){Node *temp = tail;game[tail->x][tail->y] = 0; //将该结点的坐标对应的值置为tail = tail->prior; //tail尾结点前移,删除保存了原来尾结点的temp; tail->next = NULL;delete temp;}{int i, j;gotoxy(0, 0);cout<< " 目前战绩score:"<<score<<endl; //分数统计for (i = 0; i < N; ++i){for (j = 0; j < N; ++j){if (1 == game[i][j]) //数组元素的值为则输出‘*’{cout << "* ";}else //否则输出空格,注意这里有两个空格,上面的*号后面也有一个空格{cout << " ";}}cout << endl; //每输出一行则换行输出}}void Snake::change_point(char keydown){p temp;switch (keydown){case 72: temp = UP; break;case 80: temp = DOWN; break;case 75: temp = LEFT; break;case 77: temp = RIGHT; break;default: temp = point; break;}if ((temp - point) % 2){point = temp;}}{int a = head->x;int b = head->y;switch (point){case UP: --a; break;case DOWN: ++a; break;case RIGHT: ++b; break;case LEFT: --b; break;}if (1 == game[a][b] && a != food_x && b != food_y) //碰到点了但不是食物那么死亡{ this->~Snake(); gameover();}if (a == food_x && b == food_y) //吃到食物了{add_head(a, b);score+=f;if(score%5==0&&t>0){t-=100;system("cls");if(score==15)cout<<"\n\n\n\n\n\n\n 太棒了,已经是最高时速了"<<endl;else cout<<"\n\n\n\n\n\n\n 很不错,要加速了,请小心!"<<endl;Sleep(3000);system("cls");menu();ss-=3;}greate_food();return;}add_head(a, b);delete_tail();}void Snake::greate_food(){srand(unsigned(time(0)));do{food_x = rand() % 21 + 1; //产生-21的随机数food_y = rand() % 21 + 1;} while (1 == game[food_x][food_y]); //对应的坐标已经有点存在就重新产生食物game[food_x][food_y] = 1; //食物坐标对应的值赋为}void Snake::gotoxy(int x, int y) //定位光标{HANDLE hOutput;COORD loc;loc.X = x;loc.Y = y;hOutput = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hOutput, loc);}。