贪吃蛇程序求贪吃蛇的程序代码(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(); } 程序结束,请采纳

CloudCone:洛杉矶MC机房KVM月付1.99美元起,支持支付宝/PayPal

CloudCone是一家成立于2017年的国外VPS主机商,提供独立服务器租用和VPS主机,其中VPS基于KVM架构,多个不同系列,譬如常规VPS、大硬盘VPS等等,数据中心在洛杉矶MC机房。商家2021年Flash Sale活动继续,最低每月1.99美元,支持7天退款到账户,支持使用PayPal或者支付宝付款,先充值后下单的方式。下面列出几款VPS主机配置信息。CPU:1core内存:768MB...

江苏云服务器 2H2G 20M 79元/月 大宽带159元/月 高性能挂机宝6元/月 香港CN2 GIA、美国200G防御 CN2 GIA 折后18元/月 御速云

介绍:御速云成立于2021年的国人商家,深圳市御速信息技术有限公司旗下品牌,为您提供安全可靠的弹性计算服务,随着业务需求的变化,您可以实时扩展或缩减计算资源,使用弹性云计算可以极大降低您的软硬件采购成本,简化IT运维工作。主要从事VPS、虚拟主机、CDN等云计算产品业务,适合建站、新手上车的值得选择,拥有华东江苏、华东山东等国内优质云产品;香港三网直连(电信CN2GIA联通移动CN2直连);美国高...

腾讯云轻量服务器两款低价年付套餐 2核4GB内存8M带宽 年74元

昨天,有在"阿里云秋季促销活动 轻量云服务器2G5M配置新购年60元"文章中记录到阿里云轻量服务器2GB内存、5M带宽一年60元的活动,当然这个也是国内机房的。我们很多人都清楚备案是需要接入的,如果我们在其他服务商的域名备案的,那是不能解析的。除非我们不是用来建站,而是用来云端的,是可以用的。这不看到其对手腾讯云也有推出两款轻量服务器活动。其中一款是4GB内存、8M带宽,这个比阿里云还要狠。这个真...

贪吃蛇程序为你推荐
蜜桃最新网址哪个网站的新连续剧最新最好看陕西理工学院地址陕西理工学院在哪产品涨价通知调价通知函怎么写杭州工作室杭州有特色的工作室?哪家拍婚纱照服务好?杭州工作室我想找杭州最好的摄影工作室天津职业大学地址天津职业大学,怎么样,多少分能进去。天津职业大学地址天津职业大学简介是?csol进不去为什么我下了csol打不开cmnet设置怎么设置CMNET接入点?超声波探测什么情况下要超声波探伤?
工信部域名备案 中国万网虚拟主机 qq云存储 sharktech awardspace 主机点评 秒解服务器 webhostingpad sugarsync 美国主机论坛 免费ftp空间 骨干网络 合租空间 网站卫士 服务器合租 申请网站 网页提速 阿里云免费邮箱 卡巴斯基官网下载 netvigator 更多