20200209自習課題

C言語

ダンジョンの表示

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;
}

コメント