ゲームなのだろうか?

 やったーゴリ夫のゲームできたよー。ここまできたないソースコードはそうそうないだろうって感じだけど。
 追記: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(" ");
}