21xrx.com
2024-06-03 06:46:10 Monday
登录
文章检索 我的文章 写文章
C++贪吃蛇代码及解析复制
2023-07-12 06:07:20 深夜i     --     --
C++ 贪吃蛇 代码 解析 复制

贪吃蛇是一款经典的游戏,大概在20世纪90年代被广泛流传开来,至今依然备受欢迎。今天我们来分享一份C++语言实现的贪吃蛇代码及解析。

代码如下:


#include<iostream>

#include<conio.h>

#include<Windows.h>

using namespace std;

const int Width = 30;

const int Height = 20;

struct Snakey;

s[100];

struct Food

  int x;

int SnakeLen,Map[Width+5][Height+5],xf,yf,Direction,Score;

void ShowScreen();

void ShowInfo();

void GameStart(){

  memset(Map,0,sizeof(Map));

  SnakeLen=5;

  Score=0;

  for(int i=0;i<SnakeLen;i++){

    s[i].x=10-i;

    s[i].y=10;

    Map[s[i].x][s[i].y]=i<SnakeLen-1?1:2;

  }

  xf=rand()%Width+1;

  yf=rand()%Height+1;

  Map[xf][yf]=3;

  ShowScreen();

  ShowInfo();

}

void SnakeMove(){

  int x1=s[0].x,y1=s[0].y;

  Map[x1][y1]=0;

  for(int i=1;i<SnakeLen;i++){

    int x2=s[i].x,y2=s[i].y;

    s[i].x=x1;s[i].y=y1;

    Map[x1][y1]=i<SnakeLen-1?1:2;

    x1=x2;y1=y2;

  }

  if(Direction==1)s[0].y--;

  if(Direction==2)s[0].y++;

  if(Direction==3)s[0].x--;

  if(Direction==4)s[0].x++;

  if(Map[s[0].x][s[0].y]==1){

    cout<<"GAME OVER!"<<endl;

    exit(0);

  }

  if(Map[s[0].x][s[0].y]==3){

    SnakeLen++;

    Score+=10;

    Map[s[0].x][s[0].y]=2;

    xf=rand()%Width+1;

    yf=rand()%Height+1;

    Map[xf][yf]=3;

    ShowInfo();

  }

  if(s[0].x<1||s[0].x>Width||s[0].y<1||s[0].y>Height){

    cout<<"GAME OVER!"<<endl;

    exit(0);

  }

  Map[s[0].x][s[0].y]=2;

  ShowScreen();

}

void KeyDown(int x){

  if((x==1&&Direction==2)||(x==2&&Direction==1)

    ||(x==3&&Direction==4)||(x==4&&Direction==3))

    return;

  Direction=x;

}

int main(){

  GameStart();

  while(1){

    Sleep(150);

    if(_kbhit()){

      int c=_getch();

      if(c==72)KeyDown(1);

      if(c==80)KeyDown(2);

      if(c==75)KeyDown(3);

      if(c==77)KeyDown(4);

    }

    SnakeMove();

  }

  return 0;

}

void ShowScreen(){

  system("cls");

  for(int i=0;i<=Height+1;i++){

    for(int j=0;j<=Width+1;j++){

      if(i==0||i==Height+1)cout<<"#";

      else if(j==0||j==Width+1)cout<<"#";

      else if(Map[j][i]==2)cout<<"@";

      else if(Map[j][i]==3)cout<<"%";

      else cout<<" ";

    }

    cout<<endl;

  }

}

void ShowInfo()

  cout<<"LENGTH: "<<SnakeLen<<"  SCORE: "<<Score<<endl;

  cout<<"Press Arrow Up/Down/Left/Right to control."<<endl;

这份代码采用了结构体来表示蛇和食物的坐标。其中,Snake结构体用于存储蛇的每个节点的坐标,包括横纵坐标。而Food结构体则用于存储食物的坐标。

在代码中,我们使用了一个二维数组Map来存储游戏地图。其中,Map[i][j]表示第i行第j列的内容,0表示该位置为空,1表示该位置为蛇身体,2表示该位置为蛇头,3表示该位置有食物。

代码的主要函数包括:

1. GameStart:初始化游戏,包括地图,蛇的长度,分数等。

2. SnakeMove:移动蛇的函数,包括移动和碰撞检测等。

3. KeyDown:处理按键事件。

在主函数中,我们采用一个死循环来执行游戏,首先我们使用_kbhit函数判断是否有键盘输入。如果有,我们使用_getch函数获取用户输入的按键,运用KeyDown函数处理按键事件。然后执行SnakeMove函数。

最后,我们分别设计了两个函数来展示游戏屏幕和游戏信息。

如果你想使用该代码,只需复制粘贴到C++编辑器中,就可以体验贪吃蛇的乐趣啦!

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复