Aggressive Style 5

Aggressive Style 5

昨今はコミケ関係を中心に書いています。同人やニコニコ動画方面で活躍される方の相互リンクをお待ちしています。

とりあえずRPGの戦闘システムをC言語で作ってみた

久しぶりにC言語を触わり、RPGの戦闘システムのプログラムを作ってみた。どのような戦闘システムというと、

  1. 仕様:Visual Studio .net 2008にてコンパイル及び作成(OS:Windows XP)
  2. 味方と敵で1対1の戦い。
  3.  
  4. 味方は「攻撃」と「防御」しかできない。(逃げることもできない)
  5. 敵は「攻撃」のみ
  6. 素早さの概念が無く、味方がかならず先制攻撃

と如何にもお粗末なプログラムだ。

感想:RPGの戦闘の根本は引き算




こうやってみるとRPGの戦闘の根本って引き算なんだなあ。しかし引き算のプログラムだけでも100行近くになるんだねえ。関数をもっと追加すればmain関数に書く量を減らせたかも。あと、とりあえず組んでみましたと偶然の産物であることは言うまでもない。どういう流れで戦闘が行われたか(問題の切り分け)をきちんと考えてないが、まずは作ってみる事も必要か。

創作物は「形=実力」

一応どうであれ形になった。創作物は何でも形にしてなんぼで「形=そいつの実力」だからなあ。しかし簡単なものだと、例え前に他人が思いついた物でも「ここはこう変えてみよう」とか「これが欲しい!」と言う物が見えて来て面白い。例えば味方と敵の攻撃力と防御力を変えるとどうなるか?3ターン毎にダメージを受けるとか。プログラムがシンプルな分試しやすい。あと、Excelで「この敵は何ターンで死ぬように設計すべきか?」を考えるときに、Excelで確認するよりはゲームをやってる感があるので色々考えやすいかも。


各変数関数の仕様

  1. 構造体character:キャラクターのHP,攻撃力,防御力をひとまとめにしたもの
  2. 関数strdef:ダメージの計算部分。単純に味方の攻撃力と相手の防御力の差をダメージとして算出
  3. 関数attack:キャラの状態に応じたダメージを計算している部分。
  4. 関数isdead:キャラが死んだかどうかの判定部分。
  5. 関数set_parameter:キャラクターのパラメーター設定部分。
  6. 関数main:戦闘の流れを書いた部分。

ソースコード


#include
typedef struct{
int hp;//体力
int str;//攻撃力
int def;//防御力
int state;//コマンド状態
}character;

//通常攻撃時の計算
int strdef(int player_str,int enemy_def){
if(player_str < enemy_def){
return 0;
}else{
return(player_str - enemy_def);
}
}
void attack(character player,character (&enemy)){
//通常状態
if(enemy.state == 0){
enemy.hp -= strdef(player.str,enemy.def);
}else{
//防御状態
enemy.hp -= strdef(player.str,(enemy.def*2));
}
}
//死亡かどうかの判定
int isdead(int hp){
if(hp < 1){
return 1;
}
else{
return 0;
}
}
//パラメーターの設定
void set_parameter(character (¶m),int hp,int str,int def,int state){
param.hp = hp;
param.str = str;
param.def = def;
param.state = 0;
}
int main(){
character player;
character enemy;
int command = 0;

//初期ステータスの入力
set_parameter(player,100,40,15,0);
set_parameter(enemy,200,15,10,0);

//一応味方先制
while(isdead(player.hp) == 0){
printf("現在の味方のHP:%d,現在の敵のHP:%d\n",player.hp,enemy.hp);
printf("攻撃or防御?");
scanf("%d",&command);

if(command % 2 == 0){
player.state = 0;
enemy.state = 0;
//攻撃
attack(player,enemy);
attack(enemy,player);

//死亡判定(味方)
if(isdead(player.hp) == 1){
printf("you are dead");
break;
}

//死亡判定(味方)
if(isdead(enemy.hp) == 1){
printf("you win");
break;
}

}
//防御
if(command % 2 == 1){
player.state = 1;
enemy.state = 0;
//攻撃
attack(enemy,player);

//死亡判定(味方)
if(isdead(player.hp) == 1){
printf("you are dead");
break;
}

//死亡判定(味方)
if(isdead(enemy.hp) == 1){
printf("you win");
break;
}

}
}
return 1;
}

おまけ動画




SEのみならず、人のプログラムを改良加えるときによく起こる話を歌った歌。結構面白い!