Proszę o radę, gra w konsoli cmd/c++

0

Witam, to mój pierwszy post na tym forum więc na wstępie przepraszam za wszystkie błędy, które zostały i zostaną popełnione podczas pisania tego wątku.
Jestem studentem I roku politechniki na którym po pierwszy raz zetknąłem się z jakimkolwiek programowaniem.(kompletny laik)
Na następny projekt muszę zmodyfikować prostą grę w której odbijałem piłkę poruszającą się wewnątrz ramki paletką umiejscowioną przy dolnej krawędzi tej ramki,na grę w której piłkę i jej ruch po ramce zastąpią wystrzelone z owej paletki ''pociski''' .
Podczas pisania fragmentu kodu w którym po naciśnięciu danego przycisku zostaną wystrzelone dwa pociski z obydwu końców mojej ''paletki'' napotkałem następujące problemy:
I.
Gdy nacisnę przycisk ''w'' pociski zostają wystrzelone jednak znika mi paletka która pojawia się ponownie dopiero w momencie gdy owe ''pociski'' znikną na górze mojej ramki.
II.
Nie wiem też jak uniezależnić ruch paletki od ruchu wystrzelonych pocisków tak by po wystrzeleniu pocisków i w trakcie ich lotu można było przesuwać paletką i wystrzelać kolejną serię, próbowałem w jakiś sposób uzależnić koordynat x pocisków od koordynatów x obu końców paletki jednak kończyło się to na blokowaniu paletki.

Próbowałem szukać podpowiedzi w internecie i na zasadzie prób i błędów napisać chociaż kawałek działającego kodu, jednak nie wiem co dalej z tym zrobić, za wszystkie podpowiedzi serdecznie dziękuje ;)
Nie wiem gdzie umieszczać fragmenty kodów więc zamieszczam je poniżej jak i w załącznikach.

fragment kodu ze strzelaniem

#include "pch.h"
#include<stdlib.h>
#include <iostream>
#include<conio.h>
#include"windows.h"
#include<ctime>
using namespace std;
void gotoxy(int x, int y)
{
	COORD coord;
	coord.X = x;
	coord.Y = y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

int main(int argc, char**argv)
{
	unsigned char aa;
	int xd = 32;//deska
	char k1;
	int a = 1;
	ramka();

	while (a == 1)
	{
		
				
			gotoxy(xd, 38);
			aa = 196;
			cout << aa << aa << aa << aa << aa << aa;
			Sleep(50);			
			gotoxy(xd, 38);
			cout << "      ";

			

			while (_kbhit())//oczekiwanie na nacisniecie
			{
				k1 = _getch();//zapisanie klawisza
				if (k1 == 'd')
				{


					xd = xd + 2;

				}
				if (k1 == 'a')
				{


					xd = xd - 2;

				}
				if (k1 == 'w')
				{
					for (int i = 30;i > 2;i--)
					{
						gotoxy(xd, i);
						cout << "o";
						gotoxy(xd+6, i);
						cout << "o";
						Sleep(50);
						gotoxy(xd, i);
						cout << " ";
						gotoxy(xd+6, i);
						cout << " ";

					}



				}
			}
	}
	gotoxy(5, 80);
	cout << endl;
	return 0;
}

Pozdrawiam ;)

0

edit:poprawie sformatowany kod ;)

0

Spróbuj rozbić sobie program na poszczególne czynności, które zaimplementujesz jako osobne funkcje - tak jak w przykładzie poniżej.

using namespace std;

void gotoxy( int x, int y )
{
    SetConsoleCursorPosition( GetStdHandle(STD_OUTPUT_HANDLE), COORD {x,y} );
}

void ShowConsoleCursor( bool showFlag )
{
    HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);

    CONSOLE_CURSOR_INFO cursorInfo;

    GetConsoleCursorInfo(out, &cursorInfo);
    cursorInfo.bVisible = showFlag; // set the cursor visibility
    SetConsoleCursorInfo(out, &cursorInfo);
}

void clearScreen()
{
    HANDLE                     hStdOut;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    DWORD                      count;
    DWORD                      cellCount;
    COORD                      homeCoords = { 0, 0 };

    hStdOut = GetStdHandle( STD_OUTPUT_HANDLE );
    if (hStdOut == INVALID_HANDLE_VALUE) return;

    /* Get the number of cells in the current buffer */
    if (!GetConsoleScreenBufferInfo( hStdOut, &csbi )) return;
    cellCount = csbi.dwSize.X *csbi.dwSize.Y;

    /* Fill the entire buffer with spaces */
    if (!FillConsoleOutputCharacter(
      hStdOut,
      (TCHAR) ' ',
      cellCount,
      homeCoords,
      &count
      )) return;

    /* Fill the entire buffer with the current colors and attributes */
    if (!FillConsoleOutputAttribute(
      hStdOut,
      csbi.wAttributes,
      cellCount,
      homeCoords,
      &count
      )) return;

    /* Move the cursor home */
    SetConsoleCursorPosition( hStdOut, homeCoords );
}

void paintBat( int x , int y )
{
     gotoxy(x,y);
     for( auto i=0; i<6 ; ++i ) cout << static_cast<char>(196) ;
}

void paintProjectiles( int x , int y )
{
     gotoxy(x, y);
     cout << "o";
     gotoxy(x+5, y);
     cout << "o";
     Sleep(25);
     gotoxy(x, y);
     cout << " ";
     gotoxy(x+5, y);
     cout << " ";
}

int main(int argc, char**argv)
{
    ShowConsoleCursor(false);
    int xd {32};
    int currentProjectileStep {0};
    int projectilePosX {0};
    char key {};

    paintBat(xd,38);

    while(true)
    {
        if( _kbhit() )
        {
            key = _getch();
            if( key == 'd' )
            {
                clearScreen();
                xd += 2;
                paintBat(xd,38);
            }
            if( key == 'a' )
            {
                clearScreen();
                xd -= 2;
                paintBat(xd,38);
            }
            if( key == 'w' && currentProjectileStep==0 )
            {
                currentProjectileStep = 37;
                projectilePosX = xd ;
            }
        }

        if( currentProjectileStep>8 )
        {
            paintProjectiles( projectilePosX , currentProjectileStep-- );
        }
        else currentProjectileStep = 0;
    }

    return 0;
}
0

Super, dziekuję bardzo za szybką odpowiedź, zmieniłem kod na następujący:

#include "pch.h"
#include<stdlib.h>
#include <iostream>
#include<conio.h>
#include"windows.h"
#include<ctime>

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

void deska(int *x, int *y)
{

	gotoxy(*x, *y);
	unsigned char aa = 196;
	cout << aa << aa << aa << aa << aa << aa;

	Sleep(50);

	gotoxy(*x, *y);
	cout << "      ";
}

void pociski(int x, int y)
{
	gotoxy(x, y);
	cout << "o";
	gotoxy(x + 5, y);
	cout << "o";
	Sleep(20);
	gotoxy(x, y);
	cout << " ";
	gotoxy(x + 5, y);
	cout << " ";
}





int main()
{
	char key;	
	int skokpoc = 0;
	int pozxpoc = 0;
	int xd = 32;//xdeska
	int yd = 38;//ydeska

while (a == 1)
	{
		
		deska(&xd, &yd);
		if (_kbhit())
		{
			key = _getch();
			if (key == 'd')
			{

				xd += 2;

			}
			if (key == 'a')
			{

				xd -= 2;

			}
			if (key == 'w' && skokpoc == 0)
			{
				skokpoc = 37;
				pozxpoc = xd;
				if (skokpoc > 2)
				{
					pociski(pozxpoc, skokpoc--);
				}
				else skokpoc = 0;
			}
		}
		if (skokpoc > 2)
		{
			pociski(pozxpoc, skokpoc--);
		}
		else  skokpoc = 0;
	}

return 0;
}

Jednak gdy pociski zostają wystrzelone, wraz z ''animacją'' ich poruszania miga mi również deska, czy można to w jakiś sposób uniezależnić i zrobić tak bym mógł wystrzelić kolejną serię z innej pozycji deski zanim ta pierwsza doleci do końca i zniknie ?
Im dalej w las tym więcej drzew stąd moje kolejne pytania ;)
Jeżeli uporam się już z ;;pociskami'' muszę stworzyć tablice znaków które owe pociski będą znikać, oczywiście nie oczekuje gotowego kodu tylko kogoś cierpliwego który naprowadzi mnie na rozwiązanie moich problemów. Czy muszę pokombinować z dwoma tablicami z których jedna będzie zawierać znaki a druga będzie pusta i później za pomocą np. ifa wymusić zamianę znaku z pierwszej tablicy na znak " " drugiej tablicy o tej samej pozycji jeżeli dojdzie do kolizji mojego pocisku? I również podstawić " " za pocisk i wymusić zastopowanie jego ruchu gdy zetknie się ze znakami z pierwszej tablicy ?
Przepraszam za pewnie proste pytania i moją lekką upierdliwość, ale po porostu brak mi już pomysłów -,-
Jeszcze raz dziękuje za wszystkie odpowiedzi! ;)

0

Nie wiem na jakim poziomie jest Twoja znajomość C++, ale jeżeli jest tak jak napisałeś i dopiero zaczynasz stawiać pierwsze kroki, to moim zdaniem najlepiej jest zacząć od nauki podstaw C++.
Moim zdaniem tworzenie tako typu gry można rozpocząć wtedy kiedy przerobiło się co najmniej obiektowość języka (klasy), gdyż tego typu zadanie powinno być pisane w stylu OO. Zabieranie się do tego bez znajomości podstaw mija się z celem.

0

Rozumiem, niestety programowanie mam dopiero drugi semestr, w pierwszym na ćwiczeniach co kolejne zajęcia ''dodawaliśmy'' coś do naszej gry, zaczęliśmy od narysowania ramki, później menu, później narysowania deski, ruch piłeczki itd. Było to w miarę zrozumiale wyjaśnione na zajęciach więc w domu metodą prób i błędów jakoś udało się doprowadzić pierwszy projekt do końca.Niestety teraz w ciągu 3 tygodni musimy sami dodać te tablice,strzelanie, zapisywanie do pliku punktów i wyświetlanie posortowanej tabeli z nazwa użytkownika i punktami podczas gry. A wszystko to muszę zrobić mając jakieś szczątkowe części kodów typu jak zapisać "Ala ma kota" do pliku. No cóż, dziękuję za odpowiedź ;) Będę szukać dalej i próbować ogarnąć to w jakiś sposón dalej albo po prostu będę zmuszony do zapłacenia komuś by ten projekt mi zrobił ponieważ najprawdopodobniej programowanie skończy mi się po pierwszym roku bo kierunek nie jest z nim w ogóle związany. Podejrzewam, że po prostu trzeba trochę przetrzebić liczbę studentów kierunku -,- Pozdrawiam!

0

To co studiujesz?

0

Jeżeli nie OOP to możesz użyć struktur i tablic:

struct Pocisk {
   int x;
   int y;
   bool aktywny;
};
struct Pocisk pociski[MAX_POCISKOW] = {};

Odpowiednie pętle i testy ułatwią panowanie nad wieloma pociskami.

0
stivens napisał(a):

To co studiujesz?

Inżynierię materiałową :)

0
Delor napisał(a):

Jeżeli nie OOP to możesz użyć struktur i tablic:

struct Pocisk {
   int x;
   int y;
   bool aktywny;
};
struct Pocisk pociski[MAX_POCISKOW] = {};

Odpowiednie pętle i testy ułatwią panowanie nad wieloma pociskami.

Dzięki, spróbuję coś z tym podziałać :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1