You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
366 lines
7.4 KiB
366 lines
7.4 KiB
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
//Spielfeldbreite und Spielfeldhöhe werden definiert
|
|
#define fieldWidth 23
|
|
#define fieldHeigth 29
|
|
|
|
#pragma region VarDeclaration
|
|
//Vertikale Startposition der Wand im Array
|
|
int wallX = 0;
|
|
//Horizontale Startposition der Wand im Array
|
|
int wallY = 0;
|
|
//Wandlaenge, um Waende von der Startposition aus in das Array für das Spielfeld eintragen zu koennen
|
|
int wallLength = 0;
|
|
int binX;
|
|
int binY = 10;
|
|
|
|
char field[fieldWidth][fieldHeigth];
|
|
int windForce = 0;
|
|
int ScorePoints = 0;
|
|
|
|
int lifeCount = 3;
|
|
int ballX = -1;
|
|
int ballY = 27;
|
|
int windIntervall = 0;
|
|
int lvlnumber = 1;
|
|
|
|
#pragma endregion
|
|
|
|
#pragma region FunctionDeclaration
|
|
void addScoreboard();
|
|
void clearField();
|
|
void generateField();
|
|
void sortScoreboard();
|
|
void buildBin(int width, int height);
|
|
void getStartPosition();
|
|
int checkBallPosition();
|
|
#pragma endregion
|
|
|
|
//Ein struct für den Spieler erstellt um
|
|
//jedem Spieler seinen Score zuweisen zu können
|
|
struct Player
|
|
{
|
|
char Name[50];
|
|
int Points;
|
|
}playerlist[11];
|
|
|
|
|
|
void buildBin(int width, int heigth)
|
|
{
|
|
field[width][heigth] = 'V';
|
|
field[width+1][heigth+1] = '\\';
|
|
field[width+2][heigth+2] = '\\';
|
|
field[width-1][heigth+1] = '/';
|
|
field[width-2][heigth+2] = '/';
|
|
field[width][heigth+1] = ' ';
|
|
}
|
|
|
|
void loadLevel(int lvlnum)
|
|
{
|
|
clearField();
|
|
ballX = -1;
|
|
ballY = 27;
|
|
|
|
int tmpX,tmpY;
|
|
|
|
switch (lvlnum)
|
|
{
|
|
case(1):
|
|
binX = 12;
|
|
binY = 10;
|
|
break;
|
|
|
|
case(2):
|
|
case(3):
|
|
case(4):
|
|
case(5):
|
|
case(6):
|
|
tmpX = rand() % 19;
|
|
tmpY = rand() % 12;
|
|
while (5 >tmpX)
|
|
{
|
|
tmpX = rand()%19;
|
|
}
|
|
while (5 > tmpY)
|
|
{
|
|
tmpY = rand() % 12;
|
|
}
|
|
binX = tmpX;
|
|
binY = tmpY;
|
|
break;
|
|
|
|
case(7):
|
|
binX = 2;
|
|
binY = 7;
|
|
windForce = -2;
|
|
printf("Ein Sturm zieht auf!\n");
|
|
sleep(3);
|
|
break;
|
|
|
|
case(8):
|
|
binX = 19;
|
|
binY = 7;
|
|
windForce = 1;
|
|
break;
|
|
|
|
case(9):
|
|
windForce = -1;
|
|
binX = 8;
|
|
binY = 9;
|
|
wallX = 7;
|
|
wallLength = 4;
|
|
wallY = 17;
|
|
break;
|
|
|
|
case(10):
|
|
windForce = 2;
|
|
binX = 16;
|
|
binY = 12;
|
|
wallX = 11;
|
|
wallLength = 4;
|
|
wallY = 19;
|
|
break;
|
|
|
|
case(11):
|
|
system("clear");
|
|
generateField();
|
|
addScoreboard();
|
|
sortScoreboard();
|
|
exit(0);
|
|
break;
|
|
|
|
default:
|
|
exit(0);
|
|
}
|
|
|
|
getStartPosition();
|
|
printf("Der Ball wird geworfen!!!");
|
|
sleep(1);
|
|
}
|
|
|
|
int main()
|
|
{
|
|
loadLevel(lvlnumber);
|
|
while (1)
|
|
{
|
|
clearField();
|
|
field[ballX][ballY -= 1] = 'O';
|
|
generateField();
|
|
int ball_In_Bin = checkBallPosition();
|
|
|
|
switch (ball_In_Bin)
|
|
{
|
|
case (1):
|
|
ScorePoints += 50;
|
|
loadLevel(++lvlnumber);
|
|
break;
|
|
|
|
case(2):
|
|
ScorePoints -= 5;
|
|
lifeCount--;
|
|
if (lifeCount < 1)
|
|
{
|
|
if (lvlnumber == 1)
|
|
{
|
|
char choice = ' ';
|
|
printf("Scheint so als wäre das Spiel eine Nummer zu groß für dich!\n");
|
|
printf("Willst du einen Leichteren Modus Starten?\n[J]a/[N]ein\n");
|
|
scanf(" %c", &choice);
|
|
system("start \"\" \"https://youtu.be/dQw4w9WgXcQ\"");
|
|
return 0;
|
|
}
|
|
addScoreboard();
|
|
sortScoreboard();
|
|
return 0;
|
|
}
|
|
loadLevel(lvlnumber);
|
|
break;
|
|
}
|
|
ball_In_Bin = 0;
|
|
sleep(1);
|
|
}
|
|
}
|
|
|
|
void getStartPosition()
|
|
{
|
|
|
|
while (ballX == -1)
|
|
{
|
|
for (int i = 2, j = 0; i <= 20; i += 2, j++)
|
|
{
|
|
field[i][ballY] = j + '0';
|
|
}
|
|
generateField();
|
|
//printf("W\x84\hle die position des Balls (0-9):\n");
|
|
printf("Wähle die position des Balls (0-9):\n");
|
|
|
|
scanf("%d", &ballX);
|
|
|
|
if (ballX < 0 || 9 < ballX)
|
|
{
|
|
ballX = -1;
|
|
continue;
|
|
}
|
|
ballX = (ballX + 1)*2;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
void clearField()
|
|
{
|
|
for (int i = 0; i < fieldWidth; i++)
|
|
{
|
|
for (int j = 0; j < fieldHeigth; j++)
|
|
{
|
|
field[i][j] = ' ';
|
|
}
|
|
}
|
|
}
|
|
|
|
void generateField()
|
|
{
|
|
system("clear");
|
|
buildBin(binX, binY);
|
|
|
|
if (ScorePoints < 0)
|
|
ScorePoints = 0;
|
|
|
|
int tmp = ScorePoints;
|
|
field[12][1] = '0' + tmp % 10;
|
|
|
|
tmp /= 10;
|
|
field[11][1] = '0' + tmp % 10;
|
|
|
|
tmp /= 10;
|
|
field[10][1] = '0' + tmp % 10;
|
|
|
|
field[1][1] = lifeCount < 1 ? 'X' : 'O';
|
|
field[2][1] = lifeCount < 2 ? 'X' : 'O';
|
|
field[3][1] = lifeCount < 3 ? 'X' : 'O';
|
|
|
|
if (windForce != 0)
|
|
{
|
|
field[19][1] = windForce < 0 ? '<' : '>';
|
|
field[20][1] = windForce < 0 ? (windForce * -1 + '0') : (windForce + '0');
|
|
}
|
|
|
|
if (wallX > 0 && wallY > 0 && wallLength > 0)
|
|
{
|
|
for (int i = wallX; i < +wallX + wallLength; i++)
|
|
{
|
|
field[i][wallY] = '_';
|
|
}
|
|
|
|
}
|
|
if (lvlnumber > 6 && windIntervall % 2 == 0)
|
|
{
|
|
windForce < 0 ? (ballX -= windForce * -1) : (ballX += windForce);
|
|
}
|
|
windIntervall++;
|
|
|
|
for (int i = 0; i < fieldHeigth; i++)
|
|
{
|
|
printf("|");
|
|
for (int j = 0; j < fieldWidth; j++)
|
|
{
|
|
if (i == 0 || i == fieldHeigth - 1 || i == 2)
|
|
printf("=");
|
|
else
|
|
printf("%c", field[j][i]);
|
|
}
|
|
printf("|");
|
|
printf("\n");
|
|
}
|
|
|
|
}
|
|
|
|
void addScoreboard()
|
|
{
|
|
//Die txt wird geöffnet
|
|
FILE* fp = fopen("ScoreBoard.txt", "a+");
|
|
char name[255];
|
|
|
|
printf("Bitte gib deinen Namen ein:\n");
|
|
scanf("%s", name);
|
|
|
|
fprintf(fp, "%s %d\n", name, ScorePoints);
|
|
fclose(fp);
|
|
}
|
|
|
|
int checkBallPosition()
|
|
{
|
|
if (binY + 2 == ballY && (ballX == binX || ballX == binX + 1 || ballX == binX - 1))
|
|
{
|
|
return 1;
|
|
}
|
|
else if (binY + 1 >= ballY || field[ballX][ballY - 1] == '_' || ballX >= fieldWidth || ballX <= 0)
|
|
{
|
|
return 2;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void sortScoreboard()
|
|
{
|
|
//Öffnet die Textdatei oder erstellt sie wenn keine existiert
|
|
FILE* fp;
|
|
fp = fopen("ScoreBoard.txt", "a+");
|
|
if (fp == NULL)
|
|
{
|
|
printf("Datei konnte nicht geoeffnet werden.\n");
|
|
}
|
|
else
|
|
{
|
|
system("clear");
|
|
FILE *file = fopen("ScoreBoard.txt", "r");
|
|
char line[1000];
|
|
int numberOfLines = 0;
|
|
//Die Textdatei wird Zeile für Zeile eingelesen und in die Strukturliste eingefügt
|
|
for (int j = 0; fgets(line, sizeof line, file) != NULL && j <= 10; j++)
|
|
{
|
|
char* playertmp = strtok(line, " ");
|
|
strcpy(playerlist[j].Name, playertmp);
|
|
|
|
playertmp = strtok(NULL, " ");
|
|
int playerPoints = atoi(playertmp);
|
|
|
|
playerlist[j].Points = playerPoints;
|
|
|
|
numberOfLines = j;
|
|
sleep(0.1);
|
|
}
|
|
|
|
struct Player temp;
|
|
for (int i = 0; i < numberOfLines; i++)
|
|
{
|
|
for (int j = 0; j < (numberOfLines - i); j++)
|
|
{
|
|
if (playerlist[i].Points < playerlist[i + 1].Points)
|
|
{
|
|
temp = playerlist[i];
|
|
playerlist[i] = playerlist[i + 1];
|
|
playerlist[i + 1] = temp;
|
|
}
|
|
}
|
|
}
|
|
fclose(fp);
|
|
|
|
printf(" Scoreboard:\n\n");
|
|
for (int j = 0; j < numberOfLines; j++)
|
|
{
|
|
printf("%d. %s %s %d\n", j + 1, (j < 9) ? " " : " ", playerlist[j].Name, playerlist[j].Points);
|
|
sleep(0.5);
|
|
}
|
|
|
|
|
|
FILE* fp = fopen("ScoreBoard.txt", "w");
|
|
for (int i = 0; i < numberOfLines; i++)
|
|
{
|
|
fprintf(fp, "%s %d\n", playerlist[i].Name, playerlist[i].Points);
|
|
}
|
|
|
|
fclose(fp);
|
|
}
|
|
}
|