メルマガ:あゆしゃのC言語プログラミング
タイトル:あゆしゃのC言語プログラミング(Vol.401) 第8回テスト 回答  2003/11/12


/*========================================================*/
    <<<あゆしゃのC言語プログラミング>>>
/*========================================================*/
 第401回 第8回テスト 回答
 発行    2003年11月12日(水曜日)
 発行数   約3200

{magclick}
{magclick}
/*========================================================*/
 はじめに ( 決り文句 )
/*========================================================*/
・このメールマガジンはまぐまぐさんから発行しています。
・ジャンルは、マルチメディアのプログラム、C言語です。
・このメールマガジンは、横60文字で作成しています。
 また、インデントはすべて半角スペース4つで構成しています。
・ここで扱うプログラムは、C言語と半光年以内のものです。
・登録解除は、まぐまぐさんのホームページでお願いします。
・まぐまぐさんのバックナンバー(下欄参照)を活用して下さい。
・ここは私の復習の場です。内容は約1ヶ月内外に私が勉強した
 内容になっています。最新の技術があれば、へたれもあります。
・わかりやすさを優先させる為、たまに嘘があるかもしれません。

/*========================================================*/
 ご挨拶
/*========================================================*/

 こんにちは。あゆしゃです。

 先日から、ハリーポッターの本を読み始めました。
 完全英語版です。

 現在、動物園で暴れた後、ハリーに手紙が届いたところ。

 1割分かる程度で、ちゃんとストーリを追っていけるものなの
ですね。

{magclick}
/*========================================================*/
 今回のお題  << 第8回テスト 回答 >>
/*========================================================*/

/*========================================================*/
第1問 行動可能範囲計算についての問題です。

 以下の関数をご覧ください。

void m( int x, int y, int p )
{
    b[ x ][ y ] = p;
    p -= l[ x ][ y ];
    if( p < 0 ) return;
    if( y > MIN && b[ x ][ y - 1 ] < p ) m( x, y - 1, p );
    if( y < MAX && b[ x ][ y + 1 ] < p ) m( x, y + 1, p );
    if( x > MIN && b[ x - 1 ][ y ] < p ) m( x - 1, y, p );
    if( x < MAX && b[ x + 1 ][ y ] < p ) m( x + 1, y, p );
}

 ご存知、シミュレーションゲームにて、ユニットの行動可能範囲
を計算する関数です。

 b は行動可能範囲と最短経路を記録する2次元配列です。
 l は行動に際しての進入ロスを示す2次元配列です。
 MIN とMAX は座標が取りうる最小と最大をあらわすマクロです。

 さて、ここで問題です。

 この関数は、方眼状のマップについての行動可能範囲を計算する
ものです。

 しかし、「機動戦士ガンダムギレンの野望」でのマップは六角形
であり、この関数を直接使うことはできません。

 そこで、この関数を六角形状のマップでも使えるように改造して
ください。

/*========================================================*/

void m( int x, int y, int p )
{
    b[ x ][ y ] = p;
    p -= l[ x ][ y ];
    if( p < 0 ) return;
    if( y > MIN && b[ x ][ y - 1 ] < p ) m( x, y - 1, p );
    if( y < MAX && b[ x ][ y + 1 ] < p ) m( x, y + 1, p );
    if( x > MIN && b[ x - 1 ][ y ] < p ) m( x - 1, y, p );
    if( x < MAX && b[ x + 1 ][ y ] < p ) m( x + 1, y, p );
    if( x > MIN && y < MAX && b[x-1][y+1]<p ) m( x-1,y+1,p);
    if( x < MAX && y < MAX && b[x+1][y+1]<p ) m( x+1,y+1,p);
}

 これでいい、はずです。2行追加されただけですね。

 六角形のマップは、実は方眼状のマップの奇数列を半マス下に
ずらしただけなのです。

方眼のマップ
0 1 2
3 4 5
6 7 8

6角形のマップ
0   2
  1  
3   5
  4
6   8
  7

 という感じです。
 4番のマスに注目してください。

 上下左右に動いた場合、1,7,3,5に移動します。

 これは6角形の場合でも同じです。

 さらに6角形の場合は、6と8にも移動できます。

 だから、上下左右に対する分岐のところで、左下と右下のものを
追加するだけで、6角形に対応したことになります。

 偶数列を半マス下げる場合、左上と右上になります。

 もちろん同様に、奇数行を半マスずらすのであれば、上下左右に
左上と左下、偶数行ならば右上と右下への分岐を追加することに
なりますね。

 なお、2次元配列の形を変える必要はありません。


/*========================================================*/
第2問 XP(エクストリームプログラミング)について。

 以下の5つの文章で、XPを導入する目的として正しいものに○、
正しくないものに×をつけてください。

1.開発費を高くする

2.生産性を高める

3.保守性を高める

4.インド人に対抗する

5.開発作業を難しくする


/*========================================================*/

 実は、全部○です。


1.開発費を高くする

 XPはどうしてもお金がかかってしまうので、請求するお金が
高くなってしまうようです。

 もっとも、それが本来取るべきお金だと思ったほうが正解です。

 仕事ほしさに見積もりを見誤ることは、プロジェクトに火がつく
原因になります。

 そして実際に、火がついた上に赤字、ということになるのです。

 XPの目的は、プロジェクトを成功させることです。

 仮に火がつかなかったとしても赤字では、それは失敗です。

 だから取るべき費用は取らなければならないと考えます。

 だから開発費が高くなる、というからくりです。


2.生産性を高める

 生産性というのは、早く開発するということ、ではありません。

 アプリケーション開発の場合、早く開発すればするほど、
生産性は落ちます。

 だって仕様が変わるから、早めに作ったものは無駄になる
のです。

 XPの目的は、プロジェクトを成功させることです。

 生産性が低いようでは、プロジェクトは成功しません。

 しかし仕様が変わるので、その度に生産性は落ちてしまいます。

 そこでXPでは、仕様は変わるものと一方的に決め付けて、
その上で短期リリースなどのスケジュールを立てます。

 仕様変更に正確に対応することで、生産性を高めようという
スンポーです。


3.保守性を高める

 保守性というのは、ハッカーからシステムを守る堅牢で複雑な
システムのこと、ではありません。

 保守性が高いというのは、第3者がプログラムを簡単に修正
できるような、第3者に分かりやすいシステムのことを言います。

 XPの目的は、プロジェクトを成功させることです。

 だからXPでは、ペアプログラミングで常にレビュー状態に
したり、堅牢になりつつあるシステムをリファクタリングで
解きほぐすことに、無駄とも思える時間とお金を使います。

 そうすることで、もしもの時に備え、ちょっとしたつまらない
ことで火がつかないようにしようという、たくらみです。


4.インド人に対抗する

 現在、ソフトウェア開発業界は儲かっていません。

 人件費が安く技術のある外国人(とくにインド人)に仕事を
取られてしまうのです。

 ところが、実際にインド人から上がってきたアプリケーションを
みると、ちょっとなんかなぁ、と思ってしまいます。

 安さに騙されたな、って感じです。

 1つ変更するとなると大変ですからね、インドは遠い。。

 XPの目的は、プロジェクトを成功させることです。

 全員同席というように、物理的に距離が近いことは、強みです。

 だからインド人に対抗できる、という戦略です。


5.開発作業を難しくする

 何も無意味に難しくする必要はありませんが、意味のある
難しさなら納得です。

 逆に危険であるぐらいが、安全なのです。

 XPの目的は、プロジェクトを成功させることです。

 成功する道のりは、簡単ではありません。厳しいものです。

 毎週毎週リリースで、いやになるよ、とぼやいてください。

 それが柔の道です。


/*========================================================*/
 さいごに
/*========================================================*/

{magclick}
/*========================================================*/
 次回予告
/*========================================================*/

 次回は11月14日(金曜日)に、第402回を送ります。
 お題は「AYGON1 ニューロンの基礎」

 行動可能範囲計算だけでは駄目だと、ねを上げてしまいました。

 そこでニューロンを使おうと思ったのです。

 しかしニューロンを知っている人は少ないと思いますので、
まずはその基礎から。

 お楽しみに!

/*========================================================*/
 最後の決り文句
/*========================================================*/
 このメールマガジンは、まぐまぐさんから発行しています。
 このメールマガジンを解除したい場合は、まぐまぐさんをご利用
ください。このメルマガのまぐまぐアイディーは最後にあります。
 このメールマガジンには広告が挿入されます。
 このメールマガジンの内容に文面の引用はありません。
 めーらっくすの場合はめーらっくすの利用方に従ってください。
 このメールマガジンの内容は、転用、流用、宣伝、リンク、
映画を見てますからね なんて大歓迎です。

{magclick}
/*========================================================*/
 
/*========================================================*/

発行者 あゆしゃ

まぐまぐアイディー
0000020674

まぐまぐバックナンバー
http://jazz.tegami.com/backnumber/frame.cgi?id=0000020674

あゆしゃの世界
http://ayusya.hp.infoseek.co.jp/

登録と解除
http://www.mag2.com/m/0000020674.htm

ご意見・ご感想・ご質問メール
mailto:ayusya@flamenco.plala.or.jp

めーらっくす <<過去ログがタイトル別になっています>>
http://www.mailux.com/mm_dsp.php?mm_id=MM3E1AEE285AB4F

ブラウザの閉じるボタンで閉じてください。