c++控制台贪吃蛇

没有用c++编过图形界面的程序,一直不知道怎么开头;
所以就在网上下了一个c++控制台贪吃蛇,原来没有重复游戏的功能,就在原来的基础上加了个重复游戏的功能;

下面简单介绍一下:
贪吃蛇是一款经典游戏,既简单又耐玩。通过控制蛇头方向吃蛋,使得蛇变长,从而获得积分。
先看几张效果图:

c++控制台贪吃蛇

c++控制台贪吃蛇

c++控制台贪吃蛇


本程序共有三个类:fence(用 # 将周围的边框打印出来),snakeNode(在移动过程中,各个点的插入删除),move(控制
方向,生成食物以及检测是否撞墙);
//围墙类
class Fence{
public:
 void InitFence();
 void OutputF();
public:
 char game[20][20];
}f; //定义对象;
//画框框;
void Fence::InitFence(){
 for(int i=0; i<20; i++)
  for(int j=0; j<20; j++){
   if(i==0||i==19||j==0||j==19)
    game[i][j]= '#';
   else game[i][j]= ' ';
 }
}
//显示框框;
void Fence::OutputF(){
 for(int i=0; i<20; i++){
  for(int j=0; j<20; j++)
   cout<<game[i][j]<<' ';
   cout<<endl;
  }
}


//蛇结点类;
class SnakeNode{
private:
 int x,y;
 SnakeNode *prior,*next;
public:
 void add_head(int x,int y);
 int get_x();
 int get_y();
 void delete_tail();
}*head=NULL, *tail =NULL;
//插入头结点;
void SnakeNode::add_head(int x,int y){
 SnakeNode *q=new SnakeNode;
 q->x =x; q->y =y;
 q->next =head;
 q->prior =NULL;
 if(head) head->prior =q;
 head =q;
 if(!tail) tail =head;
 f.game[x][y]= '*';  //f对象可以在定义Fence类时定义; 且Fence类在SnakeNode类前定义;
}
int SnakeNode::get_x(){
 return x;
}
int SnakeNode::get_y(){
 return y;
}
//删除尾结点;
void SnakeNode::delete_tail(){
 SnakeNode *p =tail;
 f.game[tail->get_x()][tail->get_y()]= ' ';//把尾结点的坐标表示的'*'置为空格;
 if(tail==head)
  tail= head= NULL;
 else{
  tail= tail->prior;
  tail->next= NULL;
 }
 delete p;
}

//移动类
class move{
public:
 dir point;    //枚举变量point: 控制方向;
 int food_x;
 int food_y;
public:
 int moving();
 void change_point(char);  //改变方向;
 void get_food();
};

int move::moving(){
 int a,b;
 a= head->get_x();  //取得头结点横坐标
 b= head->get_y();  //头结点纵坐标
 switch(point){
 case up: --a; break;
 case down: ++a; break;
 case left: --b; break;
 case right: ++b; break;
 }
 if(a==19||b==19||a==0||b==0){    //判断是否撞墙;      
  cout<<"game over!!!"<<endl;
  return -1;
 // exit(0);
 }
 if(a==food_x && b==food_y){     //吃food;
  head->add_head(a,b);
  get_food();
 }
 else{
  head->add_head(a,b); //插入头结点;
  head->delete_tail(); //删除尾结点;
 }
 return 0;
}

void move::change_point(char keydown){
 switch(keydown){
 case 'w': point= up; break;
 case 's': point= down; break;
 case 'a': point= left; break;
 case 'd': point= right; break;
 }
}
void move::get_food(){
 srand((unsigned int) time(NULL)); //做种子(程序运行时间);
 food_x= rand()%18+1;
 food_y= rand()%18+1;
 f.game[food_x][food_y]= '*';
}

//主函数;
int main(){
    char x;
    int y;
     A:cout<<"Using 'w,s,a,d'to control direction!!!\n\n\n";
     //画框框和小蛇;
     move m;
     f.InitFence();
     head->add_head(8,3);
     head->add_head(8,4);
     head->add_head(8,5);
     m.get_food();
     f.OutputF();
     while (true){
     char keydown= getch(); //getch()返回键盘上读取的字符;包含头文件<conio.h>
     m.change_point(keydown);
     while(!kbhit()){ //判断有没有按键落下;
     system("cls");  //清屏函数;
     y = m.moving();
     if(y == -1)
     {
       delete[] tail;
       cout << "是否再来一局 y/n: ";
       cin >> x;
       if(x == 'y')
       {
           goto A;
       }
       else
       {
           exit(0);
       }
      }
      f.OutputF();
      Sleep(200);
      }
     }
     return 0;
}

说明:用 # 号表示边框, * 号表示贪吃蛇;


心得:这次周围很多同学用unity3d,还有很多同学用MFC,但是我都不会,明白了还有很多东西需要学。









你可能感兴趣的:(c++控制台贪吃蛇)