場合の数と確率
場合の数
・数え上げの原則
・順列・組合せ
確率
・確率とその基本的な法則
*余事象,排反,期待値
・独立な試行と確率
・条件付き確率

ターンエンドまでカードのステータスを上昇させる系のカードの実装方法を1週間以上悩んでいたんだけど、GPTとの対話の中でついに思いついた。
エナジーを上げる効果を、boostというコンポーネントにして追加する。
それで、かーどのenergyを参照する際に、それら二つを足し合わせた値を取得する。
fn zyounetunoenazi(
facedown_cards: &Res<FacedownXZoneCards>,
mut x_skill_event_reader: EventReader<Xskill>,
mut open_event_writer: EventWriter<Open>,
query: Query<(&Card, Option<&EnergyBoost_EP>)>,
mut commands: Commands,
) {
for event in x_skill_event_reader.read() {
match card.name.as_str() {
let energy_boost = option_energy_boost.map_or(0, |energy_boost| energy_boost.boost_amount);
let chosen_entities = choose_entities_from_facedown_xzone(facedown_cards);
let x = chosen_entities.len() as i32;
for entity in chosen_entities{
commands.entity(entity).insert(FaceCondition::Open);
open_event_writer.send(Open { open_cards_id: entity });
}
let boost_amout:i32 = energy_boost + x;
commands.entity(event.first_energy_id).insert(EnergyBoost_EP{ boost_amount: boost_amout});
}
_ => {}
}
} else {
println!(
"指定されたEntity ID {:?} はカードではありません。または存在しません。",
event.first_energy_id
);
}
}
}
fn choose_entities_from_facedown_xzone(facedown_cards: &Res<FacedownXZoneCards>) -> Vec<Entity> {
let mut chosen_entities: Vec<Entity> = Vec::new(); // 選択されたEntityの配列を作成
println!("以下のFacedown XZoneカードを選択してください:");
loop {
// 選択肢を表示
println!("{}: {:?}", index + 1, entity);
}
println!("0: 選択を終了します。");
// ユーザーからの入力を受け付ける(数値を取得する方法)
let mut buffer = String::new();
io::stdin().read_line(&mut buffer).expect("入力エラー");
let trimmed = buffer.trim();
// 数値に変換を試みる
match trimmed.parse::<usize>() {
Ok(choice_index) => {
// 0が選ばれた場合は選択を終了できない
if choice_index == 0 {
if chosen_entities.is_empty() {
println!("少なくとも一つのカードを選択してください。"); // 選択されていない場合の警告
continue; // 再選択を促す
} else {
break; // 選択が1つ以上ある場合はループを終了
}
}
// 入力が有効な範囲かどうか確認
if choice_index > 0 && choice_index <= facedown_cards.cards.len() {
let chosen_entity = facedown_cards.cards[choice_index - 1]; // 選択されたEntity ID
// 確認プロンプトを表示
println!("{:?} を選択しました。これでよろしいですか?", chosen_entity);
if check_the_will_of_open_cards() == 1 {
chosen_entities.push(chosen_entity); // 選択確定として配列に追加
} else {
println!("再度選択してください。");
}
} else {
println!("無効な数字です。再度選択してください。");
}
}
Err(_) => {
println!("無効な入力です。再度選択してください。");
}
}
}
chosen_entities // 最終的に選ばれたEntityの配列を返す
}
これいったろ!!
これをエンドフェイズに呼び出せばいいの
なんかデキネー!って思ってたら、pub fn になってなかった。
&Resの引数を取ったら関数の登録が出来なくて困ったけど、
&を消して関数内部の引数に&を付けたら、治った。
意味は分からん。
pub fn zyounetunoenazi(
facedown_cards: Res<FacedownXZoneCards>,
mut x_skill_event_reader: EventReader<Xskill>,
mut open_event_writer: EventWriter<Open>,
query: Query<(&Card, Option<&EnergyBoost_EP>)>,
mut commands: Commands,
) {
for event in x_skill_event_reader.read() {
match card.name.as_str() {
let energy_boost = option_energy_boost.map_or(0, |energy_boost| energy_boost.boost_amount);
let chosen_entities = choose_entities_from_facedown_xzone(&facedown_cards);
let x = chosen_entities.len() as i32;
for entity in chosen_entities{
commands.entity(entity).insert(FaceCondition::Open);
open_event_writer.send(Open { open_cards_id: entity });
}
let boost_amout:i32 = energy_boost + x;
commands.entity(event.first_energy_id).insert(EnergyBoost_EP{ boost_amount: boost_amout});
}
_ => {}
}
} else {
println!(
"指定されたEntity ID {:?} はカードではありません。または存在しません。",
event.first_energy_id
);
}
}
}

これ相手のXゾーン開いてるわー
match controller.get() {
Controller::Opponent => {
next_turn_player.set(Controller::Player);
}
Controller::Player => {
next_turn_player.set(Controller::Opponent);
}
}
これみたいにコントローラーで場合分けしないとだめ
pub fn zyounetunoenazi(
facedown_cards: Res<FacedownXZoneCards>,
facedown_cards_opponent: Res<FacedownXZoneCardsOpponent>,
mut x_skill_event_reader: EventReader<Xskill>,
mut open_event_writer: EventWriter<Open>,
query: Query<(&Card, Option<&EnergyBoost_EP>)>,
mut commands: Commands,
controller: Res<State<Controller>>,
) {
for event in x_skill_event_reader.read() {
match controller.get() {
Controller::Player => {
match card.name.as_str() {
let energy_boost = option_energy_boost
.map_or(0, |energy_boost| energy_boost.boost_amount);
let chosen_entities =
choose_entities_from_facedown_xzone(&facedown_cards);
let x = chosen_entities.len() as i32;
for entity in chosen_entities {
commands.entity(entity).insert(FaceCondition::Open);
open_event_writer.send(Open {
open_cards_id: entity,
});
}
let boost_amout: i32 = energy_boost + x;
commands
.entity(event.first_energy_id)
.insert(EnergyBoost_EP {
boost_amount: boost_amout,
});
}
_ => {}
}
} else {
println!(
"指定されたEntity ID {:?} はカードではありません。または存在しません。",
event.first_energy_id
);
}
}
Controller::Opponent => {
match card.name.as_str() {
let energy_boost = option_energy_boost
.map_or(0, |energy_boost| energy_boost.boost_amount);
let chosen_entities =
choose_entities_from_facedown_xzone_opponent(&facedown_cards_opponent);
let x = chosen_entities.len() as i32;
for entity in chosen_entities {
commands.entity(entity).insert(FaceCondition::Open);
open_event_writer.send(Open {
open_cards_id: entity,
});
}
let boost_amout: i32 = energy_boost + x;
commands
.entity(event.first_energy_id)
.insert(EnergyBoost_EP {
boost_amount: boost_amout,
});
}
_ => {}
}
} else {
println!(
"指定されたEntity ID {:?} はカードではありません。または存在しません。",
event.first_energy_id
);
}
}
}
}
}
fn choose_entities_from_facedown_xzone(facedown_cards: &Res<FacedownXZoneCards>) -> Vec<Entity> {
let mut chosen_entities: Vec<Entity> = Vec::new(); // 選択されたEntityの配列を作成
println!("以下のFacedown XZoneカードを選択してください:");
loop {
// 選択肢を表示
println!("{}: {:?}", index + 1, entity);
}
println!("0: 選択を終了します。");
// ユーザーからの入力を受け付ける(数値を取得する方法)
let mut buffer = String::new();
io::stdin().read_line(&mut buffer).expect("入力エラー");
let trimmed = buffer.trim();
// 数値に変換を試みる
match trimmed.parse::<usize>() {
Ok(choice_index) => {
// 0が選ばれた場合は選択を終了できない
if choice_index == 0 {
if chosen_entities.is_empty() {
println!("少なくとも一つのカードを選択してください。"); // 選択されていない場合の警告
continue; // 再選択を促す
} else {
break; // 選択が1つ以上ある場合はループを終了
}
}
// 入力が有効な範囲かどうか確認
if choice_index > 0 && choice_index <= facedown_cards.cards.len() {
let chosen_entity = facedown_cards.cards[choice_index - 1]; // 選択されたEntity ID
// 確認プロンプトを表示
println!("{:?} を選択しました。これでよろしいですか?", chosen_entity);
if check_the_will_of_open_cards() == 1 {
chosen_entities.push(chosen_entity); // 選択確定として配列に追加
} else {
println!("再度選択してください。");
}
} else {
println!("無効な数字です。再度選択してください。");
}
}
Err(_) => {
println!("無効な入力です。再度選択してください。");
}
}
}
chosen_entities // 最終的に選ばれたEntityの配列を返す
}
fn choose_entities_from_facedown_xzone_opponent(facedown_cards: &Res<FacedownXZoneCardsOpponent>) -> Vec<Entity> {
let mut chosen_entities: Vec<Entity> = Vec::new(); // 選択されたEntityの配列を作成
println!("以下のFacedown XZoneカードを選択してください:");
loop {
// 選択肢を表示
println!("{}: {:?}", index + 1, entity);
}
println!("0: 選択を終了します。");
// ユーザーからの入力を受け付ける(数値を取得する方法)
let mut buffer = String::new();
io::stdin().read_line(&mut buffer).expect("入力エラー");
let trimmed = buffer.trim();
// 数値に変換を試みる
match trimmed.parse::<usize>() {
Ok(choice_index) => {
// 0が選ばれた場合は選択を終了できない
if choice_index == 0 {
if chosen_entities.is_empty() {
println!("少なくとも一つのカードを選択してください。"); // 選択されていない場合の警告
continue; // 再選択を促す
} else {
break; // 選択が1つ以上ある場合はループを終了
}
}
// 入力が有効な範囲かどうか確認
if choice_index > 0 && choice_index <= facedown_cards.cards.len() {
let chosen_entity = facedown_cards.cards[choice_index - 1]; // 選択されたEntity ID
// 確認プロンプトを表示
println!("{:?} を選択しました。これでよろしいですか?", chosen_entity);
if check_the_will_of_open_cards() == 1 {
chosen_entities.push(chosen_entity); // 選択確定として配列に追加
} else {
println!("再度選択してください。");
}
} else {
println!("無効な数字です。再度選択してください。");
}
}
Err(_) => {
println!("無効な入力です。再度選択してください。");
}
}
}
chosen_entities // 最終的に選ばれたEntityの配列を返す
}

来たけど、これさっき重複で、選べてしまったので、重複しないように直す。あと、選択を終了します。
イキました!!

fn choose_entities_from_facedown_xzone(facedown_cards: &Res<FacedownXZoneCards>) -> Vec<Entity> {
let mut chosen_entities: Vec<Entity> = Vec::new(); // 選択されたEntityの配列を作成
println!("以下のFacedown XZoneカードを選択してください:");
println!("{}: {:?}", index + 1, entity);
}
loop {
println!("1-{}: カードを選択 0: 選択を終了します。", facedown_cards.cards.len());
// 選択肢を表示
// ユーザーからの入力を受け付ける(数値を取得する方法)
let mut buffer = String::new();
io::stdin().read_line(&mut buffer).expect("入力エラー");
let trimmed = buffer.trim();
// 数値に変換を試みる
match trimmed.parse::<usize>() {
Ok(choice_index) => {
// 0が選ばれた場合は選択を終了できない
if choice_index == 0 {
if chosen_entities.is_empty() {
println!("少なくとも一つのカードを選択してください。"); // 選択されていない場合の警告
continue; // 再選択を促す
} else {
break; // 選択が1つ以上ある場合はループを終了
}
}
// 入力が有効な範囲かどうか確認
if choice_index > 0 && choice_index <= facedown_cards.cards.len() {
let chosen_entity = facedown_cards.cards[choice_index - 1]; // 選択されたEntity ID
if chosen_entities.contains(&chosen_entity) {
println!(
"{:?} はすでに選択されています。再度選択してください。",
chosen_entity
);
continue; // 再選択を促す
}
// 確認プロンプトを表示
println!("{:?} を選択しました。これでよろしいですか?", chosen_entity);
if check_the_will_of_open_cards() == 1 {
chosen_entities.push(chosen_entity); // 選択確定として配列に追加
} else {
println!("再度選択してください。");
}
} else {
println!("無効な数字です。再度選択してください。");
}
}
Err(_) => {
println!("無効な入力です。再度選択してください。");
}
}
}
chosen_entities // 最終的に選ばれたEntityの配列を返す
}
コードが冗長だったので、先に変更します。
pub fn zyounetunoenazi(
facedown_cards: Res<FacedownXZoneCards>,
facedown_cards_opponent: Res<FacedownXZoneCardsOpponent>,
mut x_skill_event_reader: EventReader<Xskill>,
mut open_event_writer: EventWriter<Open>,
query: Query<(&Card, Option<&EnergyBoost_EP>)>,
mut commands: Commands,
controller: Res<State<Controller>>,
) {
for event in x_skill_event_reader.read() {
// Cardの取得
match card.name.as_str() {
let energy_boost = option_energy_boost
.map_or(0, |energy_boost| energy_boost.boost_amount);
let chosen_entities = match controller.get() {
Controller::Player => choose_entities_from_facedown_xzone(&facedown_cards),
Controller::Opponent => choose_entities_from_facedown_xzone_opponent(&facedown_cards_opponent),
};
let x = chosen_entities.len() as i32;
println!("{:?}枚のカードを選びました。", x);
for entity in chosen_entities {
commands.entity(entity).insert(FaceCondition::Open);
open_event_writer.send(Open { open_cards_id: entity });
println!("{:?}をオープンしました。", entity);
}
let boost_amout: i32 = energy_boost + x;
commands.entity(event.first_energy_id).insert(EnergyBoost_EP { boost_amount: boost_amout });
}
_ => {}
}
} else {
println!(
"指定されたEntity ID {:?} はカードではありません。または存在しません。",
event.first_energy_id
);
}
}
}
まず名前をチェックするのがよい。