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

#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);
}
}