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

2009-06-16
By


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

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

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

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

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

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

乱 数

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);  // シミュレーションループ ウインドウã®å¹…,高
  return 0;
}

ホームワーク3

  1. step3-090619.zipをダウンロードã—ã¦å®Ÿè¡Œã—よã†ï¼
  2. jキーを押ã™ã¨å³ï¼Œfキーを押ã™ã¨å·¦ã«ãƒœãƒƒã‚¯ã‚¹å…¨ä½“ãŒç§»å‹•ã™ã‚‹ã‚ˆã†ã«ã—よã†ï¼Ž
  3. forループã®iãŒï¼’, jãŒï¼“ã®å ´åˆã«è¡¨ç¤ºã•れるボックスã ã‘をキーæ“作ã§ç§»å‹•ã§ãるよã†ã«ã—よã†ï¼ŽsimLoop関数ã®ä¸­ã§if文を使ã†å¿…è¦ãŒã‚りã¾ã™ï¼ˆã‚„ã‚ã†ã¨æ€ãˆã°switchæ–‡ã§ã‚‚ã§ãã¾ã™ãŒï¼Žï¼‰
  4. ボックスを白色ã«å¤‰æ›´ã—,乱数を使ã„1ã¤ã®ãƒœãƒƒã‚¯ã‚¹ã ã‘èµ¤è‰²ã«æç”»ã™ã‚‹ãƒ—ログラムを書ã“ã†ï¼Ž

コメントをã©ã†ãž

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

2,316 views  (Since 2010-08-11)