ODEã§å­¦ã¶C言語2 [Step3:switchæ–‡ã¨ã‚­ãƒ¼å‡¦ç†é–¢æ•°]

2010-07-02
By
step3サンプルプログラムã®å®Ÿè¡Œç”»é¢

step3サンプルプログラムã®å®Ÿè¡Œç”»é¢

Step2ã§for文を使ã£ãŸç¹°ã‚Šè¿”ã—ã‚’ç·´ç¿’ã—ãŸã®ã§ï¼Œã“ã“ã§ã¯switch文を使ã£ãŸã‚­ãƒ¼å‡¦ç†ã®æ–¹æ³•ã‚’å­¦ã³ã¾ã™ï¼Ž

ゲームãªã©ã§ã¯ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã§ãƒ¬ãƒ¼ã‚¶ãƒ¼ãƒ“ームを発射ã—ãŸã‚Šï¼Œè»Šã‚’æ“縦ã—ã¾ã™ã­ï¼Žã“ã“ã§ã‚‚,キーボードã‹ã‚‰ã®ã‚­ãƒ¼å…¥åŠ›ã‚’å‡¦ç†ã™ã‚‹æ–¹æ³•ã‚’å­¦ã³ã¾ã™ï¼Ž

switchæ–‡ã¨ã‚­ãƒ¼å‡¦ç†

æ–°ã—ã登場ã—ãŸã®ãŒ11行目ã®command関数ã§ã™ï¼Žã“れã¯ï¼Œã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã‹ã‚‰ã®ã‚­ãƒ¼å…¥åŠ›ã‚’å¼•æ•°cmdã¨ã—ã¦å—ã‘å–りã¾ã™ï¼Žã“ã®ã‚µãƒ³ãƒ—ルプログラムã§ã¯switch文を使ã„キー入力ã®å€¤ã«å¿œã˜ã¦åˆ†å²ã•ã›é•ã†å‡¦ç†ã‚’ã•ã›ã¦ã„ã¾ã™ï¼ŽzãŒå…¥åŠ›ã•れるã¨åˆæœŸä½ç½®ã®zæˆåˆ†ã‚’0.1m増加ã•ã›ã¾ã™ï¼Žã¤ã¾ã‚Šï¼Œzキーを押ã™ãŸã³ã«ç›´æ–¹ä½“全体ãŒä¸Šç©ºã¸ä¸ŠãŒã£ã¦ã„ãã¾ã™ï¼Žãã®ä¸‹ã®breakæ–‡ã¯å¿˜ã‚Œãªã„ã§ãã ã•ã„.ãã®ä»–ã®ã‚­ãƒ¼ã‚’入力ã™ã‚‹ã¨defaultã«ã‚ã‚‹”Input z key”ã¨ã„ã†æ–‡å­—列ãŒã‚³ãƒ³ã‚½ãƒ¼ãƒ«ç”»é¢ã«è¡¨ç¤ºã•れã¾ã™ï¼Ž

ãªãŠã€switchæ–‡ã®å¤‰ã‚りã«ifæ–‡ã§ã‚‚ã§ãã¾ã™ãŒã€ã‚­ãƒ¼å…¥åŠ›ãŒå¢—ãˆåˆ†å²ãŒå¤šããªã‚‹ã¨switchæ–‡ã®æ–¹ãŒã™ã£ãりã—ãŸèª­ã¿ã‚„ã™ã„プログラムを書ã‘ã¾ã™ã€‚

乱 数

ODEã¨ã¯é–¢ä¿‚ã‚りã¾ã›ã‚“ãŒä¹±æ•°ã‚‚登場ã—ã¾ã™ï¼Žä¹±æ•°ã‚’使ã†å ´åˆã¯”stdlib.h”をインクルードã—ã¾ã™ï¼Žã“ã“ã§ã¯time()関数も使ã£ã¦ã„ã‚‹ã®ã§”time.h”もインクルードã—ã¦ã„ã¾ã™ï¼Žä¹±æ•°ã‚’使用ã™ã‚‹å ´åˆã¯ã€ã¾ãšï¼Œmain関数ã®42行目ã«ã‚るよã†ã«ä¹±æ•°ã‚’åˆæœŸåŒ–ã—ã¾ã™ï¼Žãã®ãŸã‚ã«void srand(unsigned seed)関数を使ã„ã¾ã™ã€‚引数seedã¯ä¹±æ•°ã‚’発生ã•ã›ã‚‹ç¨®ã‚’入れã¾ã™ï¼ŽãれãŒåŒã˜å€¤ã®å ´åˆã¯ï¼Œå¸¸ã«åŒã˜ä¹±æ•°ç³»åˆ—ãŒç™ºç”Ÿã—ã¾ã™ï¼Žsrand(time(NULL))ã¯å®Ÿè¡Œæ™‚ã«ä¹±æ•°ã®ç¨®ã‚’変更ã™ã‚‹ä¸€èˆ¬çš„ãªæ–¹æ³•ã§ã™ï¼Ž

実際ã«ä¹±æ•°ã‚’発生ã•ã›ã¦ã„ã‚‹ã®ãŒsimLoop関数ã®30行目ã®rand関数ã§ã™ï¼Žrand関数ã®ãƒ—ロトタイプ宣言ã¯int rand(void)ãªã®ã§å¼•æ•°ã¯å–らãšï¼Œintåž‹ã®å€¤ã‚’è¿”ã—ã¾ã™ï¼ŽRAND_MAXã¯ä¹±æ•°ã®æœ€å¤§å€¤ãªã®ã§ï¼Œ30行目ã¯0以上1以下ã®ä¹±æ•°ã‚’発生ã•ã›ï¼Œãれを赤æˆåˆ†ã®å€¤ã«ä»£å…¥ã—ã¾ã™ï¼Žå¾“ã£ã¦ï¼Œè¡¨ç¤ºã•れã¦ã„る直方体(以下ボックスã¨è¡¨è¨˜ï¼‰ã®èµ¤æˆåˆ†ã®è‰²ã ã‘ãŒå¤‰ã‚ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ï¼Ž

今回ã¯ï¼’ã¤ã®ã“ã¨ã‚’å­¦ã³ã¾ã—ãŸï¼Žç‰¹ã«ä¹±æ•°ã¯ã‚²ãƒ¼ãƒ ã§ä½¿ã†ã¨éžå¸¸ã«é¢ç™½ã„ゲームã«ãªã‚‹ã®ã§ã—ã£ã‹ã‚Šè¦šãˆã¦ãŠãã¾ã—ょã†ï¼Ž

ã§ã‚€

/* step3 キー入力 switch文 */
#include "dm3.h"
#include <time.h>
#include <stdlib.h>

double R[12];  // 回転行列ã®è¦ç´ ãŒæ ¼ç´ã•れるé…列
double p[3] = {0.0, 0.0, 0.05};   // ä½ç½®(x,y,z)[m]
double sides[3] = {0.1, 0.1, 0.1}; // 直方体ã®ã‚µã‚¤ã‚º(x, y, z)[m]
double start_x = 0.0, start_y = 0.0, start_z = 0.0; // åˆæœŸä½ç½®

void command(int cmd)
{
    float xyz[3], hpr[3];
    switch (cmd) {
        case 'z':
            start_z += 0.1;
            break;
        default:
            printf("Input z key \n");
    }
}

void simLoop(int pause)        /***  シミュレーションループ ***/
{
  int i, j, num = 11;          // ç›´æ–¹ä½“ã®æ•°
  static float red = 0.0, green = 0.0, blue = 0.0; // èµ¤ï¼Œç·‘ï¼Œé’æˆåˆ†

  for (i = 0; i < num; i++) {
      for (j = 0; j < num; j++) {
        red = (float) rand()/RAND_MAX;   // 赤æˆåˆ†ã‚’ä¹±æ•°ã§æ±ºå®š
        dsSetColor(red, green, blue);    // 色ã®è¨­å®š
        p[0] = start_x;                  // ä½ç½®ã®xæˆåˆ†
        p[1] = i * 0.2 - 1.0  + start_y; // ä½ç½®ã®yæˆåˆ†
        p[2] = j * 0.2 + 0.05 + start_z; // ä½ç½®ã®zæˆåˆ†
        dsDrawBox(p,R,sides); // 直方体ã®è¡¨ç¤º
      }
  }
}

int main()         /*** main関数 ***/
{
  srand(time(NULL)); // 乱数ã®åˆæœŸåŒ–
 // ã‚¦ã‚¤ãƒ³ãƒ‰ã‚¦ã®æ¨ªï¼Œç¸¦ï¼Œã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³é–¢æ•°ï¼Œã‚³ãƒžãƒ³ãƒ‰é–¢æ•°
  dmLoop(800, 600, simLoop, command);
 return 0;

}

ホームワーク3

  1. step3-100702b.zipをダウンロードã—ã¦å®Ÿè¡Œã—よã†ï¼Ž
  2. jキーを押ã™ã¨å³ï¼Œfキーを押ã™ã¨å·¦ã«ãƒœãƒƒã‚¯ã‚¹å…¨ä½“ãŒç§»å‹•ã™ã‚‹ã‚ˆã†ã«ã—よã†ï¼Ž
  3. 3行(jã®å€¤ãŒï¼’)ã€ï¼”列(iã®å€¤ãŒï¼“)目ã®ãƒœãƒƒã‚¯ã‚¹ã ã‘をキーæ“作ã§x, y, zè»¸ã®æ­£è² æ–¹å‘ã¸ç§»å‹•ã§ãるよã†ã«ã—よã†ï¼Žã¤ã¾ã‚Šï¼Œï¼–個ã®ã‚­ãƒ¼ã‚’割り当ã¦ã‚‹ãªã‘れã°ã„ã‘ã¾ã›ã‚“.simLoop関数ã®ä¸­ã§if文を使ã†å¿…è¦ãŒã‚りã¾ã™ï¼Ž
  4. ã¾ãšã€ãƒœãƒƒã‚¯ã‚¹ã‚’å…¨ã¦ç™½è‰²ã«å¤‰æ›´ã—,乱数を使ã„1ã¤ã®ãƒœãƒƒã‚¯ã‚¹ã ã‘èµ¤è‰²ã«æç”»ã™ã‚‹ãƒ—ログラムを書ã“ã†ï¼Ž
  5. [発展å•題ã€ã€€ã¾ãšã€ãƒœãƒƒã‚¯ã‚¹ã‚’å…¨ã¦ç™½ã«ã—ã€ï¼™ã‹ã‚‰ï¼ã¾ã§ã®æ•°å­—を赤ã„ブロックを複数使ã„カウントダウン表示ã—よã†ã€‚ï¼ã‹ã‚‰ï¼™ã¾ã§ã®æ•°å­—を表示ã™ã‚‹éƒ¨åˆ†ã¯ãれãžã‚Œé–¢æ•°ã«ã™ã‚‹ã“ã¨ã€‚

コメントをã©ã†ãž

メールアドレスãŒå…¬é–‹ã•れるã“ã¨ã¯ã‚りã¾ã›ã‚“。

423 views  (Since 2010-08-11)