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