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

搬瓦工VPS:高端线路,助力企业运营,10Gbps美国 cn2 gia,1Gbps香港cn2 gia,10Gbps日本软银

搬瓦工vps(bandwagonhost)现在面向中国大陆有3条顶级线路:美国 cn2 gia,香港 cn2 gia,日本软银(softbank)。详细带宽是:美国cn2 gia、日本软银,都是2.5Gbps~10Gbps带宽,香港 cn2 gia为1Gbps带宽,搬瓦工是目前为止,全球所有提供这三种带宽的VPS(云服务器)商家里面带宽最大的,成本最高的,没有第二家了! 官方网站:https...

HostSailor:罗马尼亚机房,内容宽松;罗马尼亚VPS七折优惠,罗马尼亚服务器95折

hostsailor怎么样?hostsailor成立多年,是一家罗马尼亚主机商家,机房就设在罗马尼亚,具说商家对内容管理的还是比较宽松的,商家提供虚拟主机、VPS及独立服务器,今天收到商家推送的八月优惠,针对所有的产品都有相应的优惠,商家的VPS产品分为KVM和OpenVZ两种架构,OVZ的比较便宜,有这方面需要的朋友可以看看。点击进入:hostsailor商家官方网站HostSailor优惠活动...

Tudcloud(月付7.2美元),香港VPS,可选大带宽或不限流量

Tudcloud是一家新开的主机商,提供VPS和独立服务器租用,数据中心在中国香港(VPS和独立服务器)和美国洛杉矶(独立服务器),商家VPS基于KVM架构,开设在香港机房,可以选择限制流量大带宽或者限制带宽不限流量套餐。目前提供8折优惠码,优惠后最低每月7.2美元起。虽然主机商网站为英文界面,但是支付方式仅支付宝和Stripe,可能是国人商家。下面列出部分VPS主机套餐配置信息。CPU:1cor...

贪吃蛇程序为你推荐
云仓库管理系统WMS仓库管理系统哪家好?有推荐的吗?流动比率计算公式流动比率和速动比率的公式四川大学教务系统川大创新学分怎么得?新中大软件scratch软件是干什么的象形文字图片象形字有哪些?宾馆客房管理系统什么是酒店客房智能控制系统 ???交通信号灯控制系统求一完成的红绿灯PLC设计,要求有图和简单原理锁云《骗子X攻略X穿越》写的是什么内容?csol进不去CSOL怎么进不去游戏?华为会议终端华为会议电视终端怎么调节摄像头水平
重庆服务器租用 域名服务器上存放着internet主机的 中文域名申请 hawkhost优惠码 老左博客 sub-process ca4249 数字域名 电子邮件服务器 169邮箱 息壤代理 免费phpmysql空间 重庆双线服务器托管 爱奇艺vip免费领取 鲁诺 个人免费主页 优酷黄金会员账号共享 云销售系统 网站防护 zcloud 更多