[C++] 250 SDL : テトロミノが偏って生成しないようにする Tetris

[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