Перекраска консоли C заикание / не жидкость - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь сделать простую игру со змеями на консоли. Я использую матрицу int для хранения всех данных (границы, змеи, продукты питания) в их точном местоположении.

Я сейчас использую этот основной код для запуска программы:

int main()
{
    int tab[28][120];
    create(tab, 28, 120);
    paint(tab, 28, 120);
    char i = '1';
    char direction = 'R';
    while(i != 'q')
    {
        if (kbhit())
            i =getch();
        translate(tab, direction, 28, 120);
        paint(tab, 28, 120);
        Sleep(300);
    }   
}

Основная проблема в том, что каждый раз, когда я перекрашиваю матрицу, она заикается. Я попытался поместить оператор if(kbhit()) в цикл for() с другим вызовом paint(), взяв Sleep(300), чтобы ускорить процесс рисования, но он все еще заикается, просто быстрее.

Может ли помочь использование потоков? Я плохо разбираюсь в них.

Вот целая программа, которая идет с основной для тех, кто хочет ее протестировать:

    #include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <Windows.h>

void paint(int tab[28][120], int ligneMax, int colonneMax)
{
    system("cls");
    for (int i = 0; i < ligneMax; i++)
    {
        for (int j = 0; j < colonneMax; j++)
        {
            printf("%c", tab[i][j]);
        }
        printf("\n");
    }
}

void create(int tab[28][120], int Nbligne, int Nbcolonne)
{
    int randligne = rand() % 26 + 1;
    int randcols = rand() % 118 + 1;
    for (int i = 0; i < Nbligne; i++)
    {
        for (int j = 0; j < Nbcolonne; j++)
        {
            tab[i][j] = ' ';
            if (i == 0 || i == Nbligne - 1)
                tab[i][j] = 205;
            if (j == 0 || j == Nbcolonne - 1)
                tab[i][j] = 186;
            if (i == 0 && j == 0)
                tab[i][j] = 201;
            if (i == 0 && j == Nbcolonne - 1)
                tab[i][j] = 187;
            if (i == Nbligne - 1 && j == 0)
                tab[i][j] = 200;
            if (i == Nbligne - 1 && j == Nbcolonne - 1)
                tab[i][j] = 188;
            if (i == 14 && j == 60)
                tab[i][j] = 254;
            if (i == 14 && j == 59)
                tab[i][j] = 184;
            if (i == 14 && j == 58)
                tab[i][j] = 184;
            if (i == randligne && j == randcols)
                tab[i][j] = 176;
        }
    }
}

void translate(int tab[28][120], char direction, int Nbligne, int Nbcolonne)
{
    if (direction == 'R')
    {
        for (int i = 0; i < Nbligne; i++)
        {
            for (int j = 0; j < Nbcolonne; j++)
            {
                if (tab[i][j] == 254)
                {
                    tab[i][j] = 184;
                    tab[i][j + 1] = 254;
                    goto stop;
                }
            }
        }
        stop: NULL;
    }
}

Я знаю, что функция перевода завершена (пока она только перемещает голову), но это имеет значение в данном вопросе.

...