ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-09-23 23:03:19  阅读:184  来源: 互联网

标签:status head food next 贪吃蛇 纯手工 snake New 控制台


编程究极菜鸟时期的作品,放出来有点羞耻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;
} 

标签:status,head,food,next,贪吃蛇,纯手工,snake,New,控制台
来源: https://blog.csdn.net/NP_hard/article/details/120445191

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有