ゲームなのだろうか?
やったーゴリ夫のゲームできたよー。ここまできたないソースコードはそうそうないだろうって感じだけど。
追記:indentで読みやすさは向上したか。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <time.h> #define DEBUG void ending(); void gameover(); typedef struct pt_t { char *name; int hp, mhp; int str, luk; } pt; pt u = { "Gorio", 100, 100, 18, 20 }; pt foe[] = { {"Randy, the Fat-Devil", 100, 100, 24, 10}, {0, 1, 1, 2, 2}, }; void p(char *str) { puts(str); } int rn(int i) { if (i == 0) return 0; return rand() % i; } void mySleep(int ti) { usleep(ti * 1000); } void initgame() { p("Welcome!"); srand(time(0)); int cnt = 10; while (cnt--) { char tmp[1024]; int hp, str, luk; hp = 100 + rn(20) - 9; str = 18 + rn(7) - 3; luk = 19 + rn(6); printf("\n %s HP:%d STR:%d\n (enter y if OK) \n", u.name, hp, str); tmp[0] = getchar(); if (tmp[0] == 'y' || tmp[0] == 'Y') { u.hp = u.mhp = hp; u.str = str; return; } } p("You get out of here."); exit(0); } int attk(pt * atk, pt * def) { int dmg = 1; dmg += rn(atk->str); dmg += rn(atk->str); printf("%s attacks! (%dp)\n", atk->name, dmg); def->hp -= dmg; if (def->hp <= 0) { printf("%s wins!\n\n", atk->name); sleep(1); printf("%s : HP %d/%d.\n", atk->name, atk->hp, atk->mhp); printf("%s : HP %d/%d.\n", def->name, def->hp, def->mhp); if (u.hp > 0) { ending(); exit(0); } else if (def->hp < 0) { gameover(); exit(0); } } sleep(1); return 0; } void batoru() { int i; pt f = foe[0]; for (i = 0; i < 20; i++) { int j, k; const int num = 2; pt *ps[2] = { &u, &f }; pt *ptb[num]; int sen[num] = { rn(ps[0]->luk), rn(ps[1]->luk) }; int shk[num]; int donelist[num]; #ifdef DEBUG sleep(3); printf("\ninitiative\n%s:%d %s:%d\n", ps[0]->name, sen[0], ps[1]->name, sen[1]); sleep(3); #endif for (k = 0; k < num; k++) { shk[k] = k; donelist[k] = 0; } for (k = 0; k < num; k++) { int r = rn(num); int tmp = shk[k]; shk[k] = shk[r]; shk[r] = tmp; } for (k = 0; k < num; k++) { int grtt = -1, igr = -1; for (j = 0; j < num; j++) { if (donelist[j]) continue; if (sen[j] > grtt || (sen[j] == grtt && shk[j] > shk[k])) { igr = j; grtt = sen[j]; } } ptb[k] = ps[igr]; donelist[igr] = 1; } attk(ptb[0], ptb[1]); mySleep(300); attk(ptb[1], ptb[0]); mySleep(300); sleep(1); p(" "); printf("%s : HP %d/%d.\n", ps[0]->name, ps[0]->hp, ps[0]->mhp); printf("%s : HP %d/%d.\n", ps[1]->name, ps[1]->hp, ps[1]->mhp); sleep(1); } p(" "); } int main() { // p("Hello world."); initgame(); batoru(); return 0; } void ending() { char *cong = "CONGRATULATIONS!"; char ch = cong[0]; int i = 0; p(" "); while (ch != 0) { printf("%c ", ch); fflush(stdout); mySleep(369); i++; ch = cong[i]; } p(" "); } void gameover() { char *cong = "GAME OVER"; char ch = cong[0]; int i = 0; p(" "); while (ch != 0) { printf("%c ", ch); fflush(stdout); mySleep(369); i++; ch = cong[i]; } p(" "); }