■ 数並べパズルゲーム
/*
* 数並べパズルゲーム
* (Sliding Blocks)
* 2000/04/22 Ver.2
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#ifndef LSI_C /* Borland C++ 5.5 */
#include <conio.h> /* getch */
#endif
typedef unsigned char BYTE;
#define BN 5 /* 一辺のマスの数 */
#define LT 0
#define UP 1
#define RT 2
#define DN 3
BYTE block[BN*BN];
BYTE blank = BN*BN-1;
/* 盤面を描く */
void print_block(void)
{
int i, j;
printf(" ***************************************** \n");
printf(" * %2uパズル Copyright (c) 2000 AOK. * \n", BN*BN-1);
printf(" ***************************************** \n\n");
printf("┌─");
for (j = 0; j < BN-1; j++) printf("┬─");
printf("┐\n");
for (i = 0; i < BN*BN; i++) {
if (i != blank)
printf("│%2u", block[i]);
else
printf("│ ");
if (i%BN == BN-1) {
printf("│\n");
if (i/BN != BN-1) {
printf("├─");
for (j = 0; j < BN-1; j++) printf("┼─");
printf("┤\n");
}
}
}
printf("└─");
for (j = 0; j < BN-1; j++) printf("┴─");
printf("┘\n");
printf("\n([A:←][W:↑][S:→][Z:↓][R:リスタート][Q:終了])\n");
printf("コマンドを入力してください.>");
}
/* 値の入れ替え */
void swap(BYTE n)
{
block[blank] = block[n];
block[n] = BN*BN;
blank = n;
}
/* 方向によって処理を決める */
void exchange(int dir)
{
BYTE n;
switch (dir) {
case LT:
if (blank % BN != BN-1)
{ n = blank + 1; swap(n); }
break;
case UP:
if (blank / BN != BN-1)
{ n = blank + BN; swap(n); }
break;
case RT:
if (blank % BN != 0)
{ n = blank - 1; swap(n); }
break;
case DN:
if (blank / BN != 0)
{ n = blank - BN; swap(n); }
break;
default:
break;
}
}
/* 問題を作る */
void shuffle(void)
{
int i;
for (i = 0; i < 10000; i++)
exchange(rand() % BN);
}
/* コマンドを受け取る */
int get_command(void)
{
BYTE ch;
ch = toupper(getch());
switch (ch) {
case 'Q':
putchar('\n'); return 0;
case 'A':
exchange(LT); break;
case 'W':
exchange(UP); break;
case 'S':
exchange(RT); break;
case 'Z':
exchange(DN); break;
case 'R':
shuffle(); break;
default:
break;
}
putchar('\n');
return 1;
}
/* メインルーチン */
int main()
{
int i;
for (i = 0; i <= BN*BN-1; i++)
block[i] = i+1;
/* 乱数初期化 */
srand((unsigned int)time(NULL));
shuffle();
/* 盤面を描く */
do {
print_block();
} while (get_command() != 0);
return 0;
}