トップページ > 記事閲覧
7種1巡のランダム法則を作りたい
名前:PP 日時: 2021/04/16 20:32

dxlibでテトリスを作っているんですけど、出てくるブロックの種類の法則で「7種1巡」(7種類のブロックをセットにしたときにセットごとにランダムな順番で降ってくる) というのがあるんですけど、そのコードが全然分かりません。 なので、下の簡単なコードでランダムな値が代入されるa〜gの数値がかぶらないようにする方法を教えてください。 #include "DxLib.h" int a = 0, b = 0, c = 0, d = 0, e = 0, f = 0, g = 0; int time = 0; int r = 0; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ChangeWindowMode(TRUE); SRand(GetNowCount()); if (DxLib_Init() == 1) return -1; while (!ProcessMessage()) { SetDrawScreen(DX_SCREEN_BACK); ClearDrawScreen(); r = GetRand(6) + 1; time++; if (time == 1)a = r; if (time == 2)b = r; if (time == 3)c = r; if (time == 4)d = r; if (time == 5)e = r; if (time == 6)f = r; if (time == 7)g = r; DrawFormatString(0, 0, GetColor(255, 255, 255), "%d %d %d %d %d %d %d",a,b,c,d,e,f,g); ScreenFlip(); } DxLib_End(); return 0; }
メンテ

Page: 1 |

Re: 7種1巡のランダム法則を作りたい ( No.1 )
名前:管理人 日時:2021/04/18 01:33

既に排出したブロックを記録しておいて、7個全部排出するまで同じ種類のブロックを 排出しないようにすれば「7種1巡」が実現できます ( 下記のサンプルでは既に排出したブロックの番号を UseBlockNo配列に記録して、 同じブロックが出力されないようにするための処理に使用しています ) #include "DxLib.h" int UseBlockNoNum = 0 ; int UseBlockNo[ 7 ] ; int a = 0, b = 0, c = 0, d = 0, e = 0, f = 0, g = 0; int time = 0; int r = 0; int GetBlockNo() { int i, RandBlockNo ; // 既に 7 つ出力していたらエラー if( UseBlockNoNum >= 7 ) { return -1 ; } do { // ランダムなブロック番号を取得 RandBlockNo = GetRand( 6 ) + 1 ; // 既に使われたブロック番号だったら do 〜 while ループから抜けられない // ( 既に使われていたブロック番号だった場合は i が UseBlockNoNum になる前に for ループを抜けてしまうため ) for( i = 0 ; i < UseBlockNoNum && UseBlockNo[ i ] != RandBlockNo ; i ++ ){} }while( i != UseBlockNoNum ) ; // 使用したブロック番号を保存 UseBlockNo[ UseBlockNoNum ] = RandBlockNo ; // 使用したブロック番号の数を増やす UseBlockNoNum ++ ; // ランダムなブロック番号を返す return UseBlockNo [ UseBlockNoNum - 1 ] ; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ChangeWindowMode(TRUE); SRand(GetNowCount()); if (DxLib_Init() == 1) return -1; while (!ProcessMessage()) { SetDrawScreen(DX_SCREEN_BACK); ClearDrawScreen(); time++; if (time == 1)a = GetBlockNo(); if (time == 2)b = GetBlockNo(); if (time == 3)c = GetBlockNo(); if (time == 4)d = GetBlockNo(); if (time == 5)e = GetBlockNo(); if (time == 6)f = GetBlockNo(); if (time == 7)g = GetBlockNo(); DrawFormatString(0, 0, GetColor(255, 255, 255), "%d %d %d %d %d %d %d",a,b,c,d,e,f,g); ScreenFlip(); } DxLib_End(); return 0; }
メンテ
Re: 7種1巡のランダム法則を作りたい ( No.2 )
名前:通りすがり 日時:2021/04/19 11:45

単に,7種の値を要素に持つ配列か何かを用意してランダムシャッフルすれば良いだけなのでは?
メンテ
Re: 7種1巡のランダム法則を作りたい ( No.3 )
名前:PP(解決) 日時:2021/04/19 19:46

管理人さん教えていただき本当にありがとうございました。 これで何とか7種1巡が作れそうです。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存