弾幕ゲーム『hjkl六面シューティング』

これはさすがにコンテストに出したりはしません。

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>

#define ESCAPE	'\033'

#define randint0(n) (rand()%(n))

void ret() {printf("\n");}
void p(char *str) {printf("%s", str);}

void waitspace()
{
	while(1)
	{
		int ch = getch();
		if (ch == ' ' || ch == '\n' || ch == ESCAPE)
			break;
	}
}
void danmaku(int stg, char *boss_str)
{
	int i;
	int yans, ans = randint0(4);
	int ax = randint0(70)+1, ay = randint0(14)+1;
	char ansch[5] = "hjkl";
	char buf[1024];
	p("\n");
	printf("%d面だ! %s\n", stg, boss_str);
	p("\n");
	for(i=0;i<16;i++)
	{
		int j;
		for(j=0;j<74;j++)
		{
			if (ax == j && ay == i)
				buf[j] = ansch[ans];
			else if (randint0(11) == 2)
				buf[j] = '*';
			else if (randint0(13) == 1)
				buf[j] = ':';
			else
				buf[j] = ' ';
		}
		buf[j] = '\0';
		p(buf);
		ret();
	}
	p("                ○\n");
	p("               /■\\n");
	p("                ||\n");
	p("H : 体を捻って避ける       J : ジャンプして避ける\n");
	p("K : かなり頑張って避ける   L : レモンのように避ける\n");
	yans = -1;
	while(1)
	{
		int ch = getch();
		switch(ch)
		{
		case 'h': case 'H':
			yans = 0;
			break;
		case 'j': case 'J':
			yans = 1;
			break;
		case 'k': case 'K':
			yans = 2;
			break;
		case 'l': case 'L':
			yans = 3;
			break;
		}
		if (yans != -1) break;
	}

	if (yans == ans)
	{
		p("あなたは弾を避けてステージを進み、ボスを倒した!\n");
		waitspace();
	}
	else
	{
		p("*** ど☆かーん ***\n");
		waitspace();
		p("あなたは避けるのを失敗して負けた\n");
		waitspace();
		p("GAME OVER\n");
		waitspace();
		exit(0);
	}
}

void main()
{
	int i;
	char *stagestr[6] = {"極太レーザーのボスがあなたを襲う!",
		"回転するボスがあなたを襲う!",
		"哲学的なザコがあなたを襲う!",
		"臭うボスが比較的あなたを襲う!",
		"名状しがたい宇宙的な弾幕があなたを襲う!",
		"最後のボスがあなたを襲う!",
	};
	int starttime, endtime;
	srand(time(0));
	starttime = time(0);
	for(i=0;i<6;i++)
	{
		danmaku(i+1, stagestr[i]);
	}
	printf("あなたは%d面をクリアした!\n", i);
	endtime = time(0);
	printf("ただいまのスコア %d\n", endtime-starttime);
	waitspace();
	printf("おめでとうございます!\n");
	waitspace();
}