<?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/%e5%88%b6%e5%be%a1%e6%a7%8b%e6%96%87/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>ゲームプログラミングでもこれをやってはいかんですよ</title>
		<link>http://www.game-create.com/archives/2879</link>
		<comments>http://www.game-create.com/archives/2879#comments</comments>
		<pubDate>Thu, 11 Feb 2010 14:19:18 +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=2879</guid>
		<description><![CDATA[今週、２回目の同じようなミスです。
if (someConditions == true)
switch (variable) {
  /* 中略 */
}

例によって if 文を誤ってコピペしてしまったミスなん [...]]]></description>
			<content:encoded><![CDATA[<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">someConditions</span><span class="hl-code"> == </span><span class="hl-reserved">true</span><span class="hl-brackets">)
</span><span class="hl-reserved">switch </span><span class="hl-brackets">(</span><span class="hl-identifier">variable</span><span class="hl-brackets">) {
  </span><span class="hl-mlcomment">/* 中略 */
</span><span class="hl-brackets">}</span></pre></div></div>
<p><span id="more-2879"></span></p>
<p>例によって if 文を誤ってコピペしてしまったミスなんですが、 if 文の条件を満たす場合のみに続く switch 文が実行されるようになってしまっています。こういうのが嫌なので if 文にはブロックを付けるようにしています。</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">someConditions</span><span class="hl-code"> == </span><span class="hl-reserved">true</span><span class="hl-brackets">) { </span><span class="hl-mlcomment">/* 中略 */ </span><span class="hl-brackets">} </span><span class="hl-comment">// これなら if 文の結果如何に関わらず次の switch が実行される
</span><span class="hl-reserved">switch </span><span class="hl-brackets">(</span><span class="hl-identifier">variable</span><span class="hl-brackets">) {
  </span><span class="hl-mlcomment">/* 中略 */
</span><span class="hl-brackets">}</span></pre></div></div>
<p>今回なぜ外れていたのかわかりませんが、疲れているのでしょうか。</p>
<p>一瞬、疲れすぎて死なないか心配になりましたが、生命線の膨らみが大きく、しかも二重生命線なので体は丈夫とのことです。命拾いしました。余談ですが感情線も二重です。知能線が二重だったらコンプリートだったのに…</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/2879/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>goto 文を使わないでブロックの残りをスキップする</title>
		<link>http://www.game-create.com/archives/2091</link>
		<comments>http://www.game-create.com/archives/2091#comments</comments>
		<pubDate>Thu, 20 Aug 2009 17:26:33 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[制御構文]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=2091</guid>
		<description><![CDATA[深いブロックは脱出できませんが、こんなのどうでしょう。
do {
  …
  // なんらかのエラー
  if (error) {
    break;
  }
  …
} while (false);

 [...]]]></description>
			<content:encoded><![CDATA[<p>深いブロックは脱出できませんが、こんなのどうでしょう。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">do </span><span class="hl-brackets">{</span><span class="hl-code">
  …
  </span><span class="hl-comment">// なんらかのエラー
  </span><span class="hl-reserved">if </span><span class="hl-brackets">(</span><span class="hl-identifier">error</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-code">
  …
</span><span class="hl-brackets">} </span><span class="hl-reserved">while </span><span class="hl-brackets">(</span><span class="hl-reserved">false</span><span class="hl-brackets">)</span><span class="hl-default">;</span></pre></div></div>
<p><span id="more-2091"></span></p>
<p>for 文の中とか深いブロック抜けられませんが、そもそも goto 文が使えない状況（ PHP とか）では重宝することもあります（トランザクションに関する処理を書くときとか）。</p>
<p>ただ、これをやると周りの技術者から「これは何の意味があるん？」と問い詰められること必死です。はい、今です。</p>
<p>2009/08/21 追記： while のスペルミスを修正しました。 yomogi さん、ありがとうございます。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/2091/feed</wfw:commentRss>
		<slash:comments>2</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/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>継続条件如何に関わらず残りのループをスキップする &#8211; continue 文</title>
		<link>http://www.game-create.com/archives/549</link>
		<comments>http://www.game-create.com/archives/549#comments</comments>
		<pubDate>Tue, 05 Aug 2008 02:16:35 +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=549</guid>
		<description><![CDATA[継続条件如何に関わらず残りのループをスキップするためには continue 文を使います。

continue 文を使うと、そのループの残りの手続きをスキップし、次のループを開始することができるようになります。これは「基 [...]]]></description>
			<content:encoded><![CDATA[<p>継続条件如何に関わらず残りのループをスキップするためには continue 文を使います。</p>
<p><span id="more-549"></span></p>
<p>continue 文を使うと、そのループの残りの手続きをスキップし、次のループを開始することができるようになります。これは「基本的にすべての要素に処理をしたいのだが、一部例外の要素がある」という場合に便利です。</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-reserved">if </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-identifier">status</span><span class="hl-code"> == </span><span class="hl-identifier">Dead</span><span class="hl-brackets">) {
    </span><span class="hl-comment">// 敵キャラが死んでいる場合は次へ移る
    </span><span class="hl-reserved">continue</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>continue 文は break 文と同様に、直接属するループの中のみスキップが可能です。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/549/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>とりあえず一度実行して繰り返すかは最後に判断するループを作る &#8211; do ～ while 文</title>
		<link>http://www.game-create.com/archives/518</link>
		<comments>http://www.game-create.com/archives/518#comments</comments>
		<pubDate>Wed, 30 Jul 2008 09:44:14 +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=518</guid>
		<description><![CDATA[とりあえず一度実行して繰り返すかは最後に判断するループを作るためには do ～ while 文を使います。

一見、 while 文と同じ機能のように思えますが、「一度は必ず実行される」「繰り返すかは最後に判断する」とい [...]]]></description>
			<content:encoded><![CDATA[<p>とりあえず一度実行して繰り返すかは最後に判断するループを作るためには do ～ while 文を使います。</p>
<p><span id="more-518"></span></p>
<p>一見、 <a href="http://www.game-create.com/archives/495">while 文</a>と同じ機能のように思えますが、「一度は必ず実行される」「繰り返すかは最後に判断する」という点で異なっています。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">do </span><span class="hl-brackets">{
  </span><span class="hl-comment">// とりあえず一度は実行される
</span><span class="hl-brackets">} </span><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-default">; </span><span class="hl-comment">// 繰り返すかを判断する</span></pre></div></div>
<p>do ～ while 文へ条件を指定するためには、式、関係演算子、論理演算子のいずれか、またはそれらの組み合わせを指定することができます。詳しくは次の記事を参照ください。</p>
<ul>
<li><a href="http://www.game-create.com/archives/93">計算する &#8211; 式</a></li>
<li><a href="http://www.game-create.com/archives/103">数値と数値の大小を比較する &#8211; 関係演算子</a></li>
<li><a href="http://www.game-create.com/archives/105">「～かつ」「～または」を判定する &#8211; 論理演算子</a></li>
</ul>
<p>ちなみに、どんな繰り返しでも for 文で代替できるため、 for のみの使用を推奨する宗派もあるのですが、私は文脈を考えて一番適切な制御構文を選んだ方が良いと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/518/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>条件が成立している間、繰り返す &#8211; while 文</title>
		<link>http://www.game-create.com/archives/495</link>
		<comments>http://www.game-create.com/archives/495#comments</comments>
		<pubDate>Thu, 24 Jul 2008 14:22:53 +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=495</guid>
		<description><![CDATA[条件が成立している間、繰り返すためには while 文を使います。

while 文を使うと、式が成立している間中、繰り返し実行されるブロックを作ることができます。
while (condition == true) { [...]]]></description>
			<content:encoded><![CDATA[<p>条件が成立している間、繰り返すためには while 文を使います。</p>
<p><span id="more-495"></span></p>
<p>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">condition</span><span class="hl-code"> == </span><span class="hl-reserved">true</span><span class="hl-brackets">) {
  </span><span class="hl-comment">// condition が true の間、実行される
</span><span class="hl-brackets">}</span></pre></div></div>
<p>while 文へ条件を指定するためには、式、関係演算子、論理演算子のいずれか、またはそれらの組み合わせを指定することができます。詳しくは次の記事を参照ください。</p>
<ul>
<li><a href="http://www.game-create.com/archives/93">計算する &#8211; 式</a></li>
<li><a href="http://www.game-create.com/archives/103">数値と数値の大小を比較する &#8211; 関係演算子</a></li>
<li><a href="http://www.game-create.com/archives/105">「～かつ」「～または」を判定する &#8211; 論理演算子</a></li>
</ul>
<p>また while 文は、 while 文に到達した段階で式が成立していなかった場合、中のブロックを一度も実行せずに次へ進みます。</p>
<p>while 文や do while 文は、すべて for 文によって代替が可能ですが、文脈をよく考慮して適切な意味の制御構文を選択するとプログラムが読みやすくなります。日本語に直したとき「～している間繰り返す」となる場合は while 文の出番です。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/495/feed</wfw:commentRss>
		<slash:comments>1</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>
		<item>
		<title>ｎ回ループする &#8211; for 文</title>
		<link>http://www.game-create.com/archives/397</link>
		<comments>http://www.game-create.com/archives/397#comments</comments>
		<pubDate>Wed, 18 Jun 2008 10:44:37 +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=397</guid>
		<description><![CDATA[プログラムの制御の基本に繰り返しが数えられます。別名ループと言います。たとえば敵キャラが 100 体出てくるゲームの場合、敵キャラの思考ルーチンを 100 体分実行する必要がありますが、これを少ないコードで実現するための [...]]]></description>
			<content:encoded><![CDATA[<p>プログラムの制御の基本に繰り返しが数えられます。別名ループと言います。たとえば敵キャラが 100 体出てくるゲームの場合、敵キャラの思考ルーチンを 100 体分実行する必要がありますが、これを少ないコードで実現するための仕組みがループです。</p>
<p>ループを記述するためには for 文を使います。</p>
<p><span id="more-397"></span></p>
<p>もっとも基本的な for 文は「Ｎ回ループする」という形のものです。ループする回数がＮ回と決まっている場合の 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">N</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">// Ｎ回実行されるブロック
</span><span class="hl-brackets">}

</span><span class="hl-comment">// 100 回ループする例
</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">// 100 回実行されるブロック
</span><span class="hl-brackets">}</span></pre></div></div>
<p>この場合、ブロック（中括弧）で囲われた部分がＮ回実行されます。ここで、ブロックの中から i という変数にアクセスすることで、現在何回目のループが実行されているかを知ることができます。ただし、 i の値は０から始まるため、たとえば 50 回目のループを実行しているときには i の値は 49 になるという点に注意する必要があります。</p>
<p>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-number">1</span><span class="hl-brackets">]</span><span class="hl-code">; </span><span class="hl-brackets">[</span><span class="hl-number">2</span><span class="hl-brackets">]</span><span class="hl-code">; </span><span class="hl-brackets">[</span><span class="hl-number">3</span><span class="hl-brackets">]) {
  [</span><span class="hl-number">4</span><span class="hl-brackets">]
}</span></pre></div></div>
<p>プログラムが for 文に遭遇すると、まず [1] を実行します。 [1] にはループを初期化する処理などを書くことができますが、省略することもできます。たいていの場合 int i = 0 となるはずです。</p>
<p>次にプログラムは [2] を評価し、結果が true であれば [4] を実行、 false であればループを終了します。 [2] には<a href="http://www.game-create.com/archives/103">条件式</a>を書くことができます。また、 [4] の中から i を参照することで、現在何回目のループを実行しているかを取得することができます。</p>
<p>[4] の実行が終わった後は [3] を実行して次のループへ移るために最初へ戻ります。ただし、２回目のループ以降は [1] は実行されません。 [1] が実行されるのは一番最初にループに入ったときだけです。 [3] には次のループへ移るための計算式を書くことができますが、省略することもできます。たいていの場合 i++ となるはずです。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/397/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

