学生向けプログラミング入門 | 無料

学生向けにプログラミングを無料で解説。Java、C++、Ruby、PHP、データベース、Ruby on Rails, Python, Django

C++ | 17 | switch

↓↓クリックして頂けると励みになります。



16 | while】 << 【ホーム】 >> 【18 | 分割コンパイル


switch文を使用したプログラム
switch文を使用したプログラム



C++のswitch文は、複数の選択肢の中から一致するものを見つけて、対応するブロックを実行する制御構造です。
switch文は、条件が整数値や文字型である場合に特に便利です。

switch文は、式の値を評価し、一致するcaseラベルを見つけます。
一致するラベルが見つかった場合、そのラベルに対応する処理が実行されます。
その後、break文が見つかるか、switch文の終わりまで処理が続きます。
break文が見つかると、switch文から抜け出します。

defaultキーワードは、switch文の最後に置かれることが一般的です。
defaultラベルは、どのcaseラベルにも一致しない場合に実行される処理を指定します。

Visual Studio Codeで以下のcppファイルを作成して下さい。


新規作成 【SwitchTest1.cpp】

#include<iostream>

int GetInput(int input);

int main() {

	int input,cont;

	while(1) {

		std::cout << "適当な数字を入力してください。0ならば終わり ==> ";

		std::cin >> input;

		cont = GetInput(input);

		if(cont == 0) {
		    std::cin.clear();
		    std::cin.ignore();
			break;
		}

		std::cout << "結果 = " << cont << std::endl;
        std::cin.clear();
		std::cin.ignore();
	}
}

int GetInput(int input) {

	int result;

	switch(input) {

		case 1:	result = 1; break;
		case 2:	result = 2; break;
		case 3: 
		case 4:	result = 3; break;
		case 0:	result = 0; break;
		default:	result = 4; break;

	}

	return result;
}



このプログラムではswitch文といわれる構文を使用しています。

switch ( 整数値をとる式 ) {

    case 定数値: 実行文; break;
     case 定数値: 実行文; break;
         ・
         ・
         ・
    default: 実行文; break;
}



switch文は整数値を持つ式にしか使えない点に注意してください。
C言語では文字も整数値を持つので文字にも使えます。
caseの後の値は定数でなくてはなりません。


defaultはif文のelseにあたりますが記述しなくても動きます。
caseのどれにもあたらなければdefaultが実行されます。
if文の一部はswitch文でスリムに書き換えることができます。


もし文字を扱うときは定数値をシングルコーテーション(’’)で囲むことを忘れないようにしてください。


サンプルプログラムのように、

case 3:
case 4: result = 3; break;

とすれば、( input == 3 || input == 4 )と同じ意味になります。
break文で一つのcase文を区切っていると考えてください。


while(1){}は無限ループになります。
この場合break文がないとプログラムが終了しませんので使用するときは注意してください。


サンプルプログラムを実行してみましょう。

~/Desktop/Programming/CPP $ cd "/Users/**/Desktop/Programming/CPP/" && g++ SwitchTest1.cpp -o SwitchTest1 && "/Users/**/Desktop/Programming/CPP/"SwitchTest1

適当な数字を入力してください。0ならば終わり ==> 2
結果 = 2
適当な数字を入力してください。0ならば終わり ==> 5
結果 = 4
適当な数字を入力してください。0ならば終わり ==> 4
結果 = 3
適当な数字を入力してください。0ならば終わり ==> 3
結果 = 3
適当な数字を入力してください。0ならば終わり ==> 1
結果 = 1
適当な数字を入力してください。0ならば終わり ==> 6
結果 = 4
適当な数字を入力してください。0ならば終わり ==> 0



Visual Studio Codeで以下のcppファイルを作成して下さい。


新規作成 【Game2.cpp】

#include <iostream>
#include <stdlib.h>

int yesno( );
void current_point( );
void enemy_create( );
void hero_create( );
int escape( );
void calc_parameter( int suit, int strong );
void hero_die( );
void show_status( );
void map_create( );
void get_drug(int exist, int strong);
int pos_compare(int a_x, int a_y, int b_x, int b_y);
void walk_around( char move );
void use_drug( );
void get_enemyitem( );
void fight( );
void command( );

/* enemy */
int enemy_x;
int enemy_y;
int enemy_life;
int enemy_offence;
int enemy_defence;
int enemy_item_suit;
int enemy_item_strong;


/* map */
int map_wide_x;
int map_wide_y;
int map_ent_x;
int map_ent_y;
int map_floor=0;
int map_item_exist;
int map_item_strong;
int map_item_x;
int map_item_y;

/* hero */
int hero_point;
int hero_x;
int hero_y;
int hero_life;
int hero_life_upper;
int hero_offence;
int hero_defence;
int hero_drug;
int hero_sword;
int hero_buckler;
int hero_armer;

int main() {

	int input;

        hero_create();
        map_create();
        current_point();

        std::cout << "Input senario Number => ";
		std::cin >> input;
		std::cin.clear();
		std::cin.ignore();

        srand(input);

        while(true) {

                if(enemy_life <= 0) {

                        enemy_create( );
                }

				std::cout << "現在位置 (" << hero_x << "," << hero_y << "):地下 " << map_floor << "階" << std::endl << std::endl;

                command();

                if( pos_compare(map_item_x,map_item_y,hero_x,hero_y)){

                        get_drug(map_item_exist, map_item_strong);
                        map_item_exist=0;
                }

                if( pos_compare(map_ent_x,map_ent_y, hero_x,hero_y)) {

					std::cout << "階段があった。下に降りますか? ";

                        switch(yesno()) {

                                case 1: map_create();
                                        enemy_create();
                                        current_point();
										std::cout << std::endl << std::endl << "地下 "<< map_floor << "階に降りた。" << std::endl << std::endl;
                                        break;

			}

                }

                if (pos_compare(hero_x,hero_y, enemy_x,enemy_y)) {

                        int point=hero_point;
                        fight();

                        if(point < hero_point) {

                                enemy_create();
                        }
                }
        }

}

void map_create( ) {

	map_floor++;
	map_wide_x = rand()%( 2 + map_floor) + 10;
	map_wide_y = rand()%( 2 + map_floor) + 10;
	map_ent_x = rand()%map_wide_x;
	map_ent_y = rand()%map_wide_y;
	map_item_exist=1;
	map_item_strong= rand()%( 10+10*map_floor) + 30;
	map_item_x=rand()%map_wide_x;
	map_item_y=rand()%map_wide_y;
	return;
}

void show_status( ) {

	std::cout << std::endl << "現在の状況:" << std::endl;
	std::cout << "体力: " << hero_life << "/" << hero_life_upper << "\t攻撃力:" << hero_offence << "\t守備力:" << hero_defence << std::endl;

	std::cout << "\t経験値:" << hero_point << std::endl;
	std::cout << std::endl;
	std::cout << "持ち物のレベル" << std::endl;
	std::cout << "剣:" << hero_sword << "\t盾:" << hero_buckler << "\t鎧:" << hero_armer << std::endl << std::endl;

	std::cout << "薬の回復力:" << hero_drug << std::endl << std::endl << std::endl;
	return;
}

void hero_die( ) {

	std::cout << "Hero is died at floor " << map_floor << "." << std::endl;
	std::cout << std::endl;
	std::cout << "status" << std::endl;
	std::cout << "hero level " << hero_point/10 << std::endl;
	std::cout << std::endl;
	std::cout << "Game Over" << std::endl;
	exit(0);
}

void calc_parameter( int suit, int strong ) {

	switch(suit) {

                case 1: hero_offence = hero_offence - hero_sword + strong;
                        hero_sword = strong; break;

                case 2: hero_defence = hero_defence - hero_buckler + strong;
                        hero_buckler = strong; break;

                case 3: hero_defence = hero_defence - hero_armer + strong;
                        hero_armer = strong; break;
        }

        return;

}

void use_drug( ) {

	if(hero_drug > 0) {

		hero_life += hero_drug;

		if(hero_life_upper < hero_life) {

			hero_life = hero_life_upper;
		}

		hero_drug=0;
		std::cout << std::endl << "\t薬を使った。\b" << std::endl << std::endl;
		show_status();
	}

	else {

		std::cout << std::endl << "\t薬は今持ってない。" << std::endl << std::endl;
	}
}

void get_enemyitem( ) {

	if ( enemy_item_suit!=0 ) {

                show_status();

				std::cout << "\t敵はアイテムを持っていた。" << std::endl;

                switch(enemy_item_suit) {

                        case 1: std::cout << "剣:level " <<enemy_item_strong << std::endl;
                                break;

                        case 2: std::cout << "盾:level " <<enemy_item_strong << std::endl;
                                break;

                        case 3: std::cout << "鎧:level " << enemy_item_strong ;
                                break;
                }

				std::cout << "装備するか?";

                if(yesno()) {

					std::cout << "\tヒーローの状態が変わった。\b" << std::endl<< std::endl;
                        calc_parameter(enemy_item_suit, enemy_item_strong);
                        show_status();
                }

                else {

					std::cout << "\tアイテムを捨てた!" << std::endl << std::endl;
                }
        }
        else {

			std::cout << "\t敵はアイテムを持っていなかった。" << std::endl << std::endl;
        }
        return;

}

int escape() {

	int x, y;

	x = rand()%10;
	y = rand()%10;

	if( x < y ) {

		return !0;
	}

	else {

		return 0;
	}
}

void fight() {

	int dum;

        while(true) {
                show_status( );
				std::cout <<"敵と戦いますか?";

                if ( yesno()==0 && escape() == 1){
					std::cout << "\t敵から逃げました。" << std::endl << std::endl;
                        break;
                }
                else {
					std::cout << "\t敵と戦います。" << std::endl << std::endl;
                }
				std::cout << "Heroの攻撃:";
                dum = (hero_offence*(rand()%10)) / (enemy_defence+1);
                enemy_life -= dum;
				std::cout << "敵に " << dum << "のダメージ" << std::endl << std::endl;

                if(enemy_life -= dum){
					std::cout << "\t敵を倒した!\b" << std::endl << std::endl;
                        hero_point ++;
                        hero_life_upper+=10;
						std::cout << "\tレベルが上がった。\b" << std::endl << std::endl;
                        get_enemyitem( );
                        break;
                }
				std::cout << "敵の攻撃:";
                dum = (enemy_offence*(rand()%10)) / (hero_defence+1);
                hero_life -= dum;
				std::cout << dum << "のダメージを受けた!" << std::endl << std::endl;

		if (hero_life <=0) {
                        hero_die();
                }
        }
        return;

}

void hero_create() {

	hero_point = 0;
	hero_life_upper = 100 + rand()%10;
	hero_life = hero_life_upper;
	hero_x = 0;
	hero_y = 0;
	hero_offence = rand()%5 + 5;
	hero_defence = rand()%5 + 5;

	hero_drug = 0;

	hero_sword = rand()%3 +1;
	hero_buckler=rand()%3;
	hero_armer = rand()%2 +1;
	return;
}
 
void enemy_create() {

	int i;
        enemy_x = rand() % map_wide_x;
        enemy_y = rand() % map_wide_y;
        enemy_life = rand() % 100 + map_floor*50;
        enemy_offence=rand() % 10 + map_floor;
        enemy_defence=rand() % (map_floor+2);

        if ( rand() % 2 == 1 ) {
                i=rand()%3+1;
                enemy_item_suit=i;

                switch(i) {
                        case 1: enemy_item_strong = rand()%(10 + map_floor);
                                break;
                        case 2: enemy_item_strong = rand() % (5 +map_floor);
                                break;

                        default: enemy_item_strong = rand() % (7 +map_floor);
                                 break;
                }
        }
        else {
                enemy_item_suit = 0;
                enemy_item_strong = 0;
        }
        return;

}

void command() {
	char input;
	std::cout << "Command mode" << std::endl;
	std::cout << "         up:   k" << std::endl;
	std::cout << "left:h  status:s          right:l" << std::endl;
	std::cout << "          down: j" << std::endl << std::endl;
	std::cout << "use drug:d         Quit:q" << std::endl;
	for(;;) {
		std::cout << std::endl << "comand input => ";
		std::cin >> input;

		if(!std::cin) {
			std::cout << "Error:";
            std::cin.clear();
		    std::cin.ignore();
		}
		else {
			if (input=='d') {
				use_drug();
                std::cin.clear();
		        std::cin.ignore();
				break;
			}
			else if (input == 's' ) {
				show_status();
                std::cin.clear();
		        std::cin.ignore();
				break;
			}
			else if (input=='j' || input=='k' || input=='l' || input=='h') {
				walk_around(input);
                std::cin.clear();
		        std::cin.ignore();
				break;
			}
			else if(input=='q') {
                std::cin.clear();
		        std::cin.ignore();
				exit(0);
			}
		}
	}
	return;
}

/* move  lower j:  left l:  right h:  upper k */
void walk_around( char move ) {
	if(move=='l') {
		if( hero_x == map_wide_x) {
			std::cout << "その方向には歩けません!" << std::endl;
			return;
		}
		hero_x++;
	}
	else if(move=='k') {
		if(hero_y == map_wide_y) {
			std::cout << "その方向には歩けません!" << std::endl;
			return;
		}
		hero_y++;
	}
	else if (move=='h'){
		if(hero_x == 0) {
			std::cout << "その方向には歩けません!" << std::endl;
			return;
		}
		hero_x--;
	}
	else if (move=='j') {
		if(hero_y == 0) {
			std::cout << "その方向には歩けません!" << std::endl;
			return;
		}
		hero_y--;
	}
	return;
}

int pos_compare(int a_x, int a_y, int b_x, int b_y) {

	if ( a_x == b_x && a_y == b_y ) {

		return !0;
	}
	else {

		return 0;
	}
}

void get_drug(int exist, int strong) {

	if(exist == 1) {

		std::cout << std::endl;
		std::cout << "\t薬(" << strong << ")を拾った!\b" << std::endl << std::endl;
		hero_drug+=strong;
	}
	return;
}

void current_point() {

	hero_x = rand()%map_wide_x;
	hero_y = rand()%map_wide_y;
	return;
}

int yesno() {

	char input;

    while(true){
        std::cout << "yes or no (y/n) => ";
        std::cin >> input;

        if(!std::cin) {
            std::cout << "Error:" << std::endl << std::endl;
            std::cin.clear();
            std::cin.ignore();
        }
        else {
            switch(input) {
                case 'y':
                case 'Y': return !0;
                    std::cin.clear();
                    std::cin.ignore();
                    break;
                case 'n':
                case 'N': return 0;
                    std::cin.clear();
                    std::cin.ignore();
                    break;
            }
        }
    }

}



前のセクションで作成したダンジョンゲーム「Game1.cpp」をwhile文とswitch文を使って書き換えたプログラムです。
for文はwhile文に、if文はswitch文になっています。


書き換えた関数は次の関数です。

  • int main();
  • void calc_parameter( int suit, int strong )
  • void get_enemyitem()
  • void fight()
  • void enemy_create()
  • int yesno()


    なおwhile(true)という記述を何回か使っていますが、これはwhile(1)と同じことで無限ループになっています。
    実行結果は前回と同じです。


    16 | while】 << 【ホーム】 >> 【18 | 分割コンパイル





    ↓↓クリックして頂けると励みになります。

  • 関連記事(外部サイト)