创建堆栈时出现问题! (街机游戏)在C ++

时间:2018-07-30 19:11:36

标签: c++ console-application

我是C ++的初学者,我最近想重新制作流行的街机游戏Stack!在C ++控制台中。 问题发生在玩家必须放置打击垫时: 垫放置得很好,但是如果出错,则无法正确调整大小(运行代码时您会更好地理解)。

不用担心有时会出错的图形,因为我可以自己修复它。 请帮我!


代码如下:

#include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <windows.h> 
#include <string>

using namespace std;

bool bDirection = true;       /* Bool for the direction:
                             true = dx, false = sx */
string sPad;
int nPadLenght = 6;
int x = 40, y =21;            // Referement tile's  position

int nSpeed = 200;
bool loop = true;             // main loop
int nScore = 0;               // score

int nPlaceX = 40;                        

int nTileX = 35, nTileY = 20; // Player's actual postition
int nEndTileX, nEndTileY;

void RenderLine(int *x, int *y);
int main();

// Void for the coordinates

void gotoxy (int x, int y){

COORD coord;
coord.X = x ;
coord.Y = y ;
SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), coord);

}

void Victory(){

x = 10;
y = 4;

Beep(698.5, 300);
Beep(698.5, 100);
Beep(1047, 500);

system("color a");
gotoxy(x,y); cout << "You win!\n\n      Score = " << nScore;
system("pause >nul");


}


void PadLenght(int *x){

// Each number is equal to a possible pad lenght

switch (*x){

    case 6:
        sPad = "[][][]";
        nEndTileX = nTileX + 5;
        break;

    case 5:
        sPad = "[][]]";
        nEndTileX = nTileX + 4;
        break;

    case 4:
        sPad = "[][]";
        nEndTileX = nTileX + 3;
        break;

    case 3:
        sPad = "[][";
        nEndTileX = nTileX + 2;
        break;

    case 2:
        sPad = "[]";
        nEndTileX = nTileX + 1;
        break;

    case 1:
        sPad = "[";
        nEndTileX = nTileX;
        break;

}
}

void SwitchDirection(bool *x){

// Switches the bool of the direction

switch (*x){

    case true:
        *x = false;
        break;

    case false:
        *x = true;
        break;

}

}

void Speed(){

// For each line from 500ms to 20ms speed increments of 10ms

if (nSpeed > 20)
    nSpeed -= 20;

}

// void for placing the pad

void Place() {

int i = nPlaceX - nTileX;

if (i < 0)
    i * -1;

nPadLenght -= i;



}

void collision(){

    // Collisions with the border

    if (nTileX > 45 || nTileX < 35)
    SwitchDirection(&bDirection);

}

void movement(){

    int nLastX = nTileX;

    // Place the pad if pressing down arrow

    if(GetKeyState(VK_DOWN) & 0x8000){

    nTileY--;
    Place();
    Speed();

    Beep(698.5, 50);
    Beep(880.0, 50);
    Beep(1047, 50);

    nScore += 10;
    Sleep(60);

 }

    // Movement of the pad

    switch (bDirection){

        case true:
            gotoxy (nLastX, nTileY); cout << "                          ";          
            nTileX++;
            break;

        case false: 
            gotoxy (nLastX - nPadLenght, nTileY); cout << "                ";                                
            nTileX--;
            break;

    }


}


int main(){

system("color 0");

while (loop = true){

    char a = '"';
    gotoxy(x,y); cout << a << a << a << a << a << a;
    collision();
    PadLenght(&nPadLenght);
    movement();
    gotoxy (nTileX, nTileY); cout << sPad;
    Sleep (nSpeed);

    if (nScore > 160) {
        Victory();
        break;
    }


}



return 0;

}

1 个答案:

答案 0 :(得分:1)

以下是我发现的一些问题:

“使用命名空间标准;”

这很糟糕。这样会从std命名空间中引入所有标识符名称。首选是使用std前缀(例如std::cout)或从std命名空间中选择(例如using std::cout;)。

全局变量

首选没有全局变量。在main中创建它们并将它们传递给函数。
例如,您具有全局xy,并且您将xy用作函数中的参数。对于您所指的变量,这可能会导致您,读者和编译器之间产生混乱。

通过指针传递

不想使用指针。
通过值(无指针)传递可以放入处理器寄存器的变量,例如float, double, int, boolchar
对于类和结构,请通过引用传递。如果您没有修改参数,请通过常量引用传递。

不要为简单内容创建函数

函数执行需要开销,通常至少需要3条指令(保存参数,跳转到函数,从函数返回)。某些操作可以用较少的语句执行:

// Switch directions:
direction = ! direction;

如果必须使用功能,请向编译器提示您inline。这意味着编译器将在执行函数调用的地方粘贴函数的内容。一些编译器可能会这样做以进行优化,但是您必须告诉编译器进行优化。

布尔switch语句

switch语句对于布尔变量来说是一种矫kill过正,因为只有两个结果。常见的编码准则是使用ifelse

'='在条件表达式中

请记住,一个=用于分配,两个用于比较。 该语言允许在比较中进行分配,但是很可能您不是在考虑分配,而是在测试是否相等。

声明最接近用法的变量

通过声明最接近变量使用位置的变量,使编译器和阅读器的工作更加轻松。例如,在main中,有一个loop变量。作为读者,当更好的主意是在main函数中使用它的地方对其进行声明时,我必须滚动到您的资源的顶部以找到该定义。

每行一个变量声明

常见的编码准则是每行一个变量。多行对构建时间的影响可以忽略不计。但是,这使修改变得更容易。并且在声明指针时,减少了注入的缺陷。让您的编译器优化代码,您的任务应该写得清晰(易于阅读)和简洁的代码。

提高编译器的警告级别

强制编译器将警告级别设置为最高级别。
解决所有警告。
干净的编译文件的错误为零,警告为 为零。
如果编译器警告已满,您会注意到我发现的一些问题。