【问题标题】:C++ Snake Game Tail BugC++ 贪吃蛇游戏尾虫
【发布时间】:2019-07-24 17:44:02
【问题描述】:

我想使用控制台 C++ 创建一个简单的蛇游戏。我目前正在创建蛇的尾部。当蛇吃水果时,它会在尾巴上加一段。问题是游戏运行良好,直到第三个水果。此时,虽然给蛇加了一个尾巴,但它会笨拙地移动并移动右侧的墙壁。

代码如下:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include<time.h>

using namespace std;

// ===========  VARIABLES ===========

bool gameOver;
const int width = 20;
const int height = 20;
int x, y, fruitX, fruitY, score;
enum eDirection {STOP = 0, LEFT, RIGHT, UP, DOWN};
eDirection dir;
//arrays

int tailx[50],taily[50];
int ntail=0;


// ===========  INITIALIZATION ===========
void setup()
{
    gameOver = false;
    //snake is not moving
    srand(time(0));

    dir = STOP ;
    // center the snake on the map
    x = width/2;
    y = height/2;

    // randomize fruit position
    fruitX = rand()%width;
    fruitY = rand()%height;

    score = 0;
}


void Draw()
{
    //clear screen
    system("cls");


    // ======== DRAW MAP ========

    //display top border of map
    for (int i =0; i< width; i++)
        cout << "#" ;
    cout<<endl;

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

        for (int j=0; j<width; j++)
        {
            if (j == 0)
                cout <<"#";

            //display the head
            if (x==j && y==i)

                cout << "o";

            // display the fruit

            else if (fruitX == j && fruitY == i)
                cout << "F";

            else
            {
                bool print = false;
                for (int k = 0; k < ntail ; k++)
                {

                    if (tailx[k]== j && taily[k] == i)
                    {
                        cout << "o";
                        print = true;
                    }

                }
                    if(!print)
                    cout << " ";

            }
            if (j == width-1)
                cout << "#";
        }
        cout<<endl;
    }

    //display bottom border
    for (int i =0; i< width+2; i++)
        cout << "#" ;
    cout<<endl;

    //display score
    cout<< "Score : " << score<<endl;

    //debug
    cout << "ntail : " << ntail << endl ;
    cout << "width : "  << width << endl ;



}

void Input()
{
    if (_kbhit())
    {

        //leyboard control input
        switch (_getch())
        {
        case 'q':
            dir = LEFT;
            break;
        case 'z':
            dir = UP;
            break;
        case 's':
            dir = DOWN;
            break;
        case 'd':
            dir = RIGHT;
            break;
        case 'x':
            gameOver = true;
            break;
        default :
            break;
        }
    }
}

void logic()
{
    //remember previous position
    int prevx = tailx[0];
    int prevy = taily[0];

    int prev2x,prev2y;

    tailx[0] = x;
    taily[0] = y;

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

        //remember current position
        prev2x = tailx[i];
        prev2y = taily[i];

        // change value

        tailx[i] = prevx;
        taily[i] = prevy;

        prevx = tailx[i];
        prevy = taily[i];



    }



    // movement management
    switch  (dir)
    {
    case DOWN :

        if (y<=height)
            y++;
        break;

    case UP:
        if (y>=0)
            y--;
        break;

    case LEFT:
        if (x>=0)
            x--;
        break;

    case RIGHT:
        if (x<=width)
            x++;
        break;
    default :
        break;
    }

    // if the snake hits the wall
    //if (x == width || y =z= height || x == 0 || y == 0)
    //    gameOver = true;

    //if the snake eats a fruit


    // score display and new fruit apparition
    if (x==fruitX && y==fruitY)
    {
        score += 10;
        fruitX = rand()%width;
        fruitY = rand()%height;
        ntail++;

    }
}

int main()
{
    setup();

    while (!gameOver)
    {
        Draw();
        Input();
        logic();

        Sleep(100);

    }

    return 0;
}

【问题讨论】:

  • 所以在你的 Draw() 函数中,for (int k 循环如果尾部的 2 段以某种方式位于同一位置会发生什么?也许这不应该发生,所以在那里添加一个额外的检查,如果它确实发生了,那么为什么?
  • 不要使用system()!由于许多原因,它很糟糕。见这里:stackoverflow.com/questions/19913446/….
  • 有了_kbhit_getch,这显然是特定于平台的代码。无论我们如何看待这个选择,它确实意味着system("cls") 至少是可靠的。虽然是的,但确实值得一提的是这不是纯 C++

标签: c++ console


【解决方案1】:

在 void logic() 函数中得到它,它应该是:

 for (int i=1; i<ntail; i++)
    {
        //remember current position
        prev2x = tailx[i];
        prev2y = taily[i];

        // change value

        tailx[i] = prevx;
        taily[i] = prevy;

        prevx = prev2x;
        prevy = prev2y;
    }

而不是

 for (int i=1; i<ntail; i++)
    {
        //remember current position
        prev2x = tailx[i];
        prev2y = taily[i];

        // change value

        tailx[i] = prevx;
        taily[i] = prevy;

        prevx = tailx[i];
        prevy = taily[i];
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多