<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>いちばんやさしいゲームの作り方 &#187; イディオム</title>
	<atom:link href="http://www.game-create.com/archives/tag/%e3%82%a4%e3%83%87%e3%82%a3%e3%82%aa%e3%83%a0/feed" rel="self" type="application/rss+xml" />
	<link>http://www.game-create.com</link>
	<description>文系の人でも、数理学がわからない人でもゲームプログラミングをマスターできるブログ</description>
	<lastBuildDate>Tue, 08 Jun 2010 01:28:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>C++ のイディオム集でスキルアップ</title>
		<link>http://www.game-create.com/archives/2201</link>
		<comments>http://www.game-create.com/archives/2201#comments</comments>
		<pubDate>Mon, 14 Sep 2009 19:22:33 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[Boost]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[イディオム]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=2201</guid>
		<description><![CDATA[スキルアップというか安心できるというか。
More C++ Idioms

ゲーム作ってると、「これ書くのにこの実装で良いだろうか？」という不安に直面するのですが、うまい具合にはまるイディオムが見つかったらしめたものです [...]]]></description>
			<content:encoded><![CDATA[<p>スキルアップというか安心できるというか。</p>
<p><a href="http://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms" class="external">More C++ Idioms</a></p>
<p><span id="more-2201"></span></p>
<p>ゲーム作ってると、「これ書くのにこの実装で良いだろうか？」という不安に直面するのですが、うまい具合にはまるイディオムが見つかったらしめたものです。一度探してみると良いと思います。</p>
<p>Boost の中にこういったイディオムの実装もあるようで、理解を深める意味でも参考になりそうです。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/2201/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>数値の内容によって分岐する &#8211; switch 文</title>
		<link>http://www.game-create.com/archives/689</link>
		<comments>http://www.game-create.com/archives/689#comments</comments>
		<pubDate>Mon, 08 Sep 2008 08:33:20 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[イディオム]]></category>
		<category><![CDATA[制御構文]]></category>
		<category><![CDATA[言語仕様]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=689</guid>
		<description><![CDATA[数値の内容によって分岐するためには switch 文を使います。

たとえば enum 型は取りうる値が決まっているデータ型ですが、その正体は数値です。 enum 型変数の内容（数値）によって分岐する際に switch  [...]]]></description>
			<content:encoded><![CDATA[<p>数値の内容によって分岐するためには switch 文を使います。</p>
<p><span id="more-689"></span></p>
<p>たとえば enum 型は取りうる値が決まっているデータ型ですが、その正体は数値です。 enum 型変数の内容（数値）によって分岐する際に switch 文は力を発揮します。</p>
<div class="hl-surround" style="height:280px;"><div class="hl-main"><pre><span class="hl-types">typedef enum </span><span class="hl-identifier">GameMode </span><span class="hl-brackets">{
  </span><span class="hl-identifier">Opening</span><span class="hl-code">,
  </span><span class="hl-identifier">GameMain</span><span class="hl-code">,
  </span><span class="hl-identifier">GameOver</span><span class="hl-code">,
  </span><span class="hl-identifier">Ending
</span><span class="hl-brackets">} </span><span class="hl-identifier">GameMode</span><span class="hl-default">;

</span><span class="hl-identifier">GameMode current</span><span class="hl-default"> = </span><span class="hl-identifier">Opening</span><span class="hl-default">;

</span><span class="hl-reserved">switch </span><span class="hl-brackets">(</span><span class="hl-identifier">current</span><span class="hl-brackets">) {
</span><span class="hl-reserved">case </span><span class="hl-identifier">Opening</span><span class="hl-code">:
  </span><span class="hl-comment">// オープニングの処理
  </span><span class="hl-reserved">break</span><span class="hl-code">;
</span><span class="hl-reserved">case </span><span class="hl-identifier">GameMain</span><span class="hl-code">:
  </span><span class="hl-comment">// メインループの処理
  </span><span class="hl-reserved">break</span><span class="hl-code">;
</span><span class="hl-reserved">case </span><span class="hl-identifier">GameOver</span><span class="hl-code">:
  </span><span class="hl-comment">// ゲームオーバー時の処理
  </span><span class="hl-reserved">break</span><span class="hl-code">;
</span><span class="hl-reserved">case </span><span class="hl-identifier">Ending</span><span class="hl-code">:
  </span><span class="hl-comment">// エンディングの処理
  </span><span class="hl-reserved">break</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre></div></div>
<p>switch 文には重要なポイントがふたつあります。</p>
<ul>
<li>break を書かないと、その下の行が実行されてしまう</li>
<li>switch 句の数値が case に該当しない場合は default: というラベルへジャンプする</li>
</ul>
<p>実は switch 文というのはラベルジャンプに他ならないのです。ですので、もし break を書き忘れると後に続く処理も実行されてしまいます。これは当然です。プログラムは上から下へ実行されるからです。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">switch </span><span class="hl-brackets">(</span><span class="hl-identifier">current</span><span class="hl-brackets">) {
</span><span class="hl-reserved">case </span><span class="hl-identifier">GameMain</span><span class="hl-code">:
  </span><span class="hl-comment">// 痛恨の break 書き忘れ
</span><span class="hl-reserved">case </span><span class="hl-identifier">GameOver</span><span class="hl-code">:
  </span><span class="hl-comment">// おいおい current が GameMain の時にここも実行されちゃうぞ！？
  </span><span class="hl-reserved">break</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre></div></div>
<p>しかし、 break の書き忘れが常に間違いかというとそうではなく、この動作を逆に利用して「違うラベルで同じ処理をさせる」ことができます。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">switch </span><span class="hl-brackets">(</span><span class="hl-identifier">current</span><span class="hl-brackets">) {
</span><span class="hl-reserved">case </span><span class="hl-identifier">GameStage1</span><span class="hl-code">:
</span><span class="hl-reserved">case </span><span class="hl-identifier">GameStage2</span><span class="hl-code">:
</span><span class="hl-reserved">case </span><span class="hl-identifier">GameStage3</span><span class="hl-code">:
  </span><span class="hl-comment">// ステージ１～３の場合の処理
  </span><span class="hl-reserved">break</span><span class="hl-code">;
</span><span class="hl-reserved">case </span><span class="hl-identifier">GameStage4</span><span class="hl-code">:
</span><span class="hl-reserved">case </span><span class="hl-identifier">GameStage5</span><span class="hl-code">:
</span><span class="hl-reserved">case </span><span class="hl-identifier">GameStage6</span><span class="hl-code">:
  </span><span class="hl-comment">// ステージ４～６の場合の処理
  </span><span class="hl-reserved">break</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre></div></div>
<p>また、該当しない場合に default: へジャンプするというのは納得のいく仕様かと思われます。コンピュータを使っているとよく「デフォルト値」とか言うと思いますが、あれです。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">switch </span><span class="hl-brackets">(</span><span class="hl-identifier">current</span><span class="hl-brackets">) {
</span><span class="hl-reserved">case </span><span class="hl-identifier">Opening</span><span class="hl-code">:
  </span><span class="hl-comment">// オープニングの処理
  </span><span class="hl-reserved">break</span><span class="hl-code">;
</span><span class="hl-reserved">case </span><span class="hl-identifier">Ending</span><span class="hl-code">:
  </span><span class="hl-comment">// エンディングの処理
  </span><span class="hl-reserved">break</span><span class="hl-code">;
</span><span class="hl-reserved">default</span><span class="hl-code">:
  </span><span class="hl-comment">// 該当しない債務不履行な処理（債務不履行＝デフォルト）
  </span><span class="hl-reserved">break</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre></div></div>
<p>ちなみに if 文でも同じことができるのですが enum 型と連携しての分岐はイディオム的な部分がありますので覚えておきましょう。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/689/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>奇数、または偶数の時だけなにかをする</title>
		<link>http://www.game-create.com/archives/685</link>
		<comments>http://www.game-create.com/archives/685#comments</comments>
		<pubDate>Sun, 07 Sep 2008 13:47:01 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[イディオム]]></category>
		<category><![CDATA[算術演算子]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=685</guid>
		<description><![CDATA[奇数、または偶数の時だけなにかをするためには、その数値を２で割った余りを使います。

２で割った余りが１であればその数値は奇数です。逆に０であれば偶数です。この関係を利用して奇数と偶数を判定する式を次のように書くことがで [...]]]></description>
			<content:encoded><![CDATA[<p>奇数、または偶数の時だけなにかをするためには、その数値を２で割った余りを使います。</p>
<p><span id="more-685"></span></p>
<p>２で割った余りが１であればその数値は奇数です。逆に０であれば偶数です。この関係を利用して奇数と偶数を判定する式を次のように書くことができます。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">if </span><span class="hl-brackets">((</span><span class="hl-identifier">value</span><span class="hl-code"> % </span><span class="hl-number">2</span><span class="hl-brackets">)</span><span class="hl-code"> == </span><span class="hl-number">1</span><span class="hl-brackets">) {
  </span><span class="hl-comment">// 奇数
</span><span class="hl-brackets">} </span><span class="hl-reserved">else </span><span class="hl-brackets">{
  </span><span class="hl-comment">// 偶数
</span><span class="hl-brackets">}
</span><span class="hl-identifier">value</span><span class="hl-default">++;</span></pre></div></div>
<p>ただし、この技は算術演算子で余りが取れる言語でないと読みづらくなります（ Excel の VBA など）。また、最下位ビットが立っているかいないかで判定する方法もあるのですが、こちらは数値がビットで成り立っていることを知らないと伝わりません。「そんなやつがプログラマでいるのか？」と思いますよね。いるんですよ、結構。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/685/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>無限ループを作る</title>
		<link>http://www.game-create.com/archives/682</link>
		<comments>http://www.game-create.com/archives/682#comments</comments>
		<pubDate>Sat, 06 Sep 2008 07:40:01 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[イディオム]]></category>
		<category><![CDATA[制御構文]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=682</guid>
		<description><![CDATA[無限ループを作るためには while 文、または for 文を使います。

無限ループの出番は意外と多いです。たとえば Windows プログラミングの場合には終了のメッセージが飛ぶまでは無限ループにする必要があります。 [...]]]></description>
			<content:encoded><![CDATA[<p>無限ループを作るためには while 文、または for 文を使います。</p>
<p><span id="more-682"></span></p>
<p>無限ループの出番は意外と多いです。たとえば Windows プログラミングの場合には終了のメッセージが飛ぶまでは無限ループにする必要があります。無限ループの書き方はイディオムですので覚えてしまいましょう。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-comment">// 私、理系ですからスタイル
</span><span class="hl-reserved">while </span><span class="hl-brackets">(</span><span class="hl-number">1</span><span class="hl-brackets">) {
}

</span><span class="hl-comment">// 私、ソースが仕様書ですスタイル
</span><span class="hl-reserved">while </span><span class="hl-brackets">(</span><span class="hl-reserved">true</span><span class="hl-brackets">) {
}

</span><span class="hl-comment">// ちょっとうるうるきちゃうスタイル
</span><span class="hl-reserved">for </span><span class="hl-brackets">(</span><span class="hl-code">;;</span><span class="hl-brackets">) {
}</span></pre></div></div>
<p>余談なのですが PHP の場合には goto 文がないので途中で抜けられるブロックを作る際に無限ループで代用することがよくあります。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-inlinetags">&lt;?php
</span><span class="hl-reserved">while </span><span class="hl-brackets">(</span><span class="hl-reserved">true</span><span class="hl-brackets">) {
  </span><span class="hl-reserved">if </span><span class="hl-brackets">(</span><span class="hl-comment">/* 何か問題に遭遇したら */</span><span class="hl-brackets">) {
    </span><span class="hl-reserved">break</span><span class="hl-code">;
  </span><span class="hl-brackets">}

  </span><span class="hl-reserved">if </span><span class="hl-brackets">(</span><span class="hl-comment">/* また別の問題に遭遇したら */</span><span class="hl-brackets">) {
    </span><span class="hl-reserved">break</span><span class="hl-code">;
  </span><span class="hl-brackets">}

  </span><span class="hl-comment">// ループは１回で終わり
  </span><span class="hl-reserved">break</span><span class="hl-code">;
</span><span class="hl-brackets">}
</span><span class="hl-inlinetags">?&gt;</span></pre></div></div>
<p>なんとかならんものかと悩みます。その点 C/C++ は良いですよね。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/682/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>０からｎまでの間で数値を循環させる</title>
		<link>http://www.game-create.com/archives/588</link>
		<comments>http://www.game-create.com/archives/588#comments</comments>
		<pubDate>Mon, 11 Aug 2008 19:05:18 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[イディオム]]></category>
		<category><![CDATA[数値]]></category>
		<category><![CDATA[算術演算子]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=588</guid>
		<description><![CDATA[０からｎまでの間で数値を循環させるためには % 演算子を使います。

% は割り算の余りを求める演算子ですが、ある変数の内容を１ずつ増加させ、その余りを取ると数値が循環するようになります。
#include &#60;io [...]]]></description>
			<content:encoded><![CDATA[<p>０からｎまでの間で数値を循環させるためには % 演算子を使います。</p>
<p><span id="more-588"></span></p>
<p>% は割り算の余りを求める演算子ですが、ある変数の内容を１ずつ増加させ、その余りを取ると数値が循環するようになります。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-prepro">#include </span><span class="hl-quotes">&lt;</span><span class="hl-string">iostream</span><span class="hl-quotes">&gt;</span><span class="hl-prepro">

</span><span class="hl-types">int </span><span class="hl-identifier">main</span><span class="hl-brackets">(</span><span class="hl-types">int </span><span class="hl-identifier">argc</span><span class="hl-code">, </span><span class="hl-types">char</span><span class="hl-code"> *</span><span class="hl-identifier">argv</span><span class="hl-brackets">)
{
  </span><span class="hl-types">int </span><span class="hl-identifier">value</span><span class="hl-code"> = </span><span class="hl-number">0</span><span class="hl-code">;

  </span><span class="hl-reserved">for </span><span class="hl-brackets">(</span><span class="hl-types">int </span><span class="hl-identifier">i</span><span class="hl-code"> = </span><span class="hl-number">0</span><span class="hl-code">; </span><span class="hl-identifier">i</span><span class="hl-code"> &lt;</span><span class="hl-number">100</span><span class="hl-code">; </span><span class="hl-identifier">i</span><span class="hl-code">++</span><span class="hl-brackets">) {
    </span><span class="hl-comment">// 0 から 7 で循環させる
    </span><span class="hl-identifier">std</span><span class="hl-code">::</span><span class="hl-identifier">cout</span><span class="hl-code"> &lt;&lt;</span><span class="hl-identifier">value</span><span class="hl-code"> % </span><span class="hl-number">8</span><span class="hl-code"> &lt;&lt;</span><span class="hl-identifier">std</span><span class="hl-code">::</span><span class="hl-identifier">endl</span><span class="hl-code">;
    </span><span class="hl-identifier">value</span><span class="hl-code">++;
  </span><span class="hl-brackets">}

  </span><span class="hl-reserved">return </span><span class="hl-number">0</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre></div></div>
<p>これを実行すると次のようになります。</p>
<div class="hl-surround" ><div class="hl-main"><pre>0
1
2
3
4
5
6
7
0 ←また０に戻った！
1
2
3
4
5
6
7
0 ←また！
1
2
…（以下、略）</pre></div></div>
<p>注意点は、変数がオーバーフローしたときに期待した動作にならないことです。一度だけ使うツールを作る際など、限定した用途に使うのが吉です。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/588/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>継続条件如何に関わらずループを終了する &#8211; break 文</title>
		<link>http://www.game-create.com/archives/545</link>
		<comments>http://www.game-create.com/archives/545#comments</comments>
		<pubDate>Mon, 04 Aug 2008 09:00:33 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[イディオム]]></category>
		<category><![CDATA[制御構文]]></category>
		<category><![CDATA[言語仕様]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=545</guid>
		<description><![CDATA[継続条件如何に関わらずループを終了するためには break 文を使います。

break 文を使うと、そのループを強制的に抜けることができます。これによりループの終了を for や while 以外の場所で判断できるよう [...]]]></description>
			<content:encoded><![CDATA[<p>継続条件如何に関わらずループを終了するためには break 文を使います。</p>
<p><span id="more-545"></span></p>
<p>break 文を使うと、そのループを強制的に抜けることができます。これによりループの終了を for や while 以外の場所で判断できるようになります。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">while </span><span class="hl-brackets">((</span><span class="hl-identifier">fgets</span><span class="hl-brackets">(</span><span class="hl-identifier">string</span><span class="hl-code">, </span><span class="hl-identifier">maxLength</span><span class="hl-code"> - </span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-identifier">fp</span><span class="hl-brackets">))</span><span class="hl-code"> != </span><span class="hl-prepro">NULL</span><span class="hl-brackets">) {
  </span><span class="hl-comment">// end の文字があったらループを終了する
  </span><span class="hl-reserved">if </span><span class="hl-brackets">(</span><span class="hl-identifier">lstrcmp</span><span class="hl-brackets">(</span><span class="hl-identifier">string</span><span class="hl-code">, </span><span class="hl-identifier">TEXT</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">end</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">))</span><span class="hl-code"> == </span><span class="hl-number">0</span><span class="hl-brackets">) {
    </span><span class="hl-reserved">break</span><span class="hl-code">;
  </span><span class="hl-brackets">}
}</span></pre></div></div>
<p>また、いつ終了するかわからないループを作る場合、 while の継続条件に１（または true ）と書いて無限ループを作り、終了条件は if 文と break 文を組み合わせて作るという手法がよく使われます。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">while </span><span class="hl-brackets">(</span><span class="hl-reserved">true</span><span class="hl-brackets">) {

  </span><span class="hl-comment">// 前略

  </span><span class="hl-reserved">if </span><span class="hl-brackets">(</span><span class="hl-mlcomment">/* 難解な終了条件 */</span><span class="hl-brackets">) {
    </span><span class="hl-reserved">break</span><span class="hl-code">;
  </span><span class="hl-brackets">}

  </span><span class="hl-comment">// 後略

</span><span class="hl-brackets">}</span></pre></div></div>
<p>なお、 break 文は break 文が直接属するループのみを抜ける点に注意が必要です。たとえば２重ループの場合、中のループで break 文を書いても外側のループに処理が戻るだけです。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">while </span><span class="hl-brackets">(</span><span class="hl-identifier">condition</span><span class="hl-code"> == </span><span class="hl-reserved">true</span><span class="hl-brackets">) {
  </span><span class="hl-reserved">while </span><span class="hl-brackets">(</span><span class="hl-identifier">innerCondition</span><span class="hl-code"> == </span><span class="hl-reserved">true</span><span class="hl-brackets">) {
    </span><span class="hl-reserved">if </span><span class="hl-brackets">(</span><span class="hl-mlcomment">/* 終了条件 */</span><span class="hl-brackets">) {
      </span><span class="hl-reserved">break</span><span class="hl-code">;
    </span><span class="hl-brackets">}
  }
  </span><span class="hl-comment">// ↑中のループで break したらここにくる
</span><span class="hl-brackets">}</span></pre></div></div>
<p>中のループから外側のループまで抜けたい場合は、外側のループにも if 文が必要です。また goto 文を使う方法もあります。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">while </span><span class="hl-brackets">(</span><span class="hl-identifier">condition</span><span class="hl-code"> == </span><span class="hl-reserved">true</span><span class="hl-brackets">) {
  </span><span class="hl-reserved">while </span><span class="hl-brackets">(</span><span class="hl-identifier">innerCondition</span><span class="hl-code"> == </span><span class="hl-reserved">true</span><span class="hl-brackets">) {
    </span><span class="hl-reserved">if </span><span class="hl-brackets">(</span><span class="hl-mlcomment">/* 終了条件 */</span><span class="hl-brackets">) {
      </span><span class="hl-reserved">goto </span><span class="hl-identifier">endofloop</span><span class="hl-code">;
    </span><span class="hl-brackets">}
  }
}

</span><span class="hl-identifier">endofloop</span><span class="hl-default">:
</span><span class="hl-comment">// ここに飛んでくる</span></pre></div></div>
<p>ちなみに、 goto 文はこれ以外の用途で不用意に使うと批判の対象になってしまうため注意が必要です。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/545/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ひとつのコンパイル単位で同じヘッダファイルを２度 #include しないようにする</title>
		<link>http://www.game-create.com/archives/413</link>
		<comments>http://www.game-create.com/archives/413#comments</comments>
		<pubDate>Thu, 03 Jul 2008 07:19:24 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[イディオム]]></category>
		<category><![CDATA[プリプロセッサ]]></category>
		<category><![CDATA[ヘッダファイル]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=413</guid>
		<description><![CDATA[ひとつのコンパイル単位で同じヘッダファイルを２度 #include しないようにするためには、プリプロセッサを使います。

そもそも、なぜコンパイル単位で同じヘッダを２度 #include してはならないのかというと、無 [...]]]></description>
			<content:encoded><![CDATA[<p>ひとつのコンパイル単位で同じヘッダファイルを２度 #include しないようにするためには、プリプロセッサを使います。</p>
<p><span id="more-413"></span></p>
<p>そもそも、なぜコンパイル単位で同じヘッダを２度 #include してはならないのかというと、無限 #include に陥ってしまったり、シンボルが重複してしまうからです。たとえば this.h というヘッダファイルの中で #include &#8220;this.h&#8221; と書いてしまうと this.h が this.h を #include して、さらに #include された this.h が this.h を #include しで…となってしまい、コンパイルがいつまで経っても終わらなくなります。シンボルの重複とは話が簡単です。要は同じ名前は２回使えませんということです。たとえば構造体や関数や変数の名前は決められた範囲の中で一意である必要があるのです。</p>
<p>なにやら訳がわかりませんが、幸いなことに対処方法は非常に簡単です。ヘッダファイルに定型句を書くだけです。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-prepro">#ifndef </span><span class="hl-identifier">THIS_HEADER_INCLUDED__</span><span class="hl-prepro">
#define </span><span class="hl-identifier">THIS_HEADER_INCLUDED__</span><span class="hl-prepro">

</span><span class="hl-mlcomment">/* ここにヘッダファイルの中身を書く */

</span><span class="hl-prepro">#endif</span></pre></div></div>
<p>THIS_HEADER_INCLUDED__ はヘッダファイルごとに違う文字列を入れてください。好きな名前をつけていただいて問題ありませんが、他のファイルと重複しないようにする必要があります。ファイル名から考えるのが楽かと思います。こう書いておくとたとえば次のようなコードを書いても問題なくコンパイルが通るようになります。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-comment">// わざと何回も #include してみる
</span><span class="hl-prepro">#include </span><span class="hl-quotes">&quot;</span><span class="hl-string">this.h</span><span class="hl-quotes">&quot;</span><span class="hl-prepro">
#include </span><span class="hl-quotes">&quot;</span><span class="hl-string">this.h</span><span class="hl-quotes">&quot;</span><span class="hl-prepro">
#include </span><span class="hl-quotes">&quot;</span><span class="hl-string">this.h</span><span class="hl-quotes">&quot;</span><span class="hl-prepro">
#include </span><span class="hl-quotes">&quot;</span><span class="hl-string">this.h</span><span class="hl-quotes">&quot;</span><span class="hl-prepro">
#include </span><span class="hl-quotes">&quot;</span><span class="hl-string">this.h</span><span class="hl-quotes">&quot;</span><span class="hl-prepro">
</span><span class="hl-comment">// 問題なし</span></pre></div></div>
<p>ここまで極端なソースにはならないと思いますが、同じような意味のことは十分起こりえます。ヘッダファイルを書く場合は #ifndef #define #endif のセットで覚えておきましょう。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/413/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>100 体分の敵キャラクターをなるべく少ないコードで動かす</title>
		<link>http://www.game-create.com/archives/398</link>
		<comments>http://www.game-create.com/archives/398#comments</comments>
		<pubDate>Thu, 19 Jun 2008 11:22:21 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[イディオム]]></category>
		<category><![CDATA[制御構文]]></category>
		<category><![CDATA[構造体]]></category>
		<category><![CDATA[配列]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=398</guid>
		<description><![CDATA[100 体分の敵キャラクターをなるべく少ないコードで動かすためには、配列と for 文を組み合わせます。

まず、敵キャラクターの総数を定数で定義します。定数で定義する理由は「あとで変更するのが楽」だからです。
#def [...]]]></description>
			<content:encoded><![CDATA[<p>100 体分の敵キャラクターをなるべく少ないコードで動かすためには、配列と for 文を組み合わせます。</p>
<p><span id="more-398"></span></p>
<p>まず、敵キャラクターの総数を定数で定義します。定数で定義する理由は「あとで変更するのが楽」だからです。</p>
<div class="hl-surround" style="height:16.8px;"><div class="hl-main"><pre><span class="hl-prepro">#define </span><span class="hl-identifier">MAX_ENEMY </span><span class="hl-number">100</span></pre></div></div>
<p>こうすることで、プログラムから MAX_ENEMY という定数を使うことができるようになります。意味は 100 と数字で書いたときと同じになります。</p>
<p>次に敵キャラクターの情報を保存する配列を作ります。今回の場合は 100 体分の敵キャラクターが必要ですので 100 …と、数字で指定したいところですが、ここで先ほど定義した定数を使います。</p>
<div class="hl-surround" style="height:16.8px;"><div class="hl-main"><pre><span class="hl-identifier">Enemy enemies</span><span class="hl-brackets">[</span><span class="hl-identifier">MAX_ENEMY</span><span class="hl-brackets">]</span><span class="hl-default">;</span></pre></div></div>
<p>100 という数字を MAX_ENEMY という定数で置き換えることで、敵キャラクターの増減が簡単になります。たとえば、敵キャラクターを 200 体に増やしたい場合は、 #define MAX_ENEMY 200 と書き直すだけで 200 体分の配列を作れるようになります。</p>
<p>100 体分の配列が作れたら準備が完了です。次はゲームの中から 100 体分の敵キャラクターを動かします。しかし、プログラムは一度にひとつのことしかできませんので 100 体の敵キャラクターを同時に動かすことはできません。 100 体分の敵キャラクターを動かすためには、きわめて短い間隔で１体ずつ動かして、見かけ上同時に動いているように見せるのです（アニメーションの原理と同じ）。これを実現するためには for 文を使います。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">for </span><span class="hl-brackets">(</span><span class="hl-types">int </span><span class="hl-identifier">i</span><span class="hl-code"> = </span><span class="hl-number">0</span><span class="hl-code">; </span><span class="hl-identifier">i</span><span class="hl-code"> &lt;</span><span class="hl-identifier">MAX_ENEMY</span><span class="hl-code">; </span><span class="hl-identifier">i</span><span class="hl-code">++</span><span class="hl-brackets">) {
  </span><span class="hl-identifier">doEnemy</span><span class="hl-brackets">(</span><span class="hl-identifier">enemies</span><span class="hl-brackets">[</span><span class="hl-identifier">i</span><span class="hl-brackets">])</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre></div></div>
<p>１体の敵キャラクターを動かすための関数が doEnemy() で、どの敵キャラクターを動かすのかを引数で受け取るような仕様の場合、先ほど作った enemies 配列に、現在のループは何回目かを数えている i という変数を組み合わせて enemies[i] とする点がポイントです。このように書くと、１回目のループでは i の値が０ですので enemies[0] を参照することができ、２回目のループでは i の値が１ですので enemies[1] を参照することができるようになります。この調子で 100 回繰り返すわけですから、結果的に 100 体分の敵キャラクターを順番に参照していることになります。</p>
<p>これは基本的にして重要なイディオムですので覚えてしまいましょう。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/398/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

