所以我的问题有点棘手,至少对我而言。我正在尝试用C ++制作游戏以获得它的乐趣,基本上我就像飞鸟一样,鸟不会移动,但鸟后面的地图总是从右向左移动。基本上我到目前为止所做的是创建一个小网格5个空格向下和80个空格。我基本上在地图底部的顶部5个空格处绘制了下划线字符_,玩家从左边开始是“O”三个空格。麻烦的是让第五个空间上方的4个空间移动,但同时不要移动玩家“O”。这是我的代码和到目前为止发生的事情的草图。对不起,我真的很难解释。我真的尽力了。问题是我并没有真正理解这一切。
#include <iostream>
#include <cstdlib>
#include <string>
#include <conio.h>
using namespace std;
bool gameOver;
// Global variables
const int WIDTH = 80;
const int HEIGHT = 5;
int x, y;
int speedX;
int percentX;
int someArray[100];
string anotherArray[100];
enum eKeys { STOP = 0, SPACE};
int gameSpeed;
eKeys key;
// Function declarations
void input() {
if (_kbhit()) {
switch (_getch()){
case ' ':
key = SPACE;
break;
}
}
}
void draw() {
for (int j = 0; j < HEIGHT; j++) {
for (int i = 0; i < WIDTH; i++) {
if (j < 4) {
std::cout << " ";
if (WIDTH == 20) {
_sleep(10);
}
}
if(j == 4){
anotherArray[i] = "_";
std::cout << anotherArray[i];
}
if (j== 3 && i == 3) {
std::cout << "O";
}
if (j == 3 && i == 140) {
}
}
}
}
void setup() {
gameOver = false;
key = STOP;
x = 3;
y = 2;
}
void logic() {
switch (key) {
case SPACE:
break;
}
}
int main()
{
// Your code goes here
setup();
//while(gameOver == false){
draw();
input();
logic();
//}
// Make sure we place the end message on a new line
std::cout << endl;
// The following is system dependent. It will only work on Windows
std::system("PAUSE");
/*
// A non-system dependent method is below
cout << "Press any key to continue";
cin.get();
*/
return 0;
}
此代码在控制台中生成此输出.... “这是控制台的顶部”
0
按任意键继续......
我想要的是“_____”以上的所有内容都是在没有玩家移动的情况下从右向左移动。除非按空格键跳转,否则“O”的y坐标将会改变。我也知道这可能会在课堂上做得更好但我在书中没有那么深入,而我的c ++课程现在刚刚开始运作,所以现在最好远离它。
答案 0 :(得分:2)
如果我已经正确理解,你想在Windows控制台上使用C ++ level io和conio.h函数制作一个ASCII艺术游戏。对不起,你在路边:
在旧的MS / DOS时代,屏幕内存曾经可以在众所周知的地址直接访问,游戏(或应用程序)开发人员在需要特殊效果时使用它来绕过正常的IO功能。不确定控制台仿真是否支持它,我建议你不要使用它。
现在正确的方法是使用WINAPI的Console functions。它们通过conio仿真和正常的io功能在引擎盖下使用,但提供游戏所需的一切,绝对定位,甚至可以通过ReadConsoleOutput
和{{读取和写入屏幕的任意区域。 1}}
同时,您可以使用WriteConsoleOutput
从键盘获取输入事件。
当然,您已经不再与非Windows平台兼容,但是由于您已经使用过conio,我认为这里不关心可移植性。
答案 1 :(得分:0)
你不必担心这里的效率。
将背景存储在80 x 25阵列中。然后在每次移动时向左滚动,只需通过它暴力。复制到另一个缓冲区,用精灵覆盖,然后将整个内容写到屏幕上。
不要使用cout。使用conio printat()函数。