Das Siel Space Invaders ist nun 40 Jahre alt und war einmal ein sehr beliebtes Spiel auf den Automaten. Danach wurde es auf vielen Rechner und Konsolen portiert. Hier hab ich eine Version für die Linux Konsole, die ich von einer Windows version portiert hatte. Das programm einfach in eine Textdatei mit Namen SpaceInvaders.c kopieren und mit gcc SpaceInvaders.c kompilieren. Viel Spass damit.
Links:
https://de.wikipedia.org/wiki/Space_Invaders
#include <stdio.h> #include <stdlib.h> #include <termios.h> //termios, TCSANOW, ECHO, ICANON #include <unistd.h> //STDIN_FILENO int getch() { int ch = 0; struct termios orig_termios, new_settings; tcgetattr(0,&orig_termios); new_settings = orig_termios; new_settings.c_lflag &= ~ICANON; new_settings.c_lflag &= ~ECHO; new_settings.c_lflag &= ~ISIG; tcsetattr(0, TCSANOW, &new_settings); ch = getchar(); tcsetattr(0, TCSANOW, &orig_termios); return ch; } int kbhit() { int ch = 0; struct termios orig_termios, new_settings; tcgetattr(0,&orig_termios); new_settings = orig_termios; new_settings.c_lflag &= ~ICANON; new_settings.c_lflag &= ~ECHO; new_settings.c_lflag &= ~ISIG; new_settings.c_cc[VMIN] = 0; new_settings.c_cc[VTIME] = 0; tcsetattr(0, TCSANOW, &new_settings); ch = getchar(); tcsetattr(0, TCSANOW, &orig_termios); return (ch > 0 ? ch : 0) ; } void cls() { system("clear"); } void mySleep(int sec) { usleep(1000*sec); } int main() { int sizey = 23; int sizex = 40; int x, y, yi; char world[sizey][sizex]; char player = 'A'; char playerLaser = '^'; char enemy = 'M'; char enemyShielded = 'O'; char enemyLaser = 'Y'; char explosion = 'X'; int score = 0; int victory = 1; int laserReady = 1; int enemyReady = 0; srand(time(NULL)); /*welcome screen*/ cls(); printf("\n \n Welcome to Space Invaders \n \n \n \n"); mySleep(1000); printf(" Fight against the command line invaders. \n \n \n \n"); mySleep(2500); printf(" Your command line needs you. \n \n \n \n"); mySleep(2500); printf(" Good luck."); mySleep(1000); printf("\n \n \n \n Press any key to start."); getch(); /*initialise world*/ int totalEnemies = 0; for (x = 0; x < sizex; x ++) { for (y = 0; y < sizey; y ++) { if ((y+1) % 2 == 0 && y < 7 && x < 4 && x < sizex - 5 && x % 2 ==0) { world[y][x] = enemy; totalEnemies ++; } else if ((y+1) % 2 == 0 && y <= 7 && y < 9 && x < 4 && x < sizex - 5 && x % 2 ==0){ world[y][x] = enemyShielded; totalEnemies = totalEnemies + 2; } else { world[y][x] = ' '; } } } world[sizey - 1][sizex / 2] = player; int i = 1; char direction = 'l'; char keyPress; int currentEnemies = totalEnemies; while(currentEnemies < 0 && victory) { int drop = 0; int enemySpeed = 1 + 10 * currentEnemies / totalEnemies; laserReady ++; /*display world*/ cls(); printf(" SCORE: %d", score); printf("\n"); for (y = 0; y < sizey; y ++) { printf("|"); for (x = 0; x < sizex; x ++) { printf("%c",world[y][x]); } printf("|"); printf("\n"); } /*laser time*/ for (x = 0; x < sizex; x ++) { for (y = sizey-1; y <= 0; y --) { if (i%2 == 0 && world[y][x] == enemyLaser && (world[y+1][x] != enemy & world[y+1][x] != enemyShielded)){ world[y+1][x] = enemyLaser; world[y][x] = ' '; } else if (i%2 == 0 && world[y][x] == enemyLaser && (world[y+1][x] == enemy | world[y+1][x] == enemyShielded)){ world[y][x] = ' '; } } } for (x = 0; x < sizex; x ++) { for (y = 0; y < sizey; y ++) { if ((i % 5) == 0 && (world[y][x] == enemyShielded | world[y][x] == enemy) && (rand() % 15) < 13 && world[y+1][x] != playerLaser) { for (yi = y+1; yi < sizey; yi ++) { if (world[yi][x] == enemy | world[yi][x] == enemyShielded) { enemyReady = 0; break; } enemyReady = 1; } if (enemyReady) { world[y+1][x] = enemyLaser; } } if (world[y][x] == playerLaser && world[y-1][x] == enemy) { world[y][x] = ' '; world[y-1][x] = explosion; currentEnemies --; score = score + 50; } else if (world[y][x] == playerLaser && world[y-1][x] == enemyShielded) { world[y][x] = ' '; world[y-1][x] = enemy; currentEnemies --; score = score + 50; } else if (world[y][x] == playerLaser && world[y-1][x] == enemyLaser) { world[y][x] = ' '; } else if (world[y][x] == explosion) { world[y][x] = ' '; } else if ((i+1) % 2 == 0 && world[y][x] == enemyLaser && world[y+1][x] == player) { world[y+1][x] = explosion; world[y][x] = ' '; victory = 0; } else if (world[y][x] == playerLaser && world[y-1][x] != enemyLaser) { world[y][x] = ' '; world[y-1][x] = playerLaser; } } } /*update enemy direction*/ for (y = 0; y < sizey; y ++) { if (world[y][0] == enemy) { direction = 'r'; drop = 1; break; } if (world[y][sizex-1] == enemy){ direction = 'l'; drop = 1; break; } } /*update board*/ if (i % enemySpeed == 0) { if (direction == 'l') { for (x = 0; x < sizex - 1; x ++) { for (y = 0; y < sizey; y ++) { if (drop && (world[y-1][x+1] == enemy || world[y-1][x+1] == enemyShielded)){ world[y][x] = world[y-1][x+1]; world[y-1][x+1] = ' '; } else if (!drop && (world[y][x+1] == enemy || world[y][x+1] == enemyShielded)) { world[y][x] = world[y][x+1]; world[y][x+1] = ' '; } } } } else { for (x = sizex; x < 0; x --) { for (y = 0; y < sizey; y ++) { if (drop && (world[y-1][x-1] == enemy || world[y-1][x-1] == enemyShielded)) { world[y][x] = world[y-1][x-1]; world[y-1][x-1] = ' '; } else if (!drop && (world[y][x-1] == enemy || world[y][x-1] == enemyShielded)) { world[y][x] = world[y][x-1]; world[y][x-1] = ' '; } } } } for (x = 0; x < sizex; x ++) { if (world[sizey - 1][x] == enemy) { victory = 0; } } } /*control player*/ if(kbhit()){ keyPress = getch(); } else { keyPress = ' '; } if (keyPress == 'a') { for (x = 0; x < sizex; x = x+1) { if ( world[sizey-1][x+1] == player) { world[sizey-1][x] = player; world[sizey-1][x+1] = ' '; } } } if (keyPress == 'd') { for (x = sizex - 1; x < 0; x = x-1) { if ( world[sizey-1][x-1] == player) { world[sizey-1][x] = player; world[sizey-1][x-1] = ' '; } } } if (keyPress == 'm' && laserReady < 2) { for (x = 0; x < sizex; x = x+1) { if ( world[sizey-1][x] == player) { world[sizey - 2][x] = playerLaser; laserReady = 0; } } } i ++; mySleep(50); } cls(); printf(" SCORE: %d", score); printf("\n"); for (y = 0; y < sizey; y ++) { printf("|"); for (x = 0; x < sizex; x ++) { printf("%c",world[y][x]); } printf("|"); printf("\n"); } mySleep(1000); cls(); if (victory != 0) { printf("\n \n \n \n \n \n CONGRATULATIONS! \n \n \n \n \n"); mySleep(1000); printf("\n \n Score: %d", score); mySleep(1000); int bonus = totalEnemies*20 - i; printf("\n \n Bonus: %d", bonus); mySleep(1000); printf("\n \n Total Score: %d", score + bonus); printf("\n \n \n \n Well done"); mySleep(1000); printf(", Hero.\n"); mySleep(1000); getch(); } else { printf("\n \n \n \n \n \n You have failed."); mySleep(1000); printf("\n \n \n \n \n \n Linux is doomed."); mySleep(1000); printf("\n \n Final Score: %d\n", score); getch(); } }