Home>C/C++でいろいろ作ろう

ボーリング スコア計算プログラム

<プログラム>
bawling.cpp
bawling.h
harulib.c
harulib.h
main.cpp

<データファイル>
bowling_data.txt …入力データ
out.txt …出力データ
output.bat …一括して出力するためのバッチファイル

<開発日記>
以下、日記風に自分口調になってます。。。

ボーリングのスコアを管理しようと思い、プログラムを作ることにした。
どうせなら合計得点を自動計算できるようにしてやろう。

ストライクとスペアのルールのおさらい。
・ストライクは次とその次に倒したピンの本数が加算される。
・スペアは次に倒したピンの本数が加算される。

これをそのままプログラム化すればよい。
例外は10フレーム目。ストライクかスペアが出た場合は、3回目も投げれるようになる。
ということでどういう構造にすればよいか悩む。

10フレーム目だけ別の構造にするのも癪なので、
各フレーム共通して一投目、二投目、三投目の枠を用意することにした。

typedef struct{
int m_first; //一投目
int m_second; //二投目
int m_third; //三投目(10フレーム用)
int m_total; //合計
} Score;

三投目の4バイト×9フレーム=36バイトは無駄になるがまあしゃあない。

ストライクやスペアの場合は、次のフレームのスコアも分かっている必要があるので、
もし分からない時は、未定義値を入れることにした。今回は未定義値を-1にした。
それでいろいろ条件判定。フラグ管理のほうがよかったのかも?

最初はフレーム間の繋がりは繋ぎリストにしようと考えていたけど、結局配列にした。
10フレームというのが固定されてるわけで。
配列は添字のリミット判定する必要あるけど、繋ぎリストもNULLチェックがあるわけで、結局同じと思われた。

今回はC++でクラスを作って実装。
メイン処理はスコア計算部分。100行くらいのメンバ関数になってしまった。許されるだろうか?

あと入力するファイルのフォーマットはどうしようかと悩んだ。
管理しやすく1行に1ゲーム分入れるようにした。

---
ID<>日付<>1フレーム<>2フレーム<>....
ID<>日付<>1フレーム<>2フレーム<>....
ID<>日付<>1フレーム<>2フレーム<>....
---

というように。
出力形式はただのテキスト形式に。
ストライクとスペアはマークを使うことにした。画像がないので☆と△で代用。

文字列を扱うライブラリは以前に自分で作ったライブラリを使用。
ただ、それはC言語だったので、ライブラリのヘッダファイルをインクルードしてリンクするとエラーが出た。
C++でCを読み込ませるには

extern "C" {
void func();
}

というようにするようだ。
別に.cppに拡張子変換する必要はない。