Behind Coleus

大学生なのに特別大学で楽しいことが一 つもない。虐待と男子校病のせいにしてみる。→日本脱出しました 今ジャカルタにいます。→ジャカルタから帰ってきました。

最近必至こいて人生振り返っていますが、自殺しないので安心して下さい。

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


ターンエンドまでカードのステータスを上昇させる系のカードの実装方法を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() {
        if let Ok*1 = query.get(event.first_energy_id) {
            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 {
        // 選択肢を表示
        for (index, entity) in facedown_cards.cards.iter().enumerate() {
            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 remove_energy_boost_end_phase(
    query: Query<(Entity, &Card), With<EnergyBoost_EP>>, // EnergyBoost_EPを持つエンティティのクエリ
    mut commands: Commands,
) {
    for (entity, card) in query.iter(){
        commands.entity(entity).remove::<EnergyBoost_EP>();
        println!("{}エナジー増加効果が終了しました。", card.name)
    }
}

なんかデキネー!って思ってたら、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() {
        if let Ok*2 = query.get(event.first_energy_id) {
            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});
                    println!("{}エナジーが+{:?}されました。", card.name, energy_boost)
                }
                _ => {}
            }
        } 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 => {
                if let Ok*3 = query.get(event.first_energy_id) {
                    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,
                                });
                            println!("{}エナジーが+{:?}されました。", card.name, energy_boost)
                        }
                        _ => {}
                    }
                } else {
                    println!(
                        "指定されたEntity ID {:?} はカードではありません。または存在しません。",
                        event.first_energy_id
                    );
                }
            }
            Controller::Opponent => {
                if let Ok*4 = query.get(event.first_energy_id) {
                    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,
                                });
                            println!("{}エナジーが+{:?}されました。", card.name, energy_boost)
                        }
                        _ => {}
                    }
                } 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 {
        // 選択肢を表示
        for (index, entity) in facedown_cards.cards.iter().enumerate() {
            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 {
        // 選択肢を表示
        for (index, entity) in facedown_cards.cards.iter().enumerate() {
            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カードを選択してください:");
    for (index, entity) in facedown_cards.cards.iter().enumerate() {
        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の取得
        if let Ok*5 = query.get(event.first_energy_id) {
            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 });
                    println!("{}エナジーが+{:?}されました。", card.name, boost_amout);
                }
                _ => {}
            }
        } else {
            println!(
                "指定されたEntity ID {:?} はカードではありません。または存在しません。",
                event.first_energy_id
            );
        }
    }
}

まず名前をチェックするのがよい。

*1:card, option_energy_boost

*2:card, option_energy_boost

*3:card, option_energy_boost

*4:card, option_energy_boost

*5:card, option_energy_boost