贪吃蛇程序求贪吃蛇的程序代码(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(); } 程序结束,请采纳
Ceraus数据成立于2020年底,基于KVM虚拟架构技术;主营提供香港CN2、美国洛杉矶CN2、日本CN2的相关VPS云主机业务。喜迎国庆香港上新首月五折不限新老用户,cera机房,线路好,机器稳,适合做站五折优惠码:gqceraus 续费七五折官方网站:https://www.ceraus.com香港云内存CPU硬盘流量宽带优惠价格购买地址香港云2G2核40G不限5Mbps24元/月点击购买...
提速啦(www.tisula.com)是赣州王成璟网络科技有限公司旗下云服务器品牌,目前拥有在籍员工40人左右,社保在籍员工30人+,是正规的国内拥有IDC ICP ISP CDN 云牌照资质商家,2018-2021年连续4年获得CTG机房顶级金牌代理商荣誉 2021年赣州市于都县创业大赛三等奖,2020年于都电子商务示范企业,2021年于都县电子商务融合推广大使。资源优势介绍:Ceranetwo...
RAKsmart发布了新年钜惠活动,即日起到2月28日,商家每天推出限量服务器秒杀,美国服务器每月30美元起,新上了韩国服务器、GPU服务器、香港/日本/美国常规+站群服务器、1-10Gbps不限流量大带宽服务器等大量库存;VPS主机全场提供7折优惠码,同时针对部分特惠套餐无码直购每月仅1.99美元,支持使用PayPal或者支付宝等方式付款,有中英文网页及客服支持。爆款秒杀10台/天可选精品网/大...
贪吃蛇程序为你推荐
交通流请问什么是渠化交通?渠化的概念是什么?深圳erp深圳地区在手机方案行业做得好的ERP公司有哪些?深圳erp请问深圳值得信赖的ERP公司都要哪些?内蒙古工业大学地址内蒙古工业大学的校区简介女网管石家庄女网管怎么啦交通信号灯控制系统如何控制交通信号灯超声波探测桩基超声波检测是什么?华为会议终端华为会议电视终端怎么调节摄像头水平云龙数码芜湖云龙数码怎么样?会不会私自更换手机配件?网络培训系统有哪些公司是针对远程教育培训系统软件的?
虚拟主机申请 便宜虚拟主机 个人注册域名 a2hosting 新世界机房 息壤备案 香港机房 韩国空间 mach paypal认证 win8升级win10正式版 申请空间 天互数据 秒杀汇 河南移动网 web服务器安全 百度云加速 我的世界服务器ip 帽子云排名 创速 更多