ダンジョンの表示
xRpg0.c
/*
xRpg0.c : 2次元配列でダンジョンのマップを表現する
Created by dianxnao.com on 2018/10/09.
Copyright 2018 Shuichi Takeda, All rights reserved.
*/
/*
11111111
10000001
10000001
10000001
10000001
10000001
10000001
11111111
↓
■■■■■■■■
■ ■
■ ■
■ ■
■ ■
■ ■
■ ■
■■■■■■■■
*/
#include <stdio.h>
#define SIZE 8 /* マップサイズ */
int main(void)
{
int map[SIZE][SIZE] = { {1, 1, 1, 1, 1, 1, 1, 1},
{1, 0, 0, 0, 1, 1, 0, 1},
{1, 1, 1, 0, 1, 1, 0, 1},
{1, 0, 0, 0, 1, 1, 0, 1},
{1, 0, 1, 0, 2, 0, 0, 1},
{1, 0, 1, 0, 1, 1, 0, 1},
{1, 3, 1, 0, 0, 0, 0, 1},
{1, 1, 1, 1, 1, 1, 1, 1},
};
int i, j;
for (i=0; i<SIZE; i++){
for (j=0; j<SIZE; j++){
switch(map[i][j]){
case 0:
printf(" ");
break;
case 1:
printf("■");
break;
case 2:
printf("人");
break;
case 3:
printf("★");
}
}
printf("\n");
}
return 0;
}
実行イメージ
ダンジョン内を移動する
xRpg1.c
/*
xRpg1.c : マップ内を移動する
Created by dianxnao.com on 2018/10/09.
Copyright 2018 Shuichi Takeda, All rights reserved.
*/
#include <stdio.h>
#include <stdlib.h>
#define SIZE 8 /* マップサイズ */
/* --- キャラクタ表示 --- */
#define NOBOX 0
#define BOX 1
#define HERO 2
#define TREASURE 3
/* --- キー入力 --- */
#define UP 'w'
#define DOWN 's'
#define LEFT 'a'
#define RIGHT 'd'
#define EXIT 'e'
int main(void)
{
int map[SIZE][SIZE] = { {1, 1, 1, 1, 1, 1, 1, 1},
{1, 0, 0, 0, 1, 1, 0, 1},
{1, 1, 1, 0, 1, 1, 0, 1},
{1, 0, 0, 0, 1, 1, 0, 1},
{1, 0, 1, 0, 2, 0, 0, 1},
{1, 0, 1, 0, 1, 1, 0, 1},
{1, 3, 1, 0, 0, 0, 0, 1},
{1, 1, 1, 1, 1, 1, 1, 1},
};
int i, j;
char ido[256];
int x, y, saveX, saveY;
x = 4;
y = 4;
while(1){
system("cls");
for (i=0; i<SIZE; i++){
for (j=0; j<SIZE; j++){
switch(map[i][j]){
case NOBOX:
printf(" ");
break;
case BOX:
printf("■");
break;
case HERO:
printf("人");
break;
case TREASURE:
printf("★");
}
}
printf("\n");
}
printf("どちらに移動しますか? w:上 s:下 a:左 d:右 e:Exit> ");
scanf("%s", ido);
saveX = x;
saveY = y;
if(ido[0] == UP){
y--;
}
else if(ido[0] == DOWN){
y++;
}
else if(ido[0] == LEFT){
x--;
}
else if(ido[0] == RIGHT){
x++;
}
else if(ido[0] == EXIT){
break;
}
map[saveY][saveX] = 0; /* 移動前のデータを消去 */
map[y][x] = 2; /* 移動後のデータを設定 */
}
return 0;
}
/*
xRpg1.cの説明
--------------------
定数設定(10~23行)
マップ設定(27~35行)
主人公の初期位置設定(39~40行)
マップ表示
画面クリア(43行)
キャラクタ描画(44~59行)
移動処理
キー入力(62~63行)
移動位置設定(68~82行)
移動前のデータ消去(84行)
移動後のデータ設定(85行)
マップ表示に戻る(42行)
--------------------*/
実行イメージ(xRpg2.cと実行イメージは共通です)
まとまった処理を関数化する
xRpg2.c
/*
xRpg2.c : まとまった処理を関数化する
Created by dianxnao.com on 2018/10/09.
Copyright 2018 Shuichi Takeda, All rights reserved.
*/
#include <stdio.h>
#include <stdlib.h>
#define SIZE 8 /* マップサイズ */
/* --- キャラクタ表示 --- */
#define NOBOX 0
#define BOX 1
#define HERO 2
#define TREASURE 3
/* --- キー入力 --- */
#define UP 'w'
#define DOWN 's'
#define LEFT 'a'
#define RIGHT 'd'
#define EXIT 'e'
int map[SIZE][SIZE] = { {1, 1, 1, 1, 1, 1, 1, 1},
{1, 0, 0, 0, 1, 1, 0, 1},
{1, 1, 1, 0, 1, 1, 0, 1},
{1, 0, 0, 0, 1, 1, 0, 1},
{1, 0, 1, 0, 2, 0, 0, 1},
{1, 0, 1, 0, 1, 1, 0, 1},
{1, 3, 1, 0, 0, 0, 0, 1},
{1, 1, 1, 1, 1, 1, 1, 1},
};
int x, y, saveX, saveY;
void init(void); /* 初期化 */
void showMap(void); /* マップ表示 */
int moveHero(void); /* 主人公の移動 */
/* ----- RPGメイン ----- */
int main(void)
{
init();
do{
system("cls");
showMap();
} while ( moveHero() );
return 0;
}
/* ----- 初期化 ----- */
void init(void)
{
x = 4;
y = 4;
}
/* ----- マップ表示 ----- */
void showMap(void)
{
int i, j;
for (i=0; i<SIZE; i++){
for (j=0; j<SIZE; j++){
switch(map[i][j]){
case NOBOX:
printf(" ");
break;
case BOX:
printf("■");
break;
case HERO:
printf("人");
break;
case TREASURE:
printf("★");
}
}
printf("\n");
}
}
/* ----- 主人公の移動 ----- */
int moveHero(void)
{
char ido[256];
printf("どちらに移動しますか? w:上 s:下 a:左 d:右 e:Exit> ");
scanf("%s", ido);
saveX = x;
saveY = y;
if(ido[0] == UP){
y--;
}
else if(ido[0] == DOWN){
y++;
}
else if(ido[0] == LEFT){
x--;
}
else if(ido[0] == RIGHT){
x++;
}
else if(ido[0] == EXIT){
return 0;
}
map[saveY][saveX] = 0; /* 移動前のデータを消去 */
map[y][x] = 2; /* 移動後のデータを設定 */
return 1;
}
コメント