• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak zaimplementować pewną funkcję w kodzie

Aruba Cloud - Virtual Private Server VPS
0 głosów
675 wizyt
pytanie zadane 15 stycznia 2019 w C i C++ przez Curiosis Użytkownik (540 p.)

Witajcie. Szukam odpowiedzi na irytującą mnie sytuację. Mianowicie zacząłem pisać sobie projekcik na zaliczenie i napotkałem na pewną trudność. Tworzę snake'a, jednak dotychczas miałem ustawione że plansza jest pod cls i odświeżanie powoduje brak wydajności programu, dodatkowo na słabszym sprzęcie jest to widoczne i powoduje ścinki. Chciałbym zaimplementować funkcję, która będzie mi tylko część nadpisywać, znalazłem takową, jednak nie wiem jak to zaimplementować. Byłbym bardzo wdzięczny gdyby ktoś mi powiedział gdzie to "wrzucić" i co nadmienić w tej funkcji. Z góry dziękuję <3 

 

#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <windows.h>
enum eDirection{ STOP=0, l, p, g, d};
eDirection dir;
int w=100, h=50;
int x,y, fruitX, fruitY, score;
int tailX[100], tailY[100];
int nTail;

void clearScreen() {
	output = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos = { 0,0 };
	SetConsoleCursorPosition(output, pos);
}

using namespace std;

bool gameOver;

void drawingMap(){
    system("cls");
    for (int i=0; i<w+2; i++){
        cout << "#";
    }
    cout << endl;

    for (int i=0; i<h; i++){
        for (int j =0; j<w; j++){
            if (j==0)
                cout << "#";
            if (i == y && j ==x){
                cout << "O";
            }
            else if (i == fruitY && j == fruitX){
                cout << "*";
            }
            else {
                bool print = false;
                for(int k = 0; k<nTail; k++){
                    if (tailX[k] == j && tailY[k] == i){
                        cout << "o";
                        print = true;
                    }

                }
                if (!print)
                cout << " ";
            }

            if (j == w - 1)
                cout << "#";
        }
        cout << endl;
    }

    for (int i=0; i<w+2; i++){
        cout << "#";
    }
    cout << endl << "Score: " << score;
}
void Setup(){
    gameOver = false;
    dir = STOP;
    x = w/2;
    y = h/2;
    fruitX = rand()%w;
    fruitY = rand()%h;}
void Input(){
    if (_kbhit())
    {
        switch (_getch())
        {
        case 'a':
            dir = l;
            break;
        case 'd':
            dir = p;
            break;
        case 'w':
            dir = g;
            break;
        case 's':
            dir = d;
            break;
        case 'x':
            gameOver = true;
            break;
        }
    }
}

void Logic(){
    int prevX = tailX[0];
    int prevY = tailY[0];
    int prev2X, prev2Y;
    tailX[0] = x;
    tailY[0] = y;
    for(int i =1; i < nTail; i++){
        prev2X = tailX[i];
        prev2Y = tailY[i];
        tailX[i] = prevX;
        tailY[i] = prevY;
        prevX = prev2X;
        prevY = prev2Y;}
    switch (dir){
        case l:
            x--;
            break;
        case p:
            x++;
            break;
        case g:
            y--;
            break;
        case d:
            y++;
            break;
        default:
            break;
    }
    //if (x > w || x < 0 || y > h || y < 0)
     //   gameOver = true;
    if (x >=w){
        x = 0;
    }
    else if( x < 0){
        x = w - 1;
    }
        if (y >=h){
        y = 0;
    }
    else if( y < 0){
        y = h - 1;
    }
    for( int i = 0; i < nTail; i++){
        if (tailX[i] == x && tailY[i] == y)
            gameOver = true;
    }
    if (x==fruitX && y == fruitY){
        score += 10;
        fruitX = rand()%w;
        fruitY = rand()%h;
        nTail++;}}
int main(){
    Setup();
    while (!gameOver){
        drawingMap();
        Input();
        Logic();
        Sleep(12);
    }
    return 0;
}
void clearScreen() {
	output = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos = { 0,0 };
	SetConsoleCursorPosition(output, pos);
}

 

2 odpowiedzi

0 głosów
odpowiedź 15 stycznia 2019 przez j23 Mędrzec (195,240 p.)

Zainteresuj się funkcjami WriteConsoleOutput, ReadConsoleOutput i CreateConsoleScreenBuffer.

0 głosów
odpowiedź 16 stycznia 2019 przez C☺ndzi Stary wyjadacz (12,100 p.)
Nie zagłębiałem się w kod, ale czy wąż porusza się sam, czy tylko i wyłącznie gracz nim porusza? Jeśli tylko gracz, to możesz po prostu rysować mapę co każdy ruch, zamiast co każdą klatkę lub obieg pętli. Dzięki temu obraz będzie "wypisywany" do konsoli rzadziej, co powinno zniwelować migotanie. Z kolei jesli sam się porusza, to możesz zrobić podobnie - tylko odśwież mapę za każdym ruchem węża.
Podsumowując - rysuj (wyświetlaj) tylko wtedy, gdy coś aktualizujesz.

Podobne pytania

0 głosów
1 odpowiedź 344 wizyt
0 głosów
1 odpowiedź 173 wizyt
pytanie zadane 12 lutego 2018 w C i C++ przez Hiskiel Pasjonat (22,830 p.)
0 głosów
1 odpowiedź 403 wizyt
pytanie zadane 30 lipca 2021 w C i C++ przez tonn204 Mądrala (7,470 p.)

93,264 zapytań

142,260 odpowiedzi

322,234 komentarzy

62,582 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...