GotoXY没有像我预期的那样工作

时间:2016-10-31 11:58:56

标签: c console

如果我将功能分开,GotoXY无效,但我需要在同一个文件中使用它们。

#include "colors.h"
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define clear() printf("\033[H\033[J")



void gotoXY(int x, int y) {
    COORD coord;
    coord.X = x;
    coord.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}



void welcome() {
    printf("%s", KRED);
    printf("  _       __________    __________  __  _________\n");
    printf(" | |     / / ____/ /   / ____/ __ \\/  |/  / ____/\n");
    printf(" | | /| / / __/ / /   / /   / / / / /|_/ / __/   \n");
    printf(" | |/ |/ / /___/ /___/ /___/ /_/ / /  / / /___   \n");
    printf(" |__/|__/_____/_____/\\____/\\____/_/  /_/_____/   \n");
    printf("                                                 \n");
    printf("\n\n%s", KGRN);
    sleep(3);
    clear();  
}

void menu_main_interface() {
    clear();
    printf("%s",KBLU);
    printf(" ___  ___  ___  _____ _   _   ___  ___ _____ _   _ _   _ \n");
    printf(" |  \\/  | / _ \\|_   _| \\ | |  |  \\/  ||  ___| \\ | | | | |\n");
    printf(" | .  . |/ /_\\ \\ | | |  \\| |  | .  . || |__ |  \\| | | | |\n");
    printf(" | |\\/| ||  _  | | | | . ` |  | |\\/| ||  __|| . ` | | | |\n");
    printf(" | |  | || | | |_| |_| |\\  |  | |  | || |___| |\\  | |_| |\n");
    printf(" \\_|  |_/\\_| |_/\\___/\\_| \\_/  \\_|  |_/\\____/\\_| \\_/\\___/ \n");
    printf("%s",KGRN);                                                       
    printf("\n\n ________________________________________________________\n |");                                                       
    printf("                                                      |\n");                    
    printf(" |                     1 ---> NEW GAME                  |\n"); 
    printf(" |                     2 ---> LOAD GAME                 |\n");                                                
    printf(" |                     3 ---> TOP 10 TIMES              |\n");
    printf(" |                                                      |\n");
    printf(" |                     0 ---> EXIT                      |\n");
    printf(" | ENTER OPTION:                                        |\n");
    printf(" |______________________________________________________|\n");
    gotoXY(16, 25); 
}


int main(int argc, char** argv) {

    printf("%s", KGRN);
    welcome();
    start();

    return (EXIT_SUCCESS);
}

start()函数只调用select_menu_interface(),导致:

void select_menu_interface() {
    int selection;

    do {
        menu_main_interface();
        readInt(&selection, 0, 3, "");
        switch (selection) {
            case 1: select_newgame(); break;
            case 2: break;
            case 3: readHS(); break;
            case 0: break;
            default: printf("ERROR: Bad Input!"); break;
        }
    } while (selection < 0 && selection > 3);

}

我希望光标位于“输入选项:”,但它不起作用:光标位于另一行的开头:

enter image description here

2 个答案:

答案 0 :(得分:1)

查看您的代码,您似乎正在使用ANSI terminal escape codes清除屏幕并设置颜色。由于Windows命令控制台默认情况下不支持这些代码(ANSI.SYS不再可用):

在第一种情况下,我们无能为力。但我测试了第二种情况:看来你在gotoXY()中的位置与你向我们展示的屏幕布局不匹配:第一个参数是列,第二个是行。所以gotoXY(16, 25)将转到第25行(即屏幕上的第26行,因为位置从0开始)。那将是你最后一行以下至少8行(假设你的颜色序列不添加行)。为了获得正确的位置,我必须使用gotoXY(23,15);

这种混乱可以解释滚动(如果第25行超出了垂直限制中窗口的大小)。但是为了使光标位于屏幕的开始处,将需要水平位置超出窗口的水平尺寸(即,至少> 57),这不是这种情况。

还有其他几种可能的探索方式:

  • 当stdio被缓冲时,在光标定位之前进行fflush(stdout)可能是安全的,以确保缓冲不会引起一些麻烦(例如,稍后显示尾随的换行符,例如当你'正在使用其他I / O功能,如阅读键盘。
  • 检查readInt()是否没有改变光标位置,例如,通过一个新行(我看到一个尾随的“”,所以我想这个函数可以显示一些东西。

答案 1 :(得分:0)

解决方案(归功于@Christophe):

readInt()函数执行改变光标位置的displayMessage()。 我们只需将其更改为scanf()函数即可读取值:

void select_menu_interface() {
    int selection;

    do {
        menu_main_interface();
        scanf("%d", &selection);
        switch (selection) {
            case 1: select_newgame(); break;
            case 2: break;
            case 3: readHS(); break;
            case 0: break;
            default: printf("ERROR: Bad Input!"); break;
        }
    } while (selection < 0 && selection > 3);

}