【发布时间】:2013-08-13 06:38:48
【问题描述】:
我正在使用 libnds 为 C++ 中的 NDS 编码,但这个问题不是 NDS 特定的。我目前有一个基于文本的游戏,其中顶部屏幕只显示一个徽标,而您在底部屏幕上玩。
所以我想添加一种单人 DS 多人游戏,其中一个玩家在顶部屏幕上玩,另一个玩家在底部屏幕上玩。我在设置两个屏幕的文本引擎时没有问题,我只需要找到一种在多人游戏中有效编码的方法。下面我写了一个摘要或简化版。
注意:consoleClear() 清除屏幕,游戏停止的唯一地方是暂停函数。
//Headers
void display(int x,int y,const char* output))
{
printf("\x1b[%d;%dH%s", y, x,output);
}
void pause(KEYPAD_BITS key) //KEYPAD_BITS is an ENUM for a key on the NDS
{
scanKeys();
while (keysHeld() & key)
{
scanKeys();
swiWaitForVBlank();
}
while (!(keysHeld() & key))
{
scanKeys();
swiWaitForVBlank();
}
return;
}
void pause() //Only used to simplify coding
{
pause(KEY_A);
return;
}
int main(void)
{
//Initializations/Setup
while (1)
{
if (rand()%2==1) //Say Hello
{
if (rand()%3!=1) //To Friend (greater chance of friend than enemy)
{
display(6,7,"Hello Friend!");
display(6,8,"Good greetings to you.");
pause();
consoleClear(); //Clears text
display(6,7,"Would you like to come in?");
pause();
//Normally more complex complex code (such as interactions with inventories) would go here
}
else //To enemy
{
display(6,7,"Hello enemy!");
display(6,8,"I hate you!");
pause();
consoleClear();
display(6,7,"Leave my house right now!!!");
pause();
}
}
else //Say goodbye
{
if (rand()%4==1) //To Friend (lesser chance of friend than enemy)
{
display(6,7,"Goodbye Friend!");
display(6,8,"Good wishes to you.");
pause();
consoleClear();
display(6,7,"I'll see you tomorrow.");
pause();
consoleClear();
display(6,7,"Wait, I forgot to give you this present.");
pause();
}
else //To enemy
{
display(6,7,"Goodbye enemy!");
display(6,8,"I hate you!");
pause();
consoleClear();
display(6,7,"Never come back!!");
pause();
consoleClear();
display(6,7,"Good riddance!"); //I think I spelt that wrong...
pause();
}
}
}
}
我知道 goto 令人困惑,可能被认为是一种坏习惯,但我想不出更好的方法。我的集成多人版本:
//Headers and same functions
int game(int location)
{
switch (location)
{
case 1: goto one; break;
case 2: goto two; break;
case 3: goto three; break;
case 4: goto four; break;
case 5: goto five; break;
case 6: goto six; break;
case 7: goto seven; break;
case 8: goto eight; break;
case 9: goto nine; break;
case 10: goto ten; break;
default: break;
}
if (rand()%2==1) //Say Hello
{
if (rand()%3!=1) //To Friend (greater chance of friend than enemy)
{
display(6,7,"Hello Friend!");
display(6,8,"Good greetings to you.");
return 1;
one:;
consoleClear(); //Clears text
display(6,7,"Would you like to come in?");
return 2;
two:;
//Normally more complex complex code (such as interactions with inventories) would go here
}
else //To enemy
{
display(6,7,"Hello enemy!");
display(6,8,"I hate you!");
return 3;
three:;
consoleClear();
display(6,7,"Leave my house right now!!!");
return 4;
four:;
}
}
else //Say goodbye
{
if (rand()%4==1) //To Friend (lesser chance of friend than enemy)
{
display(6,7,"Goodbye Friend!");
display(6,8,"Good wishes to you.");
return 5;
five:;
consoleClear();
display(6,7,"I'll see you tomorrow.");
return 6;
six:;
consoleClear();
display(6,7,"Wait, I forgot to give you this present.");
return 7;
seven:;
}
else //To enemy
{
display(6,7,"Goodbye enemy!");
display(6,8,"I hate you!");
return 8;
eight:;
consoleClear();
display(6,7,"Never come back!!");
return 9;
nine:;
consoleClear();
display(6,7,"Good riddance!"); //I think I spelt that wrong...
return 10;
ten:;
}
return -1;
}
}
int main(void)
{
//Initializations/Setup
int location1 = -1, location2 = -1;
location1 = game(location1);
location2 = game(location2);
while (1)
{
scanKeys(); //Whenever checking key state this must be called
if (keysDown() & KEY_A) //A key is used to continue for player1
location1 = game(location1);
if (keysDown() & KEY_DOWN) //Down key is used to continue for player2
location2 = game(location2);
}
}
除了这种方法是一种不好的做法之外,在实际的源代码中,我需要添加数百个 goto,这太耗时了。
感谢任何帮助。如果有人有任何问题或答案,请询问/回复。
编辑:虽然不喜欢这样做,但如果有人有方法,我愿意从头开始重写游戏。
【问题讨论】:
-
关于goto,为什么不把常用功能放在函数中,在需要的时候调用呢?就像案件一样? 和在默认情况下。
-
关于你的多人游戏和分屏问题,如果游戏从一开始就是为这个而设计的,这些东西会好多更好地工作。是的,我建议您简单地从头开始现有的解决方案并从新设计重新开始。将这些东西添加到已经有效的解决方案中总是会变得很糟糕,即使它有效。
-
@Joachim Pileborg:当然,我愿意从头开始重新设计整个游戏,只是我想不出办法。如果我能找到一种方法来做到这一点,那么它就会回答我的问题。
标签: c++ multiplayer goto devkitpro