自己第一个真正意义上的C++程序

程序为 参考他人的思想,自己独自完成的 《贪食蛇》程序。虽然写的很烂,但想想好歹是自己第一个真正意义上的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' 分别控制 运动的 “上”,“下”,“左”,“右”


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值