Dobry wieczór, zwracam się do Was z problemem, z którym nie mogę sobie poradzić- otóż napisałem "projekt" na studia, mowa tu o programie udającym snake'a. Po zaprezentowaniu go prowadzącemu ćwiczenia usłyszałem, iż powinienem rozbić maina na funkcje aby main był jak najkrótszy. Jako że bardzo mi zależy, aby moja praca została wysoko oceniona, podjąłem się tego zadania. Problem w tym, że nie mam kompletnie pomysłu jak sobie z tym poradzić. Jestem początkujący w tych sprawach i przy próbie rozbicia tego na funkcje co chwile wywala mi jakiś błąd. Gdyby ktoś byłby w stanie wskazać mi drogę do rozwiązania, jakąkolwiek wskazówkę, byłbym bardzo wdzięczny. Pozdrawiam cieplutko :)
PS zamieszczam kod, aby było wiadomo o co chodzi :)
// Snake podejscie pierwsze 21.11.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <time.h>
#include <windows.h>
#include <conio.h>
#include <cstdlib>
#include <cstdio>
using namespace std;
void idzdoxy(int x, int y)
{
HANDLE hCon;
COORD dwPos;
dwPos.X = x;
dwPos.Y = y;
hCon = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hCon, dwPos);
}
char *tr(char *str) //funkcja na polskie znaki
{
static char buff[256];
char cp[] = "\245\206\251\210\344\242\230\276\253\244\217\250\235\343\340\227\275\215ąćęłńóśżźĄĆĘŁŃÓŚŻŹ";
if (strlen(str) >= sizeof(buff)) return str;
char *bf = buff;
while (*str)
{
char *pos = strchr(cp + 18, *str);
*(bf++) = pos ? *(pos - 18) : *str;
++str;
}
*bf = 0;
return buff;
}
void poprawnosc(int *x, int z1, int z2)
{
HANDLE hOut; //nadanie koloru czcionce
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
while (*x < z1 || *x > z2)
{
SetConsoleTextAttribute(hOut, FOREGROUND_RED);
cout << tr("Niestety Twoja liczba nie znajduje się w przedziale, spróbuj jeszcze raz: ");
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
cin >> *x;
}
}
void poczatek(int pole[][])
{
for (int i = 0; i < wys; i++)
{
for (int j = 0; j < szer; j++)
{
pole[j][i] = 0; //wypelnianie tablicy zerami
}
}
do {
Xj = rand() % szer; //pozycja poczatkowa jedzenia
Yj = rand() % wys;
} while (pole[Xj][Yj] != 0);
pole[Xj][Yj] = 2;
if (wybor == 0)
{
Xw = rand() % szer; //pozycja poczatkowa dla 0
Yw = rand() % wys;
}
else
{
Xw = 1;
Yw = 1;
}
pole[Xw][Yw] = 1;
}
int main()
{
int szer, wys, dl = 0, speed, gracdalej;
int gora, dol, lewo, prawo;
char pole[50][50];
int hX[10000]; int hY[10000]; int ruchy = 0;
int Xw, Yw, Xj, Yj;
int klawisz, punkty = 0, wybor;
char zwrot = 'p';
srand(time(NULL));
HANDLE hOut; //nadanie koloru czcionce
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
cout << "Witam w programie Snake autorstwa Daniela Kalety" << endl; //intro
Sleep(1000);
cout << tr("Na początek podaj szerokość planszy, na której chcesz zagrać (od 5 do 35): "); //szerokosc
cin >> szer;
while(cin.good() == false)
{
SetConsoleTextAttribute(hOut, FOREGROUND_RED);
cout << tr("Wprowadziłeś literkę zamiast liczby, spróbuj jeszcze raz: ");
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
cin.clear();
cin.ignore(1000, '\n');
cin >> szer;
}
int *wszer = &szer;
poprawnosc(wszer, 5, 35);
cout << tr("Teraz podaj wysokość tej planszy (od 5 do 35): "); //wysokosc
cin >> wys;
while (cin.good() == false)
{
SetConsoleTextAttribute(hOut, FOREGROUND_RED);
cout << tr("Wprowadziłeś literkę zamiast liczby, spróbuj jeszcze raz: ");
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
cin.clear();
cin.ignore(1000, '\n');
cin >> wys;
}
int *wwys = &wys;
poprawnosc(wwys, 5, 35);
cout << tr("A więc zadeklarowana przez Ciebie plansza będzie miała wymiary: ") << szer << " x " << wys << endl; //wypisanie wymiarow planszy
cout << tr("Podaj tempo gry w jakim życzysz sobie zagrać od 1 do 50: ");
cin >> speed;
while (cin.good() == false)
{
SetConsoleTextAttribute(hOut, FOREGROUND_RED);
cout << tr("Wprowadziłeś literkę zamiast liczby, spróbuj jeszcze raz: ");
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
cin.clear();
cin.ignore(1000, '\n');
cin >> speed;
}
int *wspeed = &speed;
poprawnosc(wspeed, 1, 50);
cout << tr("Czy chcesz, aby uderzenie o ściane powodowało koniec gry? Wpisz 0- nie, 1-tak: "); //czy kolizja
cin >> wybor;
while (cin.good() == false)
{
SetConsoleTextAttribute(hOut, FOREGROUND_RED);
cout << tr("Wprowadziłeś literkę zamiast liczby, spróbuj jeszcze raz: ");
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
cin.clear();
cin.ignore(1000, '\n');
cin >> wybor;
}
while (wybor <0 || wybor>1)
{
SetConsoleTextAttribute(hOut, FOREGROUND_RED);
cout << tr("Niestety Twoja liczba nie znajduje się w przedziale, sprobój jeszcze raz: ");
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
cin >> wybor;
}
cout << "Na koniec zadeklaruj przyciski sterowania" << endl;
cout << tr("Góra: ") << endl;
gora = _getch();
if (gora == 224)gora += _getch();
if (gora == 0)gora -= _getch();
cout << tr("Dół: ") << endl;
dol = _getch();
if (dol == 224)dol += _getch();
if (dol == 0)dol -= _getch();
cout << tr("Lewo: ") << endl;
lewo = _getch();
if (lewo == 224)lewo += _getch();
if (lewo == 0)lewo -= _getch();
cout << tr("Prawo: ") << endl;
prawo = _getch();
if (prawo == 224)prawo += _getch();
if (prawo == 0)prawo -= _getch();
Sleep(2000);
system("cls"); //zakonczenie procesu konfiguracji
do
{
for (int i = 0; i < wys; i++)
{
for (int j = 0; j < szer; j++)
{
pole[j][i] = 0; //wypelnianie tablicy zerami
}
}
do {
Xj = rand() % szer; //pozycja poczatkowa jedzenia
Yj = rand() % wys;
} while (pole[Xj][Yj] != 0);
pole[Xj][Yj] = 2;
if (wybor == 0)
{
Xw = rand() % szer; //pozycja poczatkowa dla 0
Yw = rand() % wys;
}
else
{
Xw = 1;
Yw = 1;
}
pole[Xw][Yw] = 1;
idzdoxy(0, 0);
//rysowanie planszy
SetConsoleTextAttribute(hOut, FOREGROUND_RED);
for (int i = 0; i <= szer + 1; i++) //gorna ramka
cout << (char)178 << (char)178;
for (int i = 0; i < wys; i++)
{
cout << endl << (char)178 << (char)178; //prawa ramka
for (int j = 0; j < szer; j++)
{
if (pole[j][i] == 0)
{
cout << " "; //wypelniacz pola
}
if (pole[j][i] == 1)
{
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
cout << (char)219 << (char)219; //waz
}
if (pole[j][i] == 2)
{
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED);
cout << (char)123 << (char)125; //jedzenie
}
}
SetConsoleTextAttribute(hOut, FOREGROUND_RED);
cout << (char)178 << (char)178; //lewa ramka
}
cout << endl;
for (int i = 0; i <= szer + 1; i++) //koniec rysowania planszy
cout << (char)178 << (char)178;
for (;;) //GRA !!!!
{
ruchy++;
hX[ruchy] = Xw;
hY[ruchy] = Yw;
Sleep(1000 / (speed + (dl / 2))); //predkosc
if (wybor == 1)
punkty++;
if (_kbhit())
{
klawisz = _getch();
if (klawisz == 224)klawisz += _getch();
if (klawisz == 0) klawisz -= _getch();
if (klawisz == gora && zwrot != 'd') zwrot = 'g'; //deklaracja poruszania
if (klawisz == dol && zwrot != 'g') zwrot = 'd';
if (klawisz == lewo && zwrot != 'p') zwrot = 'l';
if (klawisz == prawo && zwrot != 'l') zwrot = 'p';
}
if (zwrot == 'l') Xw--; //ruch weza
if (zwrot == 'p') Xw++;
if (zwrot == 'g') Yw--;
if (zwrot == 'd') Yw++;
if (wybor == 0)
{
if (Xw == szer) Xw = 0; //brak kolizji na scianach
if (Xw == -1) Xw = szer - 1;
if (Yw == wys) Yw = 0;
if (Yw == -1) Yw = wys - 1;
}
if (wybor == 1) //kolizja na scianach
{
{
if (Xw == szer || Xw == -1)
break;
if (Yw == wys || Yw == -1)
break;
}
}
if (pole[Xw][Yw] == 1) //jedzenie samego siebie
{
break;
}
if (pole[Xw][Yw] == 2) //jedzenie jedzenia :D
{
punkty = punkty + (2 * speed);
dl++;
do {
Xj = rand() % szer; //pozycja nowego jedzenia
Yj = rand() % wys;
} while (pole[Xj][Yj] != 0);
pole[Xj][Yj] = 2;
idzdoxy(Xj * 2 + 2, Yj + 1);
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED);
cout << (char)123 << (char)125;
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN);
}
else
{
if (ruchy > 0) pole[hX[ruchy - dl]][hY[ruchy - dl]] = 0; //usuwanie ogona
idzdoxy(hX[ruchy - dl] * 2 + 2, hY[ruchy - dl] + 1);
cout << " ";
}
pole[Xw][Yw] = 1;
idzdoxy(Xw * 2 + 2, Yw + 1);
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN);
cout << (char)219 << (char)219;
idzdoxy(0, wys + 1);
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
cout << endl << "Punkty: " << punkty;
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
}
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
cout << endl << "Koniec gry, zdobyte punkty: " << punkty;
cout << endl << tr("Czy chcesz zagraæ jeszcze raz na tych samych ustawieniach? 0- nie, 1-tak: ");
cin >> gracdalej;
while (gracdalej < 0 || gracdalej>1)
{
cout << tr("Niestety nie ma takiej opcji, sprobój jeszcze raz: ");
cin >> gracdalej;
}
if (gracdalej == 1)
{
system("cls");
punkty = 0;
dl = 0;
}
} while (gracdalej == 1);
cout << "Zatem do widzenia!";
Sleep(1500);
return 0;
}