C言語でRPGの製作 1
c言語で簡単なRPGを作成してみたいと思います。
とは言え、画像表示無しの文字だけのRPGになる予定です。
システム
まず今回作成するRPGで作成したい要素を取り上げてみます。
・モンスターとのバトル
・主人公の育成
・アイテム入手・使用
・マップ移動
この4点を基準に大まかなシステムを作成していこうと思います。
マップ作成
マップはよくあるオセロや将棋ゲームと同じ構造で作成しました。
魔王を倒したらゲームクリアとしたいので、ひとまず魔王の場所にたどり着いたら終了するプログラムです。
一度移動した箇所は移動不可にし、アクション性を持たせました。
イベントとして村や宝箱があります。イベント内容は別で作成していきたいと思います。
壁に挟まれるとゲームオーバーです。
初期マップは◉が現在地
⬛︎ 壁 ⬜︎モンスター出現 宝:宝箱 村:村 魔:魔王
という感じで表示しています。
イベントはまだ作成していませんので定型文が表示されるだけです。
移動すると前いた場所は壁になります。
移動出来なくなるとGame over
戦闘の作成はまだなので現在は移動するだけのゲームです。
マップコード
map.h
#ifndef map_h
#define map_h
#include<stdio.h>
//初期位置
#define start m_x = 0;m_y = 0;
//マップ最大値
#define max_x 7
#define max_y 7
//現在地
int m_x;
int m_y;
//イベント -1が返されるとクリア -2が返されるとゲームオーバー
int event;
//map.cのメイン
void map_main(void)
//マップ移動 表示・次ターン移動可能かどうか確認 出力:マップ値
int map_display(void);
//マップ移動
void move_menu(void);
//イベント表示
void event_display(void);
#endif /* map_h */
どうしても書きやすさを意識してしまい、グローバル変数が多くなっているのが反省点ですね。
map.c
#include"map.h"
void map_main(void)
{
//初期位置
m_x = 1;
m_y = 1;
map_display();
//イベント値が-1の場合ゲーム終了(ゲームクリア)
while (event != -1) {
move_menu();
event_display();
//ゲームオーバー時の処理
if(event == -2){
printf("[Game over]");
return;
}
}
}
int map_display(void)
{
//移動不可−1 モンスター出現位置0 宝箱3 村2 魔王城4 現在地1
static int map[7][7] = {{-1,-1,-1,-1,-1,-1,-1},
{-1,0,-1,-1,0,3,-1},
{-1,0,0,0,3,0,-1},
{-1,-1,2,0,0,0,-1},
{-1,0,0,-1,0,0,-1},
{-1,3,2,0,4,0,-1},
{-1,-1,-1,-1,-1,-1,-1}};
//壁であるかどうか
if( map[m_y][m_x] == -1){
return -1;
}
//イベント発生
event = map[m_y][m_x];
//移動
map[m_y][m_x] = 1;
printf("\n");
//マップ表示
for(int i = 0;i < max_y; i++){
for (int f = 0; f < max_x; f++) {
if(map[i][f] == -1)printf("⬛︎");
if(map[i][f] == 0)printf("⬜︎");
if(map[i][f] == 1)printf("◉ ");
if(map[i][f] == 2)printf("村");
if(map[i][f] == 3)printf("宝");
if(map[i][f] == 4)printf("魔");
printf(" ");
}
printf("\n");
}
//通過した場所を移動不可にする
map[m_y][m_x] = -1;
//次ターンに移動するスペースがあるか確認
if(map[m_y][m_x+1] >= 0 ||map[m_y+1][m_x] >= 0 ||map[m_y][m_x-1] >= 0 ||map[m_y-1][m_x] >= 0){
//処理終了
return 0;
}else{
//ゲームオーバー
event = -2;
return -2;
}
}
void move_menu(void)
{
int menu_no;
while (1) {
//値を手に入れる
int x = m_x,y = m_y;
//移動メニュー
printf("\n[移動メニュー]\n 1:← 2:↑ 3:→ 4:↓\n");
scanf("%d",&menu_no);
//移動値
if(menu_no == 1)m_x--;
if(menu_no == 2)m_y--;
if(menu_no == 3)m_x++;
if(menu_no == 4)m_y++;
//移動可能であることの確認
if(m_x >= 0 && x <= max_x&& m_y >= 0 && y <= max_y){
//壁に当たった場合
if(map_display() != -1)return ;
printf("壁です");
//ゲーム続行不可の場合
}else if(event == -2){
return;
}else{}
//移動不可時の処理(移動前の位置に戻す)
m_x = x;
m_y = y;
map_display();
}
}
void event_display(void)
{
switch (event) {
case 0:
printf("モンスターが現れた");
break;
case 2:
printf("村に到着しました");
break;
case 3:
printf("宝箱を手に入れました");
break;
case 4:
printf("魔王が現れた");
event = -1;
default:
break;
}
}
それなりにシンプルなコードがかけたのではないかと思います。
本当はユーザーから入力される値等も意識しなければならないのですがひとまずはマップの完成です。
別でmain.cを作成すれば動かすことができます。
main.c
#include"map.h"
int main()
{
map_main();
}
ある程度システムができたらマップを広げたり、自動生成をしていきたいところ。
RPGは作っていくうちにやりたいことが増えていきますね。
コードも更新しやすいように書くのが大切ですね。
次は戦闘シーンに取りかかっていきたいと思います。