21xrx.com
2025-04-01 12:17:45 Tuesday
文章检索 我的文章 写文章
C++贪吃蛇代码及解析复制
2023-07-12 06:07:20 深夜i     18     0
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++编辑器中,就可以体验贪吃蛇的乐趣啦!

  
  

评论区

请求出错了