閱讀751 返回首頁    go 阿裏雲 go 技術社區[雲棲]


貪吃蛇程序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

  上一篇:go 拓撲排序
  下一篇:go linux驅動開發--字符設備:通過cdd_cdev結構中的led變量區分是哪個節點,private_data使用