アニメ『競女!!!!!!!!』
競輪みたいに、レースでギャンブルする競技なのでしょう。女子たちがプールで尻相撲します。プールに落ちたりしたら負け。ギャグアニメです。漫画を見ていないので、この設定でどこまで面白くできるのか気になるところです。
この競技は、このような浮きの上で行われます。細い浮きで、挟み撃ちになると一貫の終わりです。
ということで、競女ゲームを作りたくなりました。今回はコンソール上に文字でマップを作って、スクロールするプログラムから作ってみます。
マップはこれです。
char *map[] ={ "|-------+ +---------+ +-------+ +-------+ |", "| | | | | | | | |", "| | | | | | | | |", "| +-+ +-+ +-+ +-+ +-+ +-+ +-+ |", "| | | | | | | | |", "| POOL | | POOL | | POOL | | POOL | |", "| | | | | | | | |", "| | | | | | | | |", "| +-+ +-+ +-+ +-+ +-+ +-+ +-+ |", "| | | | | | | | |", "| | | | | | | | |", "|-------+ +---------+ +-------+ +-------+ |", "| Enemy |", "|-------+ +---------+ +-------+ +-------+ |", "| | | | | | | | |", "| | | | | | | | |", "| +-+ +-+ +-+ +-+ +-+ +-+ +-+ |", "| | | | | | | | |", "| POOL | | POOL | | POOL | | POOL | |", "| | | | | | | | |", "| | | | | | | | |", "| +-+ +-+ +-+ +-+ +-+ +-+ +-+ |", "| | | | | | | | |", "| | | | | | | | |", "|-------+ +---------+ +-------+ +-------+ |", "| Enemy Enemy |", "|-------+ +---------+ +-------+ +-------+ |", "| | | | | | | | |", "| | | | | | | | |", "| +-+ +-+ +-+ +-+ +-+ +-+ +-+ |", "| | | | | | | | |", "| POOL | | POOL | | POOL | | POOL | |", "| | | | | | | | |", "| | | | | | | | |", "| +-+ +-+ +-+ +-+ +-+ +-+ +-+ |", "| | | | | | | | |", "| | | | | | | | |", "|-------+ +---------+ +-------+ +-------+ |", };
C言語+ncursesを使います。
main関数でキー入力をします。方向操作は、Vimmerなのでjkhlとします。
1 int main() 2 { 3 int x=7,y=5; 4 char ch = ' '; 5 6 initscr(); 7 cbreak(); 8 curs_set(0); 9 update_map(x,y); 10 while(1){ 11 ch = getch(); 12 switch(ch){ 13 case 'j':y = y + 1;break; 14 case 'k':y = y - 1;break; 15 case 'h':x = x - 1;break; 16 case 'l':x = x + 1;break; 17 } 18 clrtoeol(); 19 update_map(x,y); 20 21 refresh(); 22 } 23 24 endwin(); 25 return 0; 26 }
表示の更新は、バッファにstrncpyでmapから文字列をコピーして、最後にNULL文字を格納して、文字列とした上で、
ncursesのmvaddrstrで行っています。WIDTH、HEIGHTは画面に表示するMAPのサイズでWIDTH=15、HEIGHT=7としています。
1 void update_map(int x, int y) 2 { 3 int i; 4 char buf_map[WIDTH+1]; 5 6 for(i=0; i<HEIGHT; i++){ 7 strncpy(buf_map, map[y+i] + (x-WIDTH/2),WIDTH); 8 buf_map[WIDTH] = 0; 9 mvaddstr(i, 0, buf_map); 10 } 11 }
jkhlで上下移動。まだ範囲チェックも入っていないので、マップの端に行くと、segmentation errorとなります。コンパイル、実行は以下の通り。
~$ https://github.com/takkete/scrap.git ~$ cd scrap ~$ gcc -lncurses keijo.c ~$ ./a.out
コメント