貪吃蛇程序VS2012編譯成功
// libin.cpp : 定義控製台應用程序的入口點。 // #include "stdafx.h" #include<stdio.h> #include<windows.h> #include<time.h> #include<stdlib.h> struct Body//定義蛇身結構體 { short x,y;//蛇身結點的坐標 struct Body *next;//指向下一個結點的指針 }; ////////////////////全局變量///////////////////////////////////// int len=sizeof(struct Body);//Body結構體所占字節數 int score;//玩家得分 int Food=0;//1-有食物,0-沒食物 short food_x,food_y;//食物坐標 struct Body *body001;//蛇頭指針 int dir=4;//蛇頭方向1-up,2-down,3-left,4-right int sleeptime=220;//每次移動之後的停頓時間 ////////////////////////函數聲明///////////////////////////////////// void Pos(short x,short y); void CreatMap(); void PrintSnake(); void CreatFood(); void SnakeMove(); //int TouchWall();//不可穿牆 void CrossWall();//可以穿牆 int TouchSelf(); void Init(); void GameCircle(); void Pause(); void StartImage(); void EndImage(); ////////////////////////函數定義///////////////////////////////////// void Pos(short x,short y)//設置光標位置函數 { COORD pos; pos.X=x; pos.Y=y; HANDLE hOutput=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hOutput,pos); return; }//Pos void CreatMap()//打印地圖 { int i; for(i=0;i<57;i+=2)//打印上下邊框 { Pos(i,0); printf("■"); Pos(i,24); printf("■"); } for(i=1;i<24;i++)//打印左右邊框 { Pos(0,i); printf("■"); Pos(56,i); printf("■"); } return; }//CreatMap void PrintSnake()//打印蛇 { struct Body *p=body001; while(p!=NULL)//判斷是否指向蛇尾 { Pos(p->x,p->y); printf("■"); p=p->next; }//從蛇頭打印到蛇尾 return ; } void CreatFood()//創建新食物 { if(Food==0) { srand((int)time(0)); food_x=2+rand()%53;//x的取值範圍[2,54] if(food_x%2==1) food_x--; food_y=1+rand()%23;//y的取值範圍[1,23] Food=1;//1表明有食物,0表明沒食物 } return; }//CreatFood void SnakeMove()//蛇身移動、刷新蛇身和食物及其坐標 { struct Body *p_food;//下一格有食物 struct Body *p_forward;//下一格沒食物 struct Body *q;//蛇身移動一格時的臨時指針 p_forward=(struct Body *)malloc(len); if(1==dir)//向上移動 { if(body001->x==food_x && body001->y-1==food_y)//下一格有食物 { p_food=(struct Body *)malloc(len); p_food->x=food_x; p_food->y=food_y; p_food->next=body001; body001=p_food; score+=5; Pos(62,3);printf("分數:%d",score); Food=0; CreatFood(); Pos(62,7);printf("食物坐標: "); Pos(62,7);printf("食物坐標:%u,%u",food_x,food_y); } else//下一格沒有食物 { p_forward->x=body001->x;//橫坐標不變 p_forward->y=body001->y-1;//縱坐標-1 p_forward->next=body001; body001=p_forward; q=body001; while((q->next)->next!=NULL)//使q指向倒數第二個結點 q=q->next; Pos((q->next)->x,(q->next)->y);//移動光標到蛇尾 printf(" ");//刪除蛇尾 free(q->next); //釋放蛇尾 q->next=NULL;//使倒數第二個結點成為新的蛇尾 }//else } if(2==dir)//向下移動 { if(body001->x==food_x && body001->y+1==food_y)//下一格有食物 { p_food=(struct Body *)malloc(len); p_food->x=food_x; p_food->y=food_y; p_food->next=body001; body001=p_food; score+=5; Pos(62,3);printf("分數:%d",score); Food=0; CreatFood(); Pos(62,7);printf("食物坐標: "); Pos(62,7);printf("食物坐標:%u,%u",food_x,food_y); } else//下一格沒有食物 { p_forward->x=body001->x;//橫坐標不變 p_forward->y=body001->y+1;//縱坐標+1 p_forward->next=body001; body001=p_forward; q=body001; while((q->next)->next!=NULL)//使q指向倒數第二個結點 q=q->next; Pos((q->next)->x,(q->next)->y);//移動光標到蛇尾 printf(" ");//刪除蛇尾 free(q->next); //釋放蛇尾 q->next=NULL;//使倒數第二個結點成為新的蛇尾 }//else } if(3==dir)//向左移動 { if(body001->x-2==food_x && body001->y==food_y)//下一格有食物 { p_food=(struct Body *)malloc(len); p_food->x=food_x; p_food->y=food_y; p_food->next=body001; body001=p_food; score+=5; Pos(62,3);printf("分數:%d",score); Food=0; CreatFood(); Pos(62,7);printf("食物坐標: "); Pos(62,7);printf("食物坐標:%u,%u",food_x,food_y); } else//下一格沒有食物 { p_forward->x=body001->x-2;//橫坐標-2 p_forward->y=body001->y;//縱坐標不變 p_forward->next=body001; body001=p_forward; q=body001; while((q->next)->next!=NULL)//使q指向倒數第二個結點 q=q->next; Pos((q->next)->x,(q->next)->y);//移動光標到蛇尾 printf(" ");//刪除蛇尾 free(q->next); //釋放蛇尾 q->next=NULL;//使倒數第二個結點成為新的蛇尾 }//else } if(4==dir)//向右移動 { if(body001->x+2==food_x && body001->y==food_y)//下一格有食物 { p_food=(struct Body *)malloc(len); p_food->x=food_x; p_food->y=food_y; p_food->next=body001; body001=p_food; score+=5; Food=0; Pos(62,3);printf("分數:%d",score); CreatFood(); Pos(62,7);printf("食物坐標: "); Pos(62,7);printf("食物坐標:%u,%u",food_x,food_y); } else//下一格沒有食物 { p_forward->x=body001->x+2;//橫坐標=2 p_forward->y=body001->y;//縱坐標不變 p_forward->next=body001; body001=p_forward; q=body001; while((q->next)->next!=NULL)//使q指向倒數第二個結點 q=q->next; Pos((q->next)->x,(q->next)->y);//移動光標到蛇尾 printf(" ");//刪除蛇尾 free(q->next); //釋放蛇尾 q->next=NULL;//使倒數第二個結點成為新的蛇尾 }//else } Pos(62,9);printf("蛇頭坐標: "); Pos(62,9);printf("蛇頭坐標:%u,%u",body001->x,body001->y);//打印蛇頭坐標 Pos(food_x,food_y);printf("■");//打印食物 PrintSnake();//打印蛇 } /*int TouchWall()//不可穿牆 { if(body001->x==0 || body001->x==56 || body001->y==0 || body001->y==24) return 1; else return 0; }//TouchWall*/ void CrossWall()//可以穿牆 { if(0==body001->x)//左進右出 { body001->x=54; if(food_x==body001->x && food_y==body001->y) food_x-=2; } if(56==body001->x)//右進左出 { body001->x=2; if(food_x==body001->x && food_y==body001->y) food_x+=2; } if(0==body001->y)//上進下出 { body001->y=23; if(food_x==body001->x && food_y==body001->y) food_y--; } if(24==body001->y)//下進上出 { body001->y=1; if(food_x==body001->x && food_y==body001->y) food_y++; } return; } int TouchSelf()//判斷是否咬到自己 { struct Body *p_tself; p_tself=body001; while(!p_tself->next==NULL) { p_tself=p_tself->next; if(p_tself->x==body001->x && p_tself->y==body001->y) return 1; } return 0; } void Init()//遊戲初始化 { CreatMap();//打印地圖 Pos(62,1);printf("作者:李斌"); Pos(62,3);printf("分數:%d",score); Pos(62,5);printf("速度: "); Pos(62,5);printf("速度:%d",20+300-sleeptime); Pos(62,13);printf("F1 加速"); Pos(62,15);printf("F2 減速"); Pos(62,17);printf("↑ ↓ ← →方向"); Pos(62,19);printf("SPACE 暫停/開始"); Pos(62,21);printf("ESC 退出"); Pos(62,23);printf("QQ:1010305129"); struct Body *body002,*body003,*body004;//定義四個指向蛇身的指針 body001=(struct Body *)malloc(len);//創建4個蛇身結構體 body002=(struct Body *)malloc(len); body003=(struct Body *)malloc(len); body004=(struct Body *)malloc(len); body001->next=body002;//把蛇身連接起來,形成鏈表 body002->next=body003; body003->next=body004; body004->next=NULL; Pos(body001->x=12,body001->y=8);printf("■");//設定並打印蛇身的初始位置 Pos(body002->x=10,body002->y=8);printf("■"); Pos(body003->x=8,body003->y=8);printf("■"); Pos(body004->x=6,body004->y=8);printf("■"); CreatFood();//打印食物 Pos(62,7);printf("食物坐標: "); Pos(62,7);printf("食物坐標:%u,%u",food_x,food_y); } void Pause() { while(1) { Sleep(600); if(GetAsyncKeyState(VK_SPACE)) break; } return; } void GameCircle()//遊戲循環 { while(1) { // if (1== TouchWall() )//不可穿牆 // break;//撞牆Game Over CrossWall();//可以穿牆 if(1== TouchSelf() )//判斷蛇是否咬到自己 break;//咬到自己Game Over //判斷用戶的按鍵輸入 // int dir=4; if(GetAsyncKeyState(VK_UP) && dir!=2) dir=1; else if(GetAsyncKeyState(VK_DOWN) && dir!=1) dir=2; else if(GetAsyncKeyState(VK_LEFT) && dir!=4) dir=3; else if(GetAsyncKeyState(VK_RIGHT) && dir!=3) dir=4; else if(GetAsyncKeyState(VK_ESCAPE)) break; else if(GetAsyncKeyState(VK_SPACE)) Pause(); else if(GetAsyncKeyState(VK_F1))//加速 { if(sleeptime>=110) sleeptime-=10; Pos(62,5);printf("速度: "); Pos(62,5);printf("速度:%d",20+300-sleeptime); } else if(GetAsyncKeyState(VK_F2))//減速 { if(sleeptime<=290) sleeptime+=10; Pos(62,5);printf("速度: "); Pos(62,5);printf("速度:%d",20+300-sleeptime); } SnakeMove();//蛇移動一格 Sleep(sleeptime);//設定兩次移動之間的時間間隔 } } void StartImage() { Pos(28,6); printf("李斌,邀請你玩貪吃蛇"); Pos(28,11); printf("貪吃蛇 作者:李斌"); Pos(21,23); printf("2013.12.27晚於西安文理學院二號公寓"); Pos(28,13); system("pause"); system("cls"); Pos(25,9); printf("-->終於編譯成功啦<--"); Pos(21,23); printf("2013.12.27晚於西安文理學院二號公寓"); Pos(26,13); system("pause"); system("cls"); } void EndImage() { system("cls"); Pos(30,9);printf("遊戲結束,歡迎再來!"); Pos(30,11);printf("你的得分:%d",score); Pos(30,16);printf("娃,你還得繼續努力啊!"); Pos(20,23);printf("2013.12.27晚於西安文理學院二號公寓"); Pos(28,13); system("pause"); } /////////////////////////main函數//////////////////////////////////////// int main(void) { StartImage();//開始畫麵 Init();//界麵初始化 GameCircle();//遊戲循環 EndImage();//結束畫麵 return 0; }
演示效果:
最後更新:2017-04-03 12:53:59