纯手工贪吃蛇 (纯c编写的控制台游戏)

2021/9/23 23:10:57

本文主要是介绍纯手工贪吃蛇 (纯c编写的控制台游戏),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

编程究极菜鸟时期的作品,放出来有点羞耻hhh
没什么厉害的地方,但是能跑!
对于编程菜鸟来说是非常有成就感的!

#include <iostream>
#include <ctime>
#include <windows.h>
#include <cstdlib>
#define null 0
#define up 1
#define left 2
#define down 3
#define right 4
using namespace std;

struct snakenode//定义蛇 
{
	int x,y;
	snakenode* next;
};
typedef snakenode* snake;//snake是指针型变量 
snake head=null,q=null,q1=null,food;//head为蛇的头,q用来遍历蛇的身体,初始时指向空 
int status=right;//为蛇的运动方向 
int score=-1;
int speed=100;

void Pos(int x,int y)//句柄,控制光标 
{
	COORD pos;
	HANDLE hOutput;
	pos.X=x;
	pos.Y=y;
	hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hOutput,pos);
}

void creatsnake()//创建一条以head为首,长度为四的蛇(没打印出来) 
{
	snake tail;
	tail=(snake)malloc(sizeof(snakenode));
	tail->x=24;
	tail->y=5;
	tail->next=null;
	for(int i=1;i<=4;i++)
	{
		head=(snake)malloc(sizeof(snakenode));
		head->x=24+i;
		head->y=5;
		head->next=tail;
		tail=head;
	}
}

void creatfood()
{
	food=(snake)malloc(sizeof(snakenode));
	srand((unsigned)time(NULL));//时间种子 
	food->x=rand()%56+1;//保证食物在边界内 
	food->y=rand()%22+1;
	food->next=null;
	score++;
	if(speed>=50)
	{
		speed-=5;
	}
}

int isfoodeat()
{
	int k=0;
	if(head->x==food->x&&head->y==food->y)//头和食物重叠 
	{
		k=1;
	}
	return k;
}

void mapprint()
{
	for(int i=0;i<58;i++)//打印横轴 
	{
		Pos(i,0);
		cout << "%";
		Pos(i,24);
		cout << "%";		
	}
	for(int i=0;i<24;i++)//打印纵轴 
	{
		Pos(0,i);
		cout << "%";
		Pos(58,i);
		cout << "%";		
	}
	cout << endl;	
}

void snakeprint()
{
	if(isfoodeat())//吃了食物,打印不少节点 
	{
		q=head;//让全局指针变量q指向蛇的头 
		while(q!=null)//q指向null时跳出循环 
		{
			Pos(q->x,q->y);
			cout << "@";
			q=q->next;
		}
	}
	else//没吃食物,每次打印都会少一个节点 
	{
		q=head;//让全局指针变量q指向蛇的头 
		while(q->next->next!=null)//q指向倒数第二个时跳出循环 
		{
			Pos(q->x,q->y);
			cout << "@";
			q=q->next;
		}
		Pos(q->x,q->y);//将倒数第二个打印出来 
		cout << "@";
		q1=q->next;//利用q1将最后一个节点free掉 
		q->next=null;//蛇的尾巴指向null 
		free(q1);
	}
}

void foodprint()
{
	if(isfoodeat())//如果食物被吃了 (head与food重叠) ,创建一个新食物 
	{
		free(food);//释放原来food的内存 
		creatfood();
	}
	else//如果食物没被吃,打印 
	{
		Pos(food->x,food->y);
		cout << '$';
	}
}

void scoreprint()
{
	Pos(70,12);
	cout << "score=" << score;
}

void movesnake()
{
	if(status==up)//向上爬 
	{
		snake New;//创建一个新节点
		New=(snake)malloc(sizeof(snakenode));
		New->x=head->x;
		New->y=(head->y)-1;
		New->next=head;
		head=New;//成功向前一步 
	}
	if(status==down)//向下爬 
	{
		snake New;//创建一个新节点
		New=(snake)malloc(sizeof(snakenode));
		New->x=head->x;
		New->y=(head->y)+1;
		New->next=head;
		head=New;//成功向前一步 
	}
	if(status==left)//向左爬 
	{
		snake New;//创建一个新节点
		New=(snake)malloc(sizeof(snakenode));
		New->x=(head->x)-1;
		New->y=(head->y);
		New->next=head;
		head=New;//成功向前一步 
	}	
	if(status==right)//向右爬 
	{
		snake New;//创建一个新节点
		New=(snake)malloc(sizeof(snakenode));
		New->x=(head->x)+1;
		New->y=(head->y);
		New->next=head;
		head=New;//成功向前一步 
	}	
}
void startgame()
{
	creatsnake();//创建一条链表蛇,先不打印 
	creatfood();//创建一个食物,先不打印 
}

int isdead()//撞墙死,咬自己死 
{
	int k=0;
	if(head->x==0||head->x==57||head->y==0||head->y==23)
	{
		k=1;
	}
	q=head->next;
	while(q!=0)
	{
		if(head->x==q->x&&head->y==q->y)
		{
			k=1;
		}
		q=q->next;
	}
	return k;
}

void stop()
{
	while(1)
	{
		if(GetAsyncKeyState(VK_SPACE))
		{
			break;
		}
	}
}

void gamecircle()
{
	while(1)//一直循环 
	{
		if(isdead())//死了 
		{
			break;//break出去就endgame了 
		}
		else
		{
			mapprint();
			snakeprint();
			foodprint();
			scoreprint();
			Sleep(speed);//暂停画面 
			system("cls");//清屏 
			if(GetAsyncKeyState(VK_UP)&&status!=down)//判断是否转向 
			{
				status=up;
			}
			else if(GetAsyncKeyState(VK_DOWN)&&status!=up)
			{
				status=down;
			}
			else if(GetAsyncKeyState(VK_LEFT)&&status!=right)
			{
				status=left;
			}
			else if(GetAsyncKeyState(VK_RIGHT)&&status!=left)
			{
				status=right;
			}
			else if(GetAsyncKeyState(VK_SPACE))
			{
				stop();
			}
			else if(GetAsyncKeyState(VK_ESCAPE))
			{
				break;
			}
			movesnake();
		}
    }
}

void freeall()
{
	free(food);
	q=head;
	while(q!=null)
	{
		q=q->next;
		free(head);
		head=q;
	}
}

void endgame()
{
	system("cls");
	Pos(24,6);
	cout << "gameover" << endl << "your score is " << score;
	freeall();
}

int main()
{
	startgame();
	gamecircle();
	endgame();
	return 0;
} 


这篇关于纯手工贪吃蛇 (纯c编写的控制台游戏)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程