Adi | tmine
Erfahrenes Mitglied
Hi Leute
In der Schule haben wir angefangen ein Progrämmchen (Pickme) zu programmieren, in C.
Nun habe ich Zuhause mal das ganze etwas verschönert und so, nun meine Frage:
1. Was könnt ich noch verbessern?
2.hab ich irgenwo einen Fehler gemacht? , also ich mein es leuft ja aber halt einen Fehler der sich später melden könnte?
3.Sonstige Meinungen dazu?
PS: ja ich weiss einrücken ist habs halt in mein eigenes Forum kopiert, daher is alles futsch, aber ich hoffe ich kommt trozdem draus.
THX schon mal
Gruss Adi
Hier den Code:
In der Schule haben wir angefangen ein Progrämmchen (Pickme) zu programmieren, in C.
Nun habe ich Zuhause mal das ganze etwas verschönert und so, nun meine Frage:
1. Was könnt ich noch verbessern?
2.hab ich irgenwo einen Fehler gemacht? , also ich mein es leuft ja aber halt einen Fehler der sich später melden könnte?
3.Sonstige Meinungen dazu?
PS: ja ich weiss einrücken ist habs halt in mein eigenes Forum kopiert, daher is alles futsch, aber ich hoffe ich kommt trozdem draus.
THX schon mal
Gruss Adi
Hier den Code:
Code:
// Pickme 00
//
// Author: R.Lanza
// Datum: 16.1.2005
// Fertig gestellt durch: A.Bertschi
//
// Bemerkungen: letzte Stufe des Projektes
//
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
#define MAPWIDTHX 20
#define MAPWIDTHY 10
#define MAPOFFSETY 2
/* Schwirigkeitsgrad */
#define LEVELMAX 10
#define GEGNERNAHE 5
#define GESCH 15
char map[LEVELMAX][MAPWIDTHY][MAPWIDTHX+1];
int cursorPosX = 1, gegnerPosX = 18;
int cursorPosY = 1, gegnerPosY = 8;
/*
* gotoxy
* Diese Funktion ermöglicht eine absolute Positionierung
* des Cursors und damit die Ausgabe eines Textes an
* einer bestimmten Stelle auf dem Schirm
*/
void gotoxy(int x, int y) {
COORD c;
c.X = x;
c.Y = y;
SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c);
}
/*
* mapChar
* Diese Funktion gibt das Zeichen in der "Landkarte"
* an einer bestimmte Stelle zurück.
*/
char getMapChar(int level, int x, int y) {
return (map[level][y][x]);
}
void setMapChar(int level, int x, int y, char c) {
map[level][y][x] = c;
}
/*
* initMap
* Diese Funktion initialisiert die "Landkarte" auf Level 0
* Die Mappe von Level 1 wird aus dem Programm generiert
*/
void initMap() {
int i=0;
for(i=0; i< LEVELMAX; i++){
strcpy(map[i][0], "WWWWWWWWWWWWWWWWWWWW");
strcpy(map[i][1], "W W");
strcpy(map[i][2], "W W");
strcpy(map[i][3], "W W");
strcpy(map[i][4], "W W");
strcpy(map[i][5], "W ");
strcpy(map[i][6], "W W");
strcpy(map[i][7], "W W");
strcpy(map[i][8], "W W");
strcpy(map[i][9], "WWWWWWWWWWWWWWWWWWWW");
}
}
/*
* displayMap
* Zeichnet die "Landkarte"
*/
void displayMap(int mapnr) {
int x,y;
// Titel schreiben
gotoxy(0,0);
printf("%s", "PickMe");
// "Landkarte zeichnen
for (x=0; x<MAPWIDTHX; x++) {
for (y=0; y<MAPWIDTHY; y++) {
gotoxy(x,y+MAPOFFSETY);
printf("%c", getMapChar(mapnr, x,y));
}
}
}
/*
* displayCursor
* Diese Funktion zeichnet den Cursor
*/
void displayCursor() {
gotoxy(cursorPosX,cursorPosY+MAPOFFSETY);
printf("%c", 0x40);
gotoxy(gegnerPosX,gegnerPosY+MAPOFFSETY);
printf("%c", 'K');
}
/*
* displayPrompt
* Diese Funktion zeichnet den Prompt
*/
void displayPrompt() {
gotoxy(0, 12);
printf("%s", "Steuerung mit Pfeilen");
gotoxy(0, 13);
printf("%s", ">");
}
int levelw(int level) {
if(cursorPosX == 19 && cursorPosY == 5){
system("cls");
level++;
if (level>=LEVELMAX) {
gotoxy(25, 5);
printf("Sie haben gewonnen");
sleep(3000);
exit(0);
}
else{
gotoxy(25, 5);
printf("Sie sind ein Level weiter");
sleep(3000);
generatestern(level);
generateH(level);
}
/* Spieler Setzten */
cursorPosX = 1;
cursorPosY = 1;
/*Gegner zufällig setzten und testen ob er zu nahe ist*/
gegnerPosX = rand()%19;
if (gegnerPosX < GEGNERNAHE){
gegnerPosX = rand()%19;
}
gegnerPosY = rand()%8;
if (gegnerPosY < GEGNERNAHE){
gegnerPosY = rand()%8;
}
}
return level;
}
int scanMapForChar(int level, char gegenstand) {
int gefunden=0;
int x, y;
for (x=0; x<MAPWIDTHX; x++){
for (y=0; y<MAPWIDTHY; y++){
if (getMapChar(level,x,y)== gegenstand){
gefunden++;
}
}
}
return gefunden;
}
/*
* generateOstacles
* Diese Funktion erzeugt level zufällige Hindernisse
*/
int generateH(int level) {
int nrOfObstacles=0;
int randX;
int randY;
while (nrOfObstacles<level +5) {
randX = (rand() % MAPWIDTHX) + MAPOFFSETY;
randY = (rand() % MAPWIDTHY)+ MAPOFFSETY;
if (getMapChar(level, randX, randY)==' ' && randX != 1 && randY != 1 && randX != 19 && randY != 5) {
setMapChar(level, randX, randY, 'H');
nrOfObstacles++;
}
}
}
/*
* generateOstacles
* Diese Funktion erzeugt 6 zufällige Aufnahmemöglichkeiten
*/
int generatestern(int level) {
int nrOfObstacles=0;
int randX;
int randY;
while (nrOfObstacles<6) {
randX = (rand() % MAPWIDTHX) + MAPOFFSETY;
randY = (rand() % MAPWIDTHY)+ MAPOFFSETY;
if (getMapChar(level, randX, randY)==' ') {
setMapChar(level, randX, randY, '*');
nrOfObstacles++;
}
}
}
// ---------------------------------------------------
// KI
// Ist das @ links oder rechts vom K?
// return
// 1 = links
// 2 = rechts
// ---------------------------------------------------
int klr(int cursorPosX, int gegnerPosX){
if ( cursorPosX < gegnerPosX){
return (1);
}
else return (2);
return(0);
}
// ---------------------------------------------------
// KI
// Ist das @ oben oder unten vom K?
// return
// 1 = oben
// 2 = unten
// ---------------------------------------------------
int kou(int cursorPosY, int gegnerPosY ){
if ( cursorPosY < gegnerPosY){
return (1);
}
else return (2);
return(0);
}
// ---------------------------------------------------
// Hauptprogramm
// ---------------------------------------------------
int main() {
//Zufallsgenerator inizialisieren
srand(time(0));
// Variablen deklarieren
char keypress=0x00; //
int aufgenommen=0, level=0;
int wait=0;
int zufall=0;
// Variablen initialisieren
initMap();
generatestern(level);
generateH(level);
do {
// Menu
system("cls");
displayMap(level);
displayCursor();
displayPrompt();
//Diverse Infos
printf(" \nSie haben %i Gegenstaende Aufgenommen" , aufgenommen);
printf(" \nIhre Position: x=%i y=%i " ,cursorPosX, cursorPosY );
printf(" \nSie sind im Level %i " ,level+1 );
printf("Wait: %i", wait);
// warten auf einen Tastendruck
if (kbhit()) {
keypress = getch();
if (keypress == 0xE0){
keypress = getch();
}
fflush(stdin);
}
else keypress = 0;
switch(keypress) {
case 75: // nach links
if (cursorPosX>0) {
if (getMapChar(level,cursorPosX-1,cursorPosY)!='W' && getMapChar(level,cursorPosX-1,cursorPosY)!='H') {
cursorPosX--;
if(getMapChar(level, cursorPosX,cursorPosY)=='*'){
map[level][cursorPosY][cursorPosX]=' ';
aufgenommen++;
}
if (scanMapForChar(level,'*')==0) {
level = levelw(level);
}
}
}
break;
case 77: // nach rechts
if (cursorPosX<MAPWIDTHX) {
if (getMapChar(level,cursorPosX+1,cursorPosY)!='W' && getMapChar(level,cursorPosX+1,cursorPosY)!='H') {
cursorPosX++;
if(getMapChar(level,cursorPosX,cursorPosY)=='*'){
map[level][cursorPosY][cursorPosX]=' ';
aufgenommen++;
}
if (scanMapForChar(level,'*')==0) {
level = levelw(level);
}
}
}
break;
case 72: // nach oben
if (cursorPosY>0) {
if (getMapChar(level,cursorPosX,cursorPosY-1)!='W' && getMapChar(level,cursorPosX,cursorPosY-1)!='H') {
cursorPosY--;
if(getMapChar(level,cursorPosX,cursorPosY)=='*'){
map[level][cursorPosY][cursorPosX]=' ';
aufgenommen++;
}
if (scanMapForChar(level,'*')==0) {
level = levelw(level);
}
}
}
break;
case 80: // nach unten
if (cursorPosY<MAPWIDTHY) {
if (getMapChar(level,cursorPosX,cursorPosY+1)!='W' && getMapChar(level,cursorPosX,cursorPosY+1)!='H') {
cursorPosY++;
if(getMapChar(level,cursorPosX,cursorPosY)=='*'){
map[level][cursorPosY][cursorPosX]=' ';
aufgenommen++;
}
if (scanMapForChar(level,'*')==0) {
level = levelw(level);
}
}
}
break;
}
wait++;
if (wait == GESCH){
wait = 0;
zufall = rand()%3;
switch(zufall){
case 1:
// K geht in richtung @
if (kou(cursorPosY, gegnerPosY) == 1){
if (getMapChar(level,gegnerPosX,gegnerPosY-1)!='W' && getMapChar(level,gegnerPosX,gegnerPosY-1)!='H') {
gegnerPosY--;
}
}
else if (kou(cursorPosY, gegnerPosY) == 2){
if (getMapChar(level,gegnerPosX,gegnerPosY+1)!='W' && getMapChar(level,gegnerPosX,gegnerPosY+1)!='H') {
gegnerPosY++;
}
}
break;
case 2:
if(klr(cursorPosX, gegnerPosX) == 1){
if (getMapChar(level,gegnerPosX-1,gegnerPosY)!='W' && getMapChar(level,gegnerPosX-1,gegnerPosY)!='H') {
gegnerPosX--;
}
}
else if(klr(cursorPosX, gegnerPosX) == 2){
if (getMapChar(level,gegnerPosX+1,gegnerPosY)!='W' && getMapChar(level,gegnerPosX+1,gegnerPosY)!='H') {
gegnerPosX++;
}
}
break;
}
}
/* Mit Gegner zusammengestossen, GAME OVER*/
if((cursorPosX == gegnerPosX) && (cursorPosY == gegnerPosY)){
system("cls");
gotoxy(25, 5);
printf("Game Over");
sleep(3000);
exit(0);
}
} while (keypress!=0x27);
}