[M1 Mac, Monterey 12.6.3, clang 13.0.0, SDL 2.26.2, ChatGPT Plus, NO IDE]
テトリスでテトロミノが偏って生成しないようにするため、ワールドルールに従って7種類あるテトロミノ番号を程よく生成する関数を作成しました。
for文の作成にはChatGPTにも手伝ってもらいました。
書いていて気がつきましたが、配列内要素が残り1つになったらその数を自動的に戻り値にすればいいですね。CPUへの負荷も減ります。改良版として追記しておきます。
vector<int> arr;
int GeneratorCount;
int TetroTypeGenerator()
{
int tetroType;
if (GeneratorCount == 0){
arr = {0, 1, 2, 3, 4, 5, 6};
}
while(1){
tetroType = rand() % kNumTetrominoTypes;
if (arr.size() == 0){
arr = {0, 1, 2, 3, 4, 5, 6};
cout << "テトロミノ配列が空になったのでリセットしました" << endl;
}
for (auto it = arr.begin(); it != arr.end(); ) {
if (*it == tetroType) {
it = arr.erase(it);
cout << "tetroType: " << to_string(tetroType) << endl;
GeneratorCount++;
return tetroType;
} else {
it++;
}
}
}
}
tetroType: 2
tetroType: 4
tetroType: 1
tetroType: 0
tetroType: 3
tetroType: 5
tetroType: 6
テトロミノ配列が空になったのでリセットしました
tetroType: 6
tetroType: 2
tetroType: 1
tetroType: 5
tetroType: 4
tetroType: 0
tetroType: 3
テトロミノ配列が空になったのでリセットしました
tetroType: 5
tetroType: 3
tetroType: 0
以下、改良版
vector<int> arr;
int GeneratorCount;
int TetroTypeGenerator()
{
int tetroType;
if (GeneratorCount == 0){
arr = {0, 1, 2, 3, 4, 5, 6};
}
while(1){
tetroType = rand() % kNumTetrominoTypes;
if (arr.size() == 0){
arr = {0, 1, 2, 3, 4, 5, 6};
cout << "テトロミノ配列が空になったのでリセットしました" << endl;
} else if (arr.size() == 1){
tetroType = arr.front();
arr = {};
cout << "tetroType残り1: " << to_string(tetroType) << endl;
GeneratorCount++;
return tetroType;
}
for (auto it = arr.begin(); it != arr.end(); ) {
if (*it == tetroType) {
it = arr.erase(it);
cout << "tetroType: " << to_string(tetroType) << endl;
GeneratorCount++;
return tetroType;
} else {
it++;
}
}
}
}
tetroType: 2
tetroType: 4
tetroType: 0
tetroType: 3
tetroType: 1
tetroType: 5
tetroType残り1: 6
テトロミノ配列が空になったのでリセットしました
tetroType: 3
tetroType: 1
tetroType: 2
tetroType: 0
tetroType: 6
tetroType: 5
tetroType残り1: 4
テトロミノ配列が空になったのでリセットしました
tetroType: 1
tetroType: 2
tetroType: 3