我是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;
}
答案 0 :(得分:1)
以下是我发现的一些问题:
这很糟糕。这样会从std
命名空间中引入所有标识符名称。首选是使用std
前缀(例如std::cout
)或从std
命名空间中选择(例如using std::cout;
)。
首选没有全局变量。在main
中创建它们并将它们传递给函数。
例如,您具有全局x
和y
,并且您将x
和y
用作函数中的参数。对于您您所指的变量,这可能会导致您,读者和编译器之间产生混乱。
不想使用指针。
通过值(无指针)传递可以放入处理器寄存器的变量,例如float, double, int, bool
和char
。
对于类和结构,请通过引用传递。如果您没有修改参数,请通过常量引用传递。
函数执行需要开销,通常至少需要3条指令(保存参数,跳转到函数,从函数返回)。某些操作可以用较少的语句执行:
// Switch directions:
direction = ! direction;
如果必须使用功能,请向编译器提示您inline
。这意味着编译器将在执行函数调用的地方粘贴函数的内容。一些编译器可能会这样做以进行优化,但是您必须告诉编译器进行优化。
switch
语句 switch语句对于布尔变量来说是一种矫kill过正,因为只有两个结果。常见的编码准则是使用if
和else
。
请记住,一个=
用于分配,两个用于比较。
该语言允许在比较中进行分配,但是很可能您不是在考虑分配,而是在测试是否相等。
通过声明最接近变量使用位置的变量,使编译器和阅读器的工作更加轻松。例如,在main
中,有一个loop
变量。作为读者,当更好的主意是在main
函数中使用它的地方对其进行声明时,我必须滚动到您的资源的顶部以找到该定义。
常见的编码准则是每行一个变量。多行对构建时间的影响可以忽略不计。但是,这使修改变得更容易。并且在声明指针时,减少了注入的缺陷。让您的编译器优化代码,您的任务应该写得清晰(易于阅读)和简洁的代码。
强制编译器将警告级别设置为最高级别。
解决所有警告。
干净的编译文件的错误为零,警告为 为零。
如果编译器警告已满,您会注意到我发现的一些问题。