Last Update: Jan.10,2001

C Source Library

「LSI C-86 Ver.3.30c 試食版」、「Borland C++ 5.5」でコンパイル出来ます。

■ 数並べパズルゲーム

/*
 *  数並べパズルゲーム
 *  (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;
}