VBAで組み合わせソフトを作り、スイスドローマッチングの階段処理に困っています

このQ&Aのポイント
  • VBAで組み合わせソフトを作り、スイスドローマッチングの階段処理に困っています。スイスドローは同じ勝利数の人同士が対戦するようになっていますが、1勝の人と0勝の人が対戦する組み合わせが必ず発生します。現在の方法では階段の処理がうまく行えず、解決策を探しています。
  • 質問者はVBAで組み合わせソフトを作り、スイスドローマッチングの階段処理に困っています。スイスドローでは同じ勝利数の人同士が対戦するため、1勝の人と0勝の人が対戦する組み合わせが必要です。しかし、現在の処理方法では階段をうまく処理できず、解決策を模索しています。
  • VBAを使用してスイスドローの組み合わせソフトを作成している質問者は、階段の処理に問題があります。スイスドローでは同じ勝利数の人同士が対戦するため、1勝の人と0勝の人が対戦する組み合わせが必要です。現在の方法では階段の処理がスムーズに行われず、解決策を模索しています。
回答を見る
  • ベストアンサー

VBAで組み合わせソフトを作ろうとしています

VBAで、様々な大会のためのスイスドローマッチングツールを作ろうとしています。 今困っているのはスイスドローの大会で必ず発生する階段の処理です。 スイスドローは同じ勝利数の人同士が対戦するようになっていますが、例えば1回戦を終えた時点で1勝の人が奇数人しかいない場合があります。 その場合、1勝の人と0勝の人が対戦する組み合わせが1組発生します。 現在は勝利数ごとに対戦の組み合わせを作り、作った後でそれらを統合して一つのペアリングシートにして印刷、張り出しています。 しかし勝利数ごとに参加者を分けて組み合わせているため、この階段の処理をうまく行うことができません。 どうにかして階段の処理を滞りなく行いたいのですが、どのような処理を行えばよいでしょうか。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ap_2
  • ベストアンサー率64% (70/109)
回答No.2

ANo.1をベースに処理を考えると、(2),(3)の部分で 出場者ごとに「勝利数をベースに乱数を加えたスコア」を計算し、そのスコアでソートします。 例1) スコア = 勝利数 + Rnd(乱数:1未満) 例2) スコア = 勝利数*10000 + レート(4桁) + Rnd(乱数0~1未満) 例3) スコア = 勝利数*10000 + レート(4桁) + 登録順/100(1未満) 1勝のスコアが2勝を上回らなければ、どんな計算でも構いません。不規則に結果が変わるのが嫌なら、レーティングなどの情報を用います(例2,3:レートが同じ場合は乱数や登録順で調整)。 ・・・という感じでしょうか。

ranran912
質問者

お礼

ありがとうございます。

その他の回答 (1)

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

VBA はわからないんですが、Excel でやるとしてこんな感じでできませんか? (1)出場者リスト(勝利数記録欄つき)をシートとして用意しておく (2)マッチング開始時に上記シートを複製してマッチングリストシートにする (3)マッチングリストシートを勝利数で降順ソートする (4)マッチングリストシートで同一勝利数の選手をランダムに入れ替える (5)マッチングリストシートを上から2名ずつ読み、その2人をマッチングさせる (6)対戦が終わったら出場者リストの勝利者の勝利数記録欄を+1する (7)そのラウンドのすべての対戦が終わったら(2)へ

ranran912
質問者

お礼

ありがとうございます。

関連するQ&A

  • テニス大会の組合せの作り方・その2

    先程テニス大会の組合せの作り方を質問し、matumotokさんから条件が合わないとの答えを頂きました。有難うございます。そこで改めてお尋ねします。 次のような条件のテニス大会の組合せの作り方を教えてください。 1.参加者は、10名で、各自ダブルスを4試合します。 2.ペアは、その都度、異なる人と組みます。 3.対戦相手は、出来るだけ異なる組合せとして、同じ対戦相手は2回までとします。 以上のような条件で、組合せの作り方を教えてください。よろしくお願いします。

  • 4人5組の組み合わせに困っています。計算法ってありますか?

    実は麻雀大会の幹事になってしまい困っています 20人を5卓に分け6回戦やりたいのですが、同じ人と対戦しないように組み合わせをしたいのです でもうまく組み合わせ出来ません。 もし計算方法があれば教えてください 出来れば3回同じ人とは、あたらないようにしたいのです。 よろしくお願いします

  • テニス大会の組合せの作り方

    仲間内のテニス大会の幹事をしています。 以下の条件の組合せの作り方を教えてください。 1.参加者は10名で、各自4試合します。 2.ペアはその都度変えて、同じ人とは2度は組みません。 3.相手もその都度変えて、同じ相手とは2度は対戦しません。 以上です。よろしくお願いします。

  • 場合の数 基礎

     柔軟な頭を持ち合わせておらずどうも理解ができません。    A,B2つの野球チームがシリーズ優勝を決めるため対戦をすることとなった。  シリーズ優勝は7試合中先に4勝したチームのものとなる。  いま、第1戦が終了しBチームが勝利した。この場合、A,Bチームが優勝するパターンは  それぞれ何通りあるか、ただし引き分けはないものとする。  という問いです。  1試合終了しているので3勝したものが勝ちですよね、  という事は残り6試合中、勝利した3試合を選ぶ、  6P3 で6×5×4=120試合、  そのうち、3試合の順番の試合の組み合わせ、3×2×1、  この組み合わせというのはどういう意味合いなのでしょうか。  また、選んだ120試合から3試合の順番の組み合わせで割る、  その意味合いがいまいち理解できません。  わかりやすくご教授いただければ幸いです、よろしくお願いします。    

  • 計算の方法がわかりません。教えてください。

    算数が全く苦手なので、次の問題について教えてください。 ●前提 ・Aは100万円持っています。 ・別表1に示す一定の勝敗確率で運用します。 ・別表2に示す同じ幅の利益又は損失が発生します。 別表1(勝敗確率) (A)勝ち80%対負け20%である (B)勝ち70%対負け30%である (C)勝ち60%対負け40%である (D)勝ち50%対負け50%である (E)勝ち40%対負け60%である 別表2(損益幅) (あ)損益幅は25万円である (い)損益幅は20万円である (う)損益幅は10万円である (え)損益幅は5万円である (お)損益幅は2万円である 上記の、それぞれの組み合わせの場合で、100万円分の「ドローダウン」が生じる発生確率、といったものを計算したいのです。 計算式と答えを教えてください。 なお、ドローダウンというのは、損益の発生履歴曲線を描いたときに、直近の一番高い値からの下落幅のことを言います。 例えば、(A)勝率80%と、(お)損益幅2%の組み合わせであるときに、少なくとも20連敗すれば100万円のドローダウンが生じます。また、19連敗のあと1勝してその後2連敗しても100万円分のドローダウンが生じます。 これは微分とか積分とかいう計算で算出するのでしょうか、なにぶん数学は高校1年生のとき以来やってないので微分とか積分が何なのかすら知りません。 質問にわかりにくい箇所、不十分な箇所があればご指摘ください。 よろしくお願い致します。

  • C#のループについて

    現在C#でジャンケンゲームの課題に取り組んでいるのですが、ループ処理や各メソッドに対しての変数にエラーがでてしまい、修正方法が分からず、どなたか教えて頂けないでしょうか? ・ユーザはグー、チョキ、パーをそれぞれ1、2、3の数字で入力する。 ・CPUは乱数を使って出す手を選ぶ。 ・5回勝負として、人間とコンピュータの勝った回数を数え、勝敗がつくたびに1回ずつ表示する。    あいこは決着がつくまで再勝負。途中でどちらかが3勝しても、5回最後まで勝負を続ける。   ・指定された範囲以外の値を入力したら負けにする 【実行例】  ユーザ名を入力してください:goto  手を入力してください(グー1、チョキ2、パー3): 1  CPU:チョキ  WIN  goto:1勝、CPU:0勝    手を入力してください(グー1、チョキ2、パー3): 3  CPU:パー  DRAW    手を入力してください(グー1、チョキ2、パー3): 3  CPU:チョキ  LOSE  goto:1勝、CPU:1勝    手を入力してください(グー1、チョキ2、パー3): 0  LOSE(反則負け)  goto:1勝、CPU:2勝    (中略)    goto:3勝、CPU:2勝  gotoさんの総合勝利です! using System; namespace Ensyuu007 { static class Program { static string? Myhand; static int CntWin = 0; //勝利回数 static int CntLose = 0; //敗北回数 static int CntDraw = 0; //引分回数 //ユーザー名の入力 static void Main(string[] args) { string EnterName = Console.ReadLine(); Console.WriteLine("ユーザ名を入力してください: {0}", EnterName); Console.ReadLine(); } //じゃんけんを5回行います。 for (int GameCnt = 0; GameCnt <= 5; GameCnt++) { //正しく入力されたかチェックを行うメソッド。 static string Check(ref string Myhand) { static = Console.ReadLine(); Console.WriteLine("手を入力してください(グー1、チョキ2、パー3):{0}", Myhand); //正しく入力されたかチェックします。 Check(ref Myhand); //0,1,2が入力された場合 if (Myhand.Equals("1") || Myhand.Equals("2") || Myhand.Equals("3")) { //入力した数字をそのまま返します。 return Myhand; } //1,2,3以外が入力された場合 else { Console.WriteLine("LOSE(反則負け)"); return Myhand; } } //じゃんけんを開始するメソッド。 static void Start() { //コンピューターとじゃんけんさせます。 Janken(ref Myhand); Console.ReadLine(); } //コンピュータと自分の入力した手を判別するメソッド static void Janken(ref string Myhand) { // Random クラスの新しいインスタンスを生成する Random ran = new System.Random(); //コンピュータの出す手を1以上3以下に設定する。 string[] com = new string[] { "1", "2", "3" }; string con = ran.Next(3).ToString(); //配列型、変数teに出す名前を設定 string[] te = { "グー", "チョキ", "パー" }; //コンピュータが勝利した場合 if (((Myhand == "1") && (con == "3")) || ((Myhand == "2") && (con == "1")) || ((Myhand == "3") && (con == "0"))) { Console.WriteLine("あなた:" + te.GetValue(int.Parse(Myhand))); Console.WriteLine("コンピュータ:" + te.GetValue(int.Parse(con))); Console.WriteLine("LOSE"); CntLose++; //敗北回数に加算 } //自分が勝利した場合 else if (((Myhand == "1") && (con == "2")) || ((Myhand == "2") && (con == "3")) || ((Myhand == "3") && (con == "1"))) { Console.WriteLine("あなた:" + te.GetValue(int.Parse(Myhand))); Console.WriteLine("コンピュータ:" + te.GetValue(int.Parse(con))); Console.WriteLine("WIN"); CntWin++; //勝利回数に加算 } //あいこだった場合 else { Console.WriteLine("あなた:" + te.GetValue(int.Parse(Myhand))); Console.WriteLine("コンピュータ:" + te.GetValue(int.Parse(con))); Console.WriteLine("DRAW"); CntDraw++; //引分回数に加算 } } } static void Resurut() { if (CntWin > CntLose) { Console.WriteLine("総合勝利です"); } else if (CntLose < CntWin) { Console.WriteLine("CPUの総合勝利です"); }

  • テニス大会ダブルスの乱数表の作成をお願いしたい

    テニス大会開催のため、プレーヤーの組み合わせに乱数表を使うことになり、過去の質問・回答を検索しテニス乱数表の作成法を2件見つけたのですが、1件は同じプレーヤーの組み合わせ(ペア)が複数組できてしまい、もう1件は一人当たりのゲーム数が同数にならない(一定の試合数で、ある人は2ゲーム、ある人は5ゲームなどバラつきが出る)ことがわかりました。 そこで以下の条件で乱数表の作成をお願いしたいのですが。 1.1日で完了するダブルスのテニス大会 2.参加者(プレーヤー)は、10-30人程度 3.コートは2面を並行使用の予定なので、一人が同時に2面に入らない 4.全員が一人あたり4ゲーム行う 5.全員が4ゲームともそれぞれ別の人とペアを組む(同じペアを複数回作らない) 6.対戦相手はそれ以前のゲームと同じ人でも構わない(5.があるので同じペアとの再戦はない) よろしくお願いします。

  • 組合せVBA

    環境はExcel2002です A列に連番数字1から100が入力されていて B列の100行には数字のデータがあるとします ある目的の数値Xに一番近くなるB列の組合せをC列に表示したいのです…VBAで B列に表示するのはA列の連番です 『一番近くなる』の意味は2通りあって、両方の算出方法をご教示願います (1)目的の数値Xを絶対超えないで目的の数値Xに一番近くなる組合せ (2)目的の数値Xを必ず超えて目的の数値Xに一番近くなる組合せ

  • 大富豪(カードゲーム)の攻略法

     トランプのカードゲームで大富豪があると思います。  オンラインでこのゲームをしているのですが、なかなか勝つのが難しいです。  そこそこ対戦数はしているし、当然ルールは熟知しています。そこのサイトでは4人でするのですが、最終ポイントで上位二人が勝ちとなります。  ルールが地方などにより違いがあると思いますので、大まかに表記すると、 1)2だけ(複数でも)、8だけ(複数でも)、ジョーカーを含む組み合わせでのあがりはNG 2)8(複数でも)だけを出すと場が流れて、その人から始まる 3)4枚以上(同じ数または階段、ジョーカーを含む)を出すと革命 4)革命時は3だけ(複数でも)、8だけ(複数でも)のあがりはNG、2はOK などです。  上級のテクニックがあれば教えてください。

  • お子さんが出られないとどうですか?(少年スポーツ団)

    息子(小2)がサッカーをやっております。父親です。 スポーツカテではなくあえてこちらでお聞きします。 団の方針は勝利至上主義ではなく、大人になってもサッカーを楽しめると言う方針で、 メンバーを決めずに練習試合などは上手い下手関係なくほぼ全員が同じ時間出場しております。(上級生でも練習試合などはそうです。時間は違いますが) 試合もフォーメーションも決めず、ラグビーのモールのような団子サッカーで、みんながボール行く(行ってしまう?)サッカーです。 私自身の考えは、みんなが試合に出て少しでも上手くなれば、中高学年になって強くなるのでと言う考えですが、 今度2年生唯一の公式戦があります。(クラブ主催の大会は他にもありますが) これは市内全部のチームが参加する大会で、当然翌年以降前年の成績で組み合わせ(シード権など)が決まります。 上位になればその後強いチームと対戦できる機会が生まれてきます。 コーチはその大会は上手い子を中心に勝ちに行きたいようですが、今はみんな均等に出れるので親も応援に来ますが、 ある意味チーム方針と異なりみんな楽しくではなくなります。 異論など出るのでしょうか? またこういう場合、事前にコーチから「出れない子が出るかもしれない」などと説明は要るものなのでしょうか?(して欲しいものでしょうか?) 私自身の経験では、上手い子が出て、そうでない子は出れないなどは普通の事で、 なんとも思わないのですが、方針と違うなどで揉めたりするのも・・・ ちなみに中学年から大会などは出れない子も出てきます。(特にトーナメントは) また我が子は中心選手の1人でもあるので、公式戦は勝つのが当たり前、上手い子中心と思っているだけかもしれません。 皆さんのお考えをお聞かせください。

専門家に質問してみよう