• 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

Object Storage Arubacloud
0 głosów
567 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,220 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ź 325 wizyt
0 głosów
1 odpowiedź 161 wizyt
pytanie zadane 12 lutego 2018 w C i C++ przez Hiskiel Pasjonat (22,830 p.)
0 głosów
1 odpowiedź 329 wizyt
pytanie zadane 30 lipca 2021 w C i C++ przez tonn204 Mądrala (7,440 p.)

92,762 zapytań

141,686 odpowiedzi

320,499 komentarzy

62,106 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.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...