程序为 参考他人的思想,自己独自完成的 《贪食蛇》程序。虽然写的很烂,但想想好歹是自己第一个真正意义上的C++程序。特别纪念一下,激励一下自己
1.my_snack.h
#ifndef MY_SNAKE_H_
#define MY_SNAKE_H_
#define UP 1001
#define DOWN 1002
#define LEFT 1003
#define RIGHT 1004
#define Hlenth 25 //水平方向
#define Vlenth 25 //竖直方向
#define Time 10000
typedef struct Snode
{
int x;
int y;
Snode *last;
Snode *next;//指向下一个节点
}Snode,*SnodeLnk;
class Snack
{
private:
SnodeLnk head;
int fx;
int fy;
int count;
int point;
public:
Snack();
~Snack();
void print();
void delay();
void add_head();
void del_last();
void eat_food();
void move();
void jud_die();
void food();
void key_move(char ch);
};
#endif
2. my_snack.cpp
#include <iostream>
#include <ctime>
#include "my_snake.h"
using namespace std;
int area[Hlenth][Vlenth]={0};
Snack::Snack()//起点(10,10)
{
int i;
point=RIGHT;
head=new Snode;
head->x=9;
head->y=8;
head->next=NULL;
head->last=NULL;
//fx=9;//测试
//fy=13;
//area[fx][fy]=1;
add_head();
add_head();
add_head();
add_head();
add_head();
add_head();
//meset() 数组为0
for (i=0;i<Hlenth;i++)
{
area[0][i]=1;
area[Vlenth-1][i]=1;
}
for (i=0;i<Vlenth;i++)
{
area[i][0]=1;
area[i][Hlenth-1]=1;
}
}
Snack::~Snack()
{
SnodeLnk p=NULL;
while (head)
{
p=head;
head=head->next;
delete p;
}
}
void Snack::add_head()
{
/* Snode Mypoint;
Mypoint.x=head->x;
Mypoint.y=head->y+1;
Mypoint.next=head;
Mypoint.last=NULL;
head=&Mypoint;*/ // 结点 为何不行???
/* SnodeLnk p;
p=new Snode;
p->x=head->x;
p->y=head->y+1;
p->next=head;
p->last=NULL;
head=p;*/ // 指针 通过
SnodeLnk p=new Snode;
switch(point)
{
case LEFT:
{
p->x=head->x;
p->y=head->y-1;
head->last=p;
p->next=head;
p->last=NULL;
head=p;
break;
}
case RIGHT:
{
p->x=head->x;
p->y=head->y+1;
head->last=p;
p->next=head;
p->last=NULL;
head=p;
break;
}
case DOWN:
{
p->x=head->x+1;
p->y=head->y;
head->last=p;
p->next=head;
p->last=NULL;
head=p;
break;
}
case UP:
{
p->x=head->x-1;
p->y=head->y;
head->last=p;
p->next=head;
p->last=NULL;
head=p;
break;
}
}
}
void Snack::del_last()
{
SnodeLnk q;
int m,n;
q=head;
while (q->next)//不是 结束
{
q=q->next;
}
m=q->x;
n=q->y;
area[m][n]=0;
q->last->next=NULL;
delete q;
}
void Snack::delay()
{
for (int i=0;i<Time;i++)
{
for (int j=0;j<Time;j++)
{
;;
}
}
}
void Snack::move()
{
add_head();
del_last();
}
void Snack::key_move(char ch)
{
switch(ch)
{
case 'w':
case 'W': if (point==DOWN)
{
break;
}
point=UP;
break;
case 's':
case 'S': if (point==UP)
{
break;
}
point=DOWN;
break;
case 'a':
case 'A': if (point==RIGHT)
{
break;
}
point=LEFT;
break;
case 'd':
case 'D':if(point==LEFT)
{
break;
}
point=RIGHT;
break;
default:
break;
}
}
void Snack::print()
{
int m,n;
SnodeLnk p=head;
while(p->next) //少打一个 最后一个
{
m=p->x;
n=p->y;
area[m][n]=1;
p=p->next;
}
m=p->x; //打 最后一个
n=p->y;
area[m][n]=1;
for(int i=0;i<Hlenth;i++)
{
for(int j=0;j<Vlenth;j++)
{
if (area[i][j]==1)
{
cout<<"*";
}
else
cout<<" ";
}
cout<<endl;
}
}
void Snack::food()
{
srand(unsigned int(time(0)));
fx=rand()%(Vlenth-3)+1;//确保落在框内
fy=rand()%(Vlenth-3)+1;
while(area[fx][fy]==1) //检查是否落在 蛇身上
{
fx=rand()%(Vlenth-3)+1;
fy=rand()%(Vlenth-3)+1;
}
area[fx][fy]=1;
//cout<<"fx:"<<fx<<" fy:"<<fy<<endl;
}
void Snack::eat_food()
{
if ((head->x==fx)&&(head->y==fy))
{
area[fx][fy]=0;
add_head();
food();
}
else{}
}
void Snack::jud_die()
{
int x,y,m,n;
SnodeLnk q;
q=head->next;
x=head->x;
y=head->y;
if (x==(Vlenth-1)||x==0||y==(Hlenth-1)||y==0)
{
cout<<"failed!\n";
this->~Snack();
exit(0);
}
while (q->next)
{
m=q->x;
n=q->y;
q=q->next;
if (m==x&&n==y)
{
cout<<"failed !\n";
this->~Snack();
exit(0);
}
}
m=q->x;//检查是否撞上尾巴
n=q->y;
if (m==x&&n==y)
{
cout<<"failed !\n";
this->~Snack();
exit(0);
}
}
3.main.cpp
#include "my_snake.h"
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
Snack snack;
char ch;
int i;
char count=0;
snack.food();
snack.print();
while (1)
{
ch=_getch();
snack.key_move(ch);
while(!_kbhit()) //没有键盘按下 无为0
{
snack.delay();
snack.delay();
snack.move();
system("cls");
snack.print();
snack.eat_food();
snack.jud_die();
//snack.print();
}
}
return 0;
}
游戏说明:按任意键“开始”。 通过 键盘的 ' W ', 'S ', 'A ' , 'D' 分别控制 运动的 “上”,“下”,“左”,“右”