21xrx.com
2024-12-22 23:43:49 Sunday
登录
文章检索 我的文章 写文章
"C++编程实现贪吃蛇游戏 - 支持WSAD控制且计算得分"
2023-06-26 17:29:27 深夜i     --     --
C++编程 贪吃蛇游戏 WSAD控制 计算得分 实现

贪吃蛇游戏是一款经典的游戏,它是由贪吃蛇通过不断吃食物增长身体的过程。现在我们可以使用C++语言来编写一个贪吃蛇游戏,支持WSAD控制,同时还能计算得分。

首先,我们需要定义一些游戏的基本参数。这些参数包括游戏界面的大小、每个部分的大小、贪吃蛇的起始位置和长度、食物的位置、以及游戏得分等。我们可以使用C++中的结构体来存储这些参数。

struct GameParams

  int width;

  int height;

  int part_size;

  int snake_size;

  int food_x;

  int food_y;

  int score;

  std::deque

在游戏开始之前,我们的贪吃蛇只有一个头部。我们可以让贪吃蛇从游戏界面的中心开始,头部的位置可以通过计算得出。

void init_snake_pos(GameParams& params){

  int x = params.width / 2;

  int y = params.height / 2;

  params.snake_pos.push_back(std::make_pair(x, y));

}

接下来,我们需要在界面上生成食物。我们可以使用随机数来生成食物的位置。食物的位置必须位于游戏界面内,同时不能和贪吃蛇身体的任何一部分重合。

void init_food_pos(GameParams& params){

  std::random_device rd;

  std::mt19937 gen(rd());

  std::uniform_int_distribution w_dist(0, params.width - params.part_size);

  std::uniform_int_distribution h_dist(0, params.height - params.part_size);

  do{

    int x = w_dist(gen);

    int y = h_dist(gen);

    params.food_x = x;

    params.food_y = y;

  }while(is_food_on_snake(params));

}

bool is_food_on_snake(GameParams& params){

  for(const auto& pos : params.snake_pos){

    if(params.food_x == pos.first && params.food_y == pos.second)

      return true;

  }

  return false;

}

现在我们已经生成了游戏的初始状态,我们可以开始编写游戏的主要逻辑。游戏的核心是贪吃蛇的移动和食物的生成与消失。

当贪吃蛇遇到食物时,它将会吃掉食物并增加身体。我们可以通过判断贪吃蛇头部的位置是否和食物的位置重合来判断是否需要增加身体。身体增加的过程其实就是在贪吃蛇的尾部增加一个部分。

void eat_food(GameParams& params){

  if(params.snake_pos.front().first == params.food_x && params.snake_pos.front().second == params.food_y){

    params.score += 10;

    params.snake_size++;

    add_snake_part(params);

    init_food_pos(params);

  }

}

void add_snake_part(GameParams& params){

  auto back_pos = params.snake_pos.back();

  if(params.snake_pos.size() == 1){

    if(params.snake_pos[0].first < params.food_x){

      params.snake_pos.push_back(std::make_pair(back_pos.first - params.part_size, back_pos.second));

    }else{

      params.snake_pos.push_back(std::make_pair(back_pos.first + params.part_size, back_pos.second));

    }

  }else{

    auto second_last_pos = *(params.snake_pos.end() - 2);

    if(back_pos.first == second_last_pos.first && back_pos.second < second_last_pos.second){

      params.snake_pos.push_back(std::make_pair(back_pos.first, back_pos.second - params.part_size));

    }else if(back_pos.first == second_last_pos.first && back_pos.second > second_last_pos.second){

      params.snake_pos.push_back(std::make_pair(back_pos.first, back_pos.second + params.part_size));

    }else if(back_pos.second == second_last_pos.second && back_pos.first < second_last_pos.first){

      params.snake_pos.push_back(std::make_pair(back_pos.first - params.part_size, back_pos.second));

    }else{

      params.snake_pos.push_back(std::make_pair(back_pos.first + params.part_size, back_pos.second));

    }

  }

}

当贪吃蛇移动时,它的身体也要跟着移动。贪吃蛇的移动方向可以通过键盘按键来控制,方向键W、A、S、D分别控制贪吃蛇的上、左、下、右移动。

void move(GameParams& params, char dir){

  int x = params.snake_pos.front().first;

  int y = params.snake_pos.front().second;

  if(dir == 'w')

    y -= params.part_size;

  else if(dir == 'a')

    x -= params.part_size;

  else if(dir == 's'){

    y += params.part_size;

  }else if(dir == 'd'){

    x += params.part_size;

  }

  bool is_dead = check_snake_dead(params, x, y);

  if(is_dead)

    return;

  params.snake_pos.pop_back();

  params.snake_pos.push_front(std::make_pair(x, y));

  eat_food(params);

}

void game_loop(GameParams& params){

  char dir = 'd';

  while(1){

    draw_game_params(params);

    if(_kbhit()){

      dir = _getch();

      if(dir == 'w' || dir == 'a' || dir == 's' || dir == 'd'){

        move(params, dir);

      }else if(dir == 27)

        break;

    }else{

      std::this_thread::sleep_for(std::chrono::milliseconds(100));

      move(params, dir);

    }

  }

}

最后,我们需要检查贪吃蛇是否死亡。当贪吃蛇头部碰到游戏界面的边界或者碰到自己的身体时,游戏结束。

bool check_snake_dead(GameParams& params, int x, int y){

  if(x < 0 || x >= params.width || y < 0 || y >= params.height)

    return true;

  for(int i = 1; i < params.snake_pos.size(); i++){

    if(params.snake_pos[i].first == x && params.snake_pos[i].second == y)

      return true;

  }

  return false;

}

现在我们已经完成了贪吃蛇游戏的编写。我们可以通过控制台来运行这个游戏,并且可以使用WSAD按键来控制贪吃蛇的移动。当贪吃蛇吃掉食物时,会增加得分并在贪吃蛇的尾部增加一个部分。当贪吃蛇死亡时,游戏结束。

  
  

评论区

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