C応用1 構造体
C応用1 構造体
バトルゲームの一人一人のキャラクタが持つ様々な属性は、構造体と呼ばれる仕組みを使って、まとまった塊にします。同じ構造のデータの集まりは、構造体配列にします。
練習問題を通して、バトルゲームを少しずつ作っていきます。
動画は、Windows10とVisualStudio2019を使った説明になっていますが、WIndows11とVisualStudio2022を使った場合の操作方法と同じです。
今まで使っていたint, charといったデータ型は基本型で、配列は応用型の一つです。
C言語のデータ型がどういう構成になっているかを学びます。
・データ型には基本型と応用型がある
基本型を組み合わせたものが応用型です。
基本型には、整数型と浮動小数点型があり、整数型は固定2進数表現のデータ(正確なデータ)、浮動小数点型は浮動小数点表現のデータ(誤差のあるデータ)を扱います。
構造体を使うためには、構造体タグ宣言と構造変数宣言が必要です。
構造体にデータをセットする3つの方法(代入、初期化、キー入力)を、基本型の場合と比較しながら説明します。構造体のメンバは、ピリオド(.)演算子を使います。
・構造体はタグ宣言してから変数宣言する
構造体タグ宣言はメモリを確保しない宣言で、タグ宣言だけではデータを記録できません。変数宣言することで、データを記録できる箱が用意されます。
・構造体メンバはピリオド(.)演算子を使う
基本型のデータに代入するのと同じ様に、=演算子を使って、メンバ毎に代入することが出来ます。文字列を代入する場合は、strcpy関数を使って代入します。
・構造体の初期化データは { } で囲う
配列を初期化した様に、初期化データを { } で囲います。タグ宣言の時に、メンバを宣言した順番で、初期化データを書きます。
・構造体への入力はメンバ毎にする
構造体にまとめて入力することはできません。メンバ毎に入力します。
・構造体のメンバを構造体にする事もできる
構造体の中の構造体のタグ宣言は、事前に行わなければなりません。
名前(20文字以下の文字列)、体力(整数)、ちから(整数)、素早さ(整数)を入力し、入力したデータを表示するプログラムを作成しましょう。なお、名前、体力、ちから、素早さは構造体にする事。
練習問題01で作成したプログラムに、同じ構造体のエネミーを追加して1回だけバトルするプログラムを作りましょう。なお、エネミーデータは初期化でセットしましょう。
バトルのルールを以下に示します。
素早さが大きい方が先制攻撃をする(素早さが同じ場合はプレイヤーが先制攻撃)。
攻撃された方(防御者)は、以下のダメージ分の体力が奪われる。
ダメージ=攻撃者の力-防御者の素早さ÷2
データ型とメモリの関係を説明しています。新たな文法の説明はありません。
変数宣言するとデータ型に応じて、データを記録するためのメモリが確保されますが、そのイメージを、アニメーションを使って説明しています。
typedefは、データ型に新しいデータ型名を付けるのに使います。
構造体タグ宣言と組み合わせることで、構造体に新しいデータ型名を付けます。
・構造体タグ宣言とtypedef宣言を組み合わる
構造体にデータ型名を付けることで、構造体変数宣言が楽になります。
練習問題01のプログラムを、typedefを使ったやり方に修正してみましょう。
基本型の配列を復習し、その後、構造体配列について説明します。
配列宣言する時のデータ型が構造体の場合、構造体配列になります。構造体配列にデータをセットする3つの方法(初期化、代入、入力)を説明します。配列要素のための[ ]と、構造体メンバのための .(ピリオド)の位置に注意しましょう。
・構造体のデータ型で配列宣言する
構造体配列は、今までの配列宣言と同じ方法で宣言します。
・配列要素である構造体のメンバに代入する
構造体配列の要素は構造体なので、[ ] で配列要素である構造体を求め、これにピリオド(.)演算子を使って、構造体メンバにしてから代入します。今までと同様に、構造体メンバがchar型配列で文字列をセットする場合は、strcpy関数を使います。
・構造体配列の初期化は { } が入れ子になる
構造体配列の初期化は、配列の初期化の { } の中に、構造体の初期化の{ } を書くため、{ } の入れ子になります。
・配列要素である構造体のメンバに入力する
代入した時と同様に、[ ] で配列要素である構造体を求め、これにピリオド(.)演算子を使って、構造体メンバにしてから入力します。今までと同様に、基本型の場合は&を付け、char型配列で文字列の場合は&を付けません。
練習問題03で作成したtypedef宣言を使い、要素数が2個の構造体配列を宣言し、1つの要素は初期化でデータをセット、もう1つの要素にはキー入力でデータをセットするプログラムを作成しましょう。また、データ入力後、2つの要素のデータを表示しましょう。
練習問題04のプログラムにバトル処理を追加しましょう。
バトル処理は、練習問題02で提示したルールに基づいて、防御者の体力が無くなっていくようにします。攻撃と防御を交互に繰返し、どちらかの体力が無くなる迄、バトルを繰り返します。先に体力が無くなった方が敗者、体力が残っていた方が勝者となります。
上記で説明した練習問題と同じ問題です。
下記のYoutubeの動画の説明の所にはダウンロードのURLが記載されいます。
main.cppというソースファイルを含むVisual Studio 2022のプロジェクトファイル一式がダウンロードできます。ソースファイルは未完成の状態です。ソリューションファイルからVisual Studioを立ち上げ、プログラムを完成させてください。
《練習問題01》構造体への入力と表示
《練習問題02》構造体を初期化してバトル
《練習問題03》typedefを使った構造体宣言
《練習問題04》構造体配列へのデータセットと表示
《練習問題05》体力が無くなる迄バトル
テスト実施フォーム ← テストチャレンジできます
上記テストの解説と解答