贪吃蛇程序求贪吃蛇的程序代码(c语言)

贪吃蛇程序  时间:2022-03-02  阅读:()

贪吃蛇编程

这里有我以前敲过的贪吃蛇,不介意可以参考一下,(ps:需要建一了application而不是console application) #include #include #include #include #define speed 200 #define left 100 # 50 #define right 500 #define bottom 350 struct snake { POINT pos; snake *front,*next; }; LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); bool InitWindow(HINSTANCE,int); void items(HDC,int,int); void MoveSnake(int); void remove(); void destroy(); void inf(int,int,int,int); void inf(const char*,int,int,int,int); void inf(const char*,int,int,int); bool is_fail(); void eat(); void wall(); void show_fruit(); UINT ShowMode; PAINTSTRUCT ps; bool onoff; HFONT hf; char judge[20]; int dir; HDC hdc; HWND hwnd; HBRUSH BlackBrush,MainBrush,NULLBrush; HPEN MainPen,BlackPen; snake *head,*tail,*temp; POINT fruit; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { onoff=1; int i; dir=-2; tail=NULL; InitWindow(hInstance,nCmdShow); for(i=0;i<5;i++) { if(!tail) { head=new snake; tail=head; head->pos.x=300+i*10; head->pos.y=200; items(hdc,head->pos.x,head->pos.y); } else { tail->next=new snake; tail->next->front=tail; tail=tail->next; tail->pos.x=300+i*10; tail->pos.y=200; tail->next=NULL; items(hdc,tail->pos.x,tail->pos.y); } } hf=CreateFont(20,0,0,0,400,0,0,0,GB2312_CHARSET, OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,"华文行楷"); SelectObject(hdc,hf); SetBkColor(hdc,RGB(124,146,131)); SelectObject(hdc,MainBrush); wall(); show_fruit(); inf("得分:",260,0,0); MSG msg; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } destroy(); return 0; } LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) { static int seed=15; switch(msg) { case WM_TIMER: MoveSnake(dir); if(!is_fail()) { KillTimer(hwnd,1); MessageBox(hwnd,"you are lost","caption",0); } eat(); break; case WM_PAINT: hdc=BeginPaint(hwnd,&ps); wall(); EndPaint(hwnd,&ps); hdc=GetDC(hwnd); case WM_KEYDOWN: switch(wParam) { case VK_UP:dir=(dir!=1?-1:dir);break; case VK_DOWN:dir=(dir!=-1?1:dir);break; case VK_RIGHT:dir=(dir!=-2?2:dir);break; case VK_LEFT:dir=(dir!=2?-2:dir);break; } break; case WM_CLOSE: if(MessageBox(hwnd,"确定退出?","caption",MB_YESNO)==IDYES) DestroyWindow(hwnd); break; case WM_DESTROY: ReleaseDC(hwnd,hdc); KillTimer(hwnd,1); PostQuitMessage(0); break; default:return DefWindowProc(hwnd,msg,wParam,lParam); } return 1; } bool InitWindow(HINSTANCE hInstance,int nCmdShow) { WNDCLASS wc; wc.style=CS_HREDRAW | CS_VREDRAW; wc.lpszClassName="test"; wc.lpszMenuName=NULL; wc.cbClsExtra=0; wc.cbWndExtra=0; wc.hbrBackground=CreateSolidBrush(RGB(124,146,131)); wc.hIcon=NULL; wc.hCursor=LoadCursor(NULL,IDC_ARROW); wc.hInstance=hInstance; wc.lpfnWndProc=WndProc; MainBrush=CreateSolidBrush(RGB(124,146,131)); BlackBrush=(HBRUSH)GetStockObject(BLACK_BRUSH); NULLBrush=(HBRUSH)GetStockObject(NULL_BRUSH); MainPen=CreatePen(PS_SOLID,1,RGB(124,146,131)); BlackPen=CreatePen(PS_SOLID,1,RGB(0,0,0)); if(!RegisterClass(&wc)) return false; hwnd=CreateWindow("test","贪吃蛇",WS_SYSMENU,400,150,616,400,NULL,NULL,hInstance,NULL); hdc=BeginPaint(hwnd,&ps); if(!hwnd) return false; ShowWindow(hwnd,SW_SHOWNORMAL); UpdateWindow(hwnd); SetTimer(hwnd,1,speed,NULL); return true; } void items(HDC hdc,int x,int y) { SelectObject(hdc,BlackPen); SelectObject(hdc,NULLBrush); Rectangle(hdc,x,y,x+10,y+10); SelectObject(hdc,BlackBrush); Rectangle(hdc,x+2,y+2,x+8,y+8); // DeleteObject(BlackPen); // DeleteObject(BlackBrush); } void MoveSnake(int dir) { static int i=0; remove(); tail=tail->front; delete tail->next; tail->next=NULL; temp=new snake; temp->next=head; head->front=temp; temp->pos.x=head->pos.x+(dir/2)*10; temp->pos.y=head->pos.y+(dir%2)*10; head=temp; i++; items(hdc,head->pos.x,head->pos.y); } void remove() { SelectObject(hdc,MainBrush); SelectObject(hdc,MainPen); Rectangle(hdc,tail->pos.x,tail->pos.y,tail->pos.x+10,tail->pos.y+10); // DeleteObject(MainBrush); // DeleteObject(MainPen); } void destroy() { while(head->next) { head=head->next; delete head->front; } delete tail; } void inf(int x,int y,int px,int py) { inf("",x,y,px,py); } void inf(const char*str,int x,int y,int scores) { sprintf(judge,"%s%d",str,scores); TextOut(hdc,x,y,judge,strlen(judge)); } void inf(const char*str,int x,int y,int px,int py) { sprintf(judge,"%s(%d,%d) ",str,px,py); TextOut(hdc,x,y,judge,strlen(judge)); } bool is_fail() { temp=head; int px=head->pos.x,py=head->pos.y; if(px=right||||py>=bottom) return 0; while(temp->next) { temp=temp->next; if(px==temp->pos.x&&py==temp->pos.y) return 0; } return 1; } void show_fruit() { srand((UINT)time(NULL)); fruit.x=10*((rand()%(right-left-10))/10)+left; fruit.y=10*((rand()%(-10))/10); items(hdc,fruit.x,fruit.y); } void eat() { inf("食物:",0,25,fruit.x,fruit.y); inf("蛇头:",0,0,head->pos.x,head->pos.y); static int scores=0; if(head->pos.x==fruit.x&&head->pos.y==fruit.y) { scores++; inf("得分:",260,0,scores); KillTimer(hwnd,1); temp=new snake; temp->next=head; head->front=temp; temp->pos.x=head->pos.x+(dir/2)*10; temp->pos.y=head->pos.y+(dir%2)*10; head=temp; items(hdc,head->pos.x,head->pos.y); SetTimer(hwnd,1,speed,NULL); show_fruit(); } } void wall() { SelectObject(hdc,MainBrush); Rectangle(hdc,-1,right+1,bottom+1); // DeleteObject(MainBrush); }

求贪吃蛇的程序代码(c语言)

贪吃蛇游戏的代码 #define N 200 #include <graphics.h> #include <stdlib.h> #include <dos.h> #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define ESC 0x011b int i,key; int score=0;/*得分*/ int gamespeed=50000;/*游戏速度自己调整*/ 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 Init(void);/*图形驱动*/ void Close(void);/*图形结束*/ void DrawK(void);/*开始画面*/ void GameOver(void);/*结束游戏*/ void GamePlay(void);/*玩游戏具体过程*/ void PrScore(void);/*输出成绩*/ /*主函数*/ void main(void) { Init();/*图形驱动*/ DrawK();/*开始画面*/ GamePlay();/*玩游戏具体过程*/ Close();/*图形结束*/ } /*图形驱动*/ void Init(void) { int gd=DETECT,gm; initgraph(&gd,&gm,"c:\tc"); cleardevice(); } /*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/ void DrawK(void) { /*setbkcolor(LIGHTGREEN);*/ 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(void) { 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)/*可以重复玩游戏,压ESC键结束*/ { while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/ { if(food.yes==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.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]; } /*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;i<snake.node;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<snake.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==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; }/*endwhile(1)*/ } /*游戏结束*/ void GameOver(void) { cleardevice(); PrScore(); 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,"score:%d",score); outtextxy(55,20,str); } /*图形结束*/ void Close(void) { getch(); closegraph(); } 程序结束,请采纳

美国G口/香港CTG/美国T级超防云/湖北高防云服务器物理机促销活动 六一云

六一云 成立于2018年,归属于西安六一网络科技有限公司,是一家国内正规持有IDC ISP CDN IRCS电信经营许可证书的老牌商家。大陆持证公司受大陆各部门监管不好用支持退款退现,再也不怕被割韭菜了!主要业务有:国内高防云,美国高防云,美国cera大带宽,香港CTG,香港沙田CN2,海外站群服务,物理机,宿母鸡等,另外也诚招代理欢迎咨询。官网www.61cloud.net最新直销劲爆...

RackNerd 黑色星期五5款年付套餐

RackNerd 商家从2019年上线以来争议也是比较大的,一直低价促销很多网友都认为坚持时间不长可能会跑路。不过,目前看到RackNerd还是在坚持且这次黑五活动也有发布,且活动促销也是比较多的,不过对于我们用户来说选择这些低价服务商尽量的不要将长远项目放在上面,低价年付套餐服务商一般都是用来临时业务的。RackNerd商家这次发布黑五促销活动,一共有五款年付套餐,涉及到多个机房。最低年付的套餐...

火数云 55元/月BGP限时三折,独立服务器及站群限时8折,新乡、安徽、香港、美国

火数云怎么样?火数云主要提供数据中心基础服务、互联网业务解决方案,及专属服务器租用、云服务器、专属服务器托管、带宽租用等产品和服务。火数云提供洛阳、新乡、安徽、香港、美国等地骨干级机房优质资源,包括BGP国际多线网络,CN2点对点直连带宽以及国际顶尖品牌硬件。专注为个人开发者用户,中小型,大型企业用户提供一站式核心网络云端服务部署,促使用户云端部署化简为零,轻松快捷运用云计算!多年云计算领域服务经...

贪吃蛇程序为你推荐
深圳erp请问深圳值得信赖的ERP公司都要哪些?充电宝摄像机移动电源如何接入摄像机宾馆客房管理系统什么是酒店客房智能控制系统 ???女网管我想问一下 谁做过女网管 觉的好做吗平顶山教务管理系统平顶山工业职业技术学院怎么查分csol进不去急!急!为什么反恐精英online进不去游戏,到输入帐号之前的地方就无响应了?l六间房六间房秀场怎么赚钱华为会议终端华为终端视屏会议可以同时输出三路视频信号吗web移动端开发web移动端开发和PC端的区别fusioninsight什么是MAYA FUSION?怎么又跑出来一个DFusion?两者什么区别?
过期域名抢注 dns是什么 plesk awardspace tier 圣迭戈 e蜗牛 ntfs格式分区 刀片式服务器 美国网站服务器 smtp服务器地址 免备案cdn加速 好看的空间 锐速 酷锐 腾讯服务器 免费网络电视软件 丹弗润滑油 腾讯qq空间登录首页 web服务器硬件配置 更多