ODEã§å¦ã¶C言語2 [Step3:switchæ–‡ã¨ã‚ー処ç†é–¢æ•°]
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
- step3-100702b.zipをダウンãƒãƒ¼ãƒ‰ã—ã¦å®Ÿè¡Œã—よã†ï¼Ž
- jã‚ーを押ã™ã¨å³ï¼Œfã‚ーを押ã™ã¨å·¦ã«ãƒœãƒƒã‚¯ã‚¹å…¨ä½“ãŒç§»å‹•ã™ã‚‹ã‚ˆã†ã«ã—よã†ï¼Ž
- 3行(jã®å€¤ãŒï¼’)ã€ï¼”列(iã®å€¤ãŒï¼“)目ã®ãƒœãƒƒã‚¯ã‚¹ã ã‘ã‚’ã‚ーæ“作ã§x, y, zè»¸ã®æ£è² æ–¹å‘ã¸ç§»å‹•ã§ãるよã†ã«ã—よã†ï¼Žã¤ã¾ã‚Šï¼Œï¼–個ã®ã‚ーを割り当ã¦ã‚‹ãªã‘れã°ã„ã‘ã¾ã›ã‚“.simLoop関数ã®ä¸ã§if文を使ã†å¿…è¦ãŒã‚りã¾ã™ï¼Ž
- ã¾ãšã€ãƒœãƒƒã‚¯ã‚¹ã‚’å…¨ã¦ç™½è‰²ã«å¤‰æ›´ã—,乱数を使ã„1ã¤ã®ãƒœãƒƒã‚¯ã‚¹ã ã‘èµ¤è‰²ã«æç”»ã™ã‚‹ãƒ—ãƒã‚°ãƒ©ãƒ を書ã“ã†ï¼Ž
- [発展å•題ã€ã€€ã¾ãšã€ãƒœãƒƒã‚¯ã‚¹ã‚’å…¨ã¦ç™½ã«ã—ã€ï¼™ã‹ã‚‰ï¼ã¾ã§ã®æ•°å—を赤ã„ブãƒãƒƒã‚¯ã‚’複数使ã„カウントダウン表示ã—よã†ã€‚ï¼ã‹ã‚‰ï¼™ã¾ã§ã®æ•°å—を表示ã™ã‚‹éƒ¨åˆ†ã¯ãれãžã‚Œé–¢æ•°ã«ã™ã‚‹ã“ã¨ã€‚
