#include <stdlib.h>
#include "SDL.h"
#include "SDL_image.h"
#include "time.h"
//für Zufallszahlen
int main()
{
SDL_Surface *display,
*image,
*image2,
*kristall,
*ausgang,
*player,
*enemy;
SDL_Rect drect, srect;
SDL_Rect dplayer, splayer;
SDL_Rect denemy, senemy;
SDL_Event event;
int tilesize = 30;
const int mapHoehe = 10,
mapBreite = 16;
int exitX = 12,
exitY = 8;
int playerXPos = 1;
int playerYPos = 1;
double enemyXPos = 13,
enemyYPos = 2;
double enemyXSpeed = .009,
enemyYSpeed = .009;
int fensterBreite = mapBreite * tilesize;
int fensterHoehe = mapHoehe * tilesize;
int zufallszahl;
int anzahlKristalle = 0;
int kSeed = 16;
int playerMoved = 0;
// 0 Boden
// 1 Mauer
// 2 Kristall
// 3 Exit
int map[mapHoehe][mapBreite] = {
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,1,1,1,1,0,0,1,0,1,1,1},
{1,0,0,0,0,0,0,0,1,0,1,1,0,0,0,1},
{1,1,1,0,1,1,0,0,1,0,1,0,0,0,0,1},
{1,0,0,0,0,1,0,0,1,1,1,0,0,0,0,1},
{1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
};
while(anzahlKristalle != kSeed){
for( int y = 0; y < mapHoehe; y++) {
for ( int x = 0; x < mapBreite; x++ ) {
if(map[y][x]==0){
zufallszahl=rand()%120;
if(
(zufallszahl <= 13) &&
(zufallszahl > 10) &&
(anzahlKristalle < kSeed) &&
(x != exitX) &&
(y != exitY) &&
(x != playerXPos) &&
(y != playerYPos)){
map[y][x]=2;
anzahlKristalle++;
srand(time(NULL));
}
}
}
}
}
int zufallY=0;
int zufallX=0;
while(map[zufallY][zufallX]!=0){
zufallY=rand()%mapHoehe;
zufallX=rand()%mapBreite;
enemyYPos = zufallY;
enemyXPos = zufallX;
}
int quit = 0;
if ( SDL_Init( SDL_INIT_VIDEO ) < 0 ) {
fprintf(stderr, "SDL konnte nicht initialisiert werden: %s\n", SDL_GetError());
exit(1);
}
atexit(SDL_Quit);
display = SDL_SetVideoMode(fensterBreite ,fensterHoehe ,16 ,SDL_SWSURFACE);
if ( display == NULL ) {
fprintf(stderr, "Konnte Fenster nicht bauen: %s\n", SDL_GetError());
exit(-1);
}
image = IMG_Load("tile01.jpg");
if ( image == NULL ) {
fprintf(stderr, "Bild konnte nicht geladen werden: %s\n", SDL_GetError());
exit(-1);
}
image2 = IMG_Load("tile02.jpg");
if ( image2 == NULL ) {
fprintf(stderr, "Bild konnte nicht geladen werden: %s\n", SDL_GetError());
exit(-1);
}
kristall = IMG_Load("kristall.gif");
if( kristall == NULL ) {
fprintf(stderr, "Kristall konnte nicht geladen werden: %s\n", SDL_GetError());
exit(-1);
}
ausgang = IMG_Load("exit.gif");
if( exit == NULL ) {
fprintf(stderr, "Exit konnte nicht geladen werden: %s\n", SDL_GetError());
exit(-1);
}
player = IMG_Load("player.gif");
if ( image == NULL ) {
fprintf(stderr, "Player konnte nicht geladen werden: %s\n", SDL_GetError());
exit(-1);
}
enemy = IMG_Load("enemy.gif");
if ( enemy == NULL ) {
fprintf(stderr, "Enemy konnte nicht geladen werden: %s\n", SDL_GetError());
exit(-1);
}
srect.x = 0;
srect.y = 0;
srect.w = image->w;
srect.h = image->h;
drect.x = 0;
drect.y = 0;
drect.w = image->w;
drect.h = image->h;
splayer.x = 0;
splayer.y = 0;
splayer.w = player->w;
splayer.h = player->h;
dplayer.x = playerXPos * tilesize;
dplayer.y = playerYPos * tilesize;
dplayer.w = player->w;
dplayer.h = player->h;
senemy.x = 0;
senemy.y = 0;
senemy.w = tilesize;
senemy.h = tilesize;
denemy.x = enemyXPos * tilesize;
denemy.y = enemyYPos * tilesize;
denemy.w = tilesize;
denemy.h = tilesize;
for( int y = 0; y < mapHoehe; y++) {
for ( int x = 0; x < mapBreite; x++ ) {
drect.x = tilesize * x;
drect.y = tilesize * y;
if( map[y][x] == 1){
SDL_BlitSurface(image, &srect, display, &drect);
}
else {
SDL_BlitSurface(image2, &srect, display, &drect);
}
if( map[y][x] == 2){
SDL_BlitSurface(kristall, &srect, display, &drect);
}
if( map[y][x] == 3){
SDL_BlitSurface(ausgang, &srect, display, &drect);
}
SDL_UpdateRects(display, 1, &drect);
}
}
SDL_BlitSurface(player, &splayer, display, &dplayer);
SDL_UpdateRects(display, 1, &dplayer);
SDL_BlitSurface(enemy, &senemy, display, &denemy);
SDL_UpdateRects(display, 1, &denemy);
while( quit == 0 ) {
while( SDL_PollEvent( &event ) ) {
switch( event.type ) {
case SDL_KEYDOWN:
if(event.key.keysym.sym == 276 && (map[playerYPos][playerXPos-1] != 1)) { // nach links
playerXPos--;
}
if(event.key.keysym.sym == 275 && (map[playerYPos][playerXPos+1] != 1)) { // nach rechts
playerXPos++;
}
if(event.key.keysym.sym == 274 && (map[playerYPos+1][playerXPos] != 1)) { // nach unten
playerYPos++;
}
if(event.key.keysym.sym == 273 && (map[playerYPos-1][playerXPos] != 1)) { // nach oben
playerYPos--;
}
dplayer.x = playerXPos * tilesize;
dplayer.y = playerYPos * tilesize;
if(map[playerYPos][playerXPos] == 2) {
map[playerYPos][playerXPos] = 0;
anzahlKristalle--;
if(anzahlKristalle == 0) {
exitY=enemyYPos;
exitX=enemyXPos;
map[exitY][exitX] = 3;
}
}
if((playerYPos == exitY) && (playerXPos == exitX) && anzahlKristalle < 1)
quit = 1;
break;
case SDL_QUIT:
quit = 1;
break;
default:
break;
}
}
for( int y = 0; y < mapHoehe; y++) {
for ( int x = 0; x < mapBreite; x++ ) {
drect.x = tilesize * x;
drect.y = tilesize * y;
if( map[y][x] == 1){
SDL_BlitSurface(image, &srect, display, &drect);
}
else {
SDL_BlitSurface(image2, &srect, display, &drect);
}
if( map[y][x] == 2) {
SDL_BlitSurface(kristall, &srect, display, &drect);
}
if( map[y][x] == 3) {
SDL_BlitSurface(ausgang, &srect, display, &drect);
}
}
}
if(map[(int)enemyYPos][(int)(enemyXPos-.5)] == 1){
enemyXSpeed *= -1;
enemyXPos += .005;
}
if(map[(int)enemyYPos][(int)(enemyXPos+.5)] == 1){
enemyXSpeed *= -1;
enemyXPos -= .005;
}
if(map[(int)(enemyYPos-.5)][(int)enemyXPos] == 1){
enemyYSpeed *= -1;
enemyYPos += .005;
}
if(map[(int)(enemyYPos+.5)][(int)enemyXPos] == 1){
enemyYSpeed *=-1;
enemyYPos -= .005;
}
if((enemyXPos - playerXPos) < 3 && (enemyXPos - playerXPos) > 3)
enemyXSpeed *= -1;
if((enemyXPos - playerYPos) < 3 && (enemyYPos - playerYPos) > 3)
enemyYSpeed *= -1;
if(((int)enemyXPos == playerXPos) && ((int)enemyYPos == playerYPos))
quit = 1;
enemyXPos -= enemyXSpeed;
enemyYPos -= enemyYSpeed;
denemy.x = (int) enemyXPos * tilesize;
denemy.y = (int) enemyYPos * tilesize;
SDL_BlitSurface(player, &splayer, display, &dplayer);
SDL_BlitSurface(enemy, &senemy, display, &denemy);
SDL_Flip(display);
}
SDL_FreeSurface(image);
SDL_FreeSurface(image2);
SDL_FreeSurface(player);
SDL_FreeSurface(enemy);
SDL_FreeSurface(kristall);
SDL_FreeSurface(ausgang);
exit(0);
}