質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

230閲覧

c# リストの配列が分からぬ

ryo76588

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/04/18 13:55

下のような感じでリスト作ってるんですがググってもうまい具合にシャッフルの機能を実装できず困っています。
助言お願いします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class cardGenerator : MonoBehaviour
{
public GameObject cardPrefab;//インスタンス化のための
public GameObject hand;//親にする要素指定

List<cardData> cardDataList = new List<cardData>() { new cardData(10,"ヤドラン","水鉄砲"), new cardData(1,"か","日"), new cardData(1,"1","1"), new cardData(1,"2","3"), }; void Start() { { for (int i = 0; i < cardDataList.Count; i++) { GameObject cardObj = Instantiate(cardPrefab);//生産 cardObj.transform.SetParent(hand.transform);//親指定 Card card = cardObj.GetComponent<Card>();//カードクラスのカード変数にスクリプト代入 Debug.Log(card == null); card.Load(cardDataList[i]); } } } private void Update() { if (Input.GetKeyDown(KeyCode.LeftShift)) { GameObject cardObj = Instantiate(cardPrefab);//生産 cardObj.transform.SetParent(hand.transform);//親指定 Card card = cardObj.GetComponent<Card>();//カードクラスのカード変数にスクリプト代入 Debug.Log(card == null); card.Load(cardDataList[0]); cardDataList.RemoveRange( 0, 1); if (Input.GetKeyDown(KeyCode.Space)) { Shuffle(cardDataList); } } } //リストの要素をシャッフルする (Fisher-Yates shuffle) public static void Shuffle<T>(List<T> list) { for (int i = list.Count - 1; i > 0; i--) { int j = Random.Range(0, i + 1); //[0]~[i] Swap(list, i, j); } } public static void Swap<T>(List<T> list, int i, int j) { T tmp = list[i]; list[i] = list[j]; list[j] = tmp; }

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2019/04/18 14:05

Shuffle(とSwap)だけ確認しましたが、シャッフルのところはそれなりにできているように思います。具体的にどういう結果を求めていて、現状どうなるかを書いていただけませんでしょうか?
ryo76588

2019/04/18 15:01

シャッフルとスワップのメソッド適当にコピペして持ってきただけで使い方が分からず適当にリストの引数を渡してみてみてもうまく動作することができず、というかまずリストをどのようにメソッドの引数として渡せばいいのかわからず困っておりこのプログラミングではどのように書けば動くようになるのか教えてほしいといったところです。
guest

回答2

0

papinianusさん、pepperleafさんがチェックしていただいた通り、シャッフル部分はちゃんと機能しているようでした。あとは、シャッフル機能が正しく実行されているかご確認いただく必要がありそうですね。
下記のようにしてみると、コンソールに意図通りのタイミングで「Shuffle」と表示されるでしょうか?

C#

1 //リストの要素をシャッフルする (Fisher-Yates shuffle) 2 public static void Shuffle<T>(List<T> list) 3 { 4 Debug.Log("Shuffle"); 5 for (int i = list.Count - 1; i > 0; i--) 6 { 7 int j = Random.Range(0, i + 1); //[0]~[i] 8 Swap(list, i, j); 9 } 10 }

私の試したところですと、シフトキーとスペースバーを同じタイミングで同時押ししないとシャッフルされませんでした。GetKeyDownはキーを離した状態から押し下げた状態に変わった最初の1フレームしかtrueになりませんので、このような挙動になったものと思われます。
たとえば下記のようにスペースバーの方をGetKeyに変えれば...

C#

1 private void Update() 2 { 3 if (Input.GetKeyDown(KeyCode.LeftShift)) 4 { 5 GameObject cardObj = Instantiate(cardPrefab);//生産 6 cardObj.transform.SetParent(hand.transform);//親指定 7 Card card = cardObj.GetComponent<Card>();//カードクラスのカード変数にスクリプト代入 8 Debug.Log(card == null); 9 card.Load(cardDataList[0]); 10 cardDataList.RemoveRange(0, 1); 11 12 // GetKeyDownをGetKeyに変更 13 if (Input.GetKey(KeyCode.Space)) 14 { 15 Shuffle(cardDataList); 16 } 17 } 18 }

まずスペースバーを押し下げておいて、その状態でシフトキーを押すとシャッフルが起こるようになりました。


※前回のご質問に引き続き「コードをタグでくくって...」とご指摘がありました。コードを貼り付けた部分の上下の行にバッククォート3つを入れてコード部分がそれらに挟まれるようにしてやると、投稿後の表示が読みやすくなってありがたいです(これがないと行頭の空白が削除されてしまい、コードの字下げがなくなって読みづらいのです...)。

マークダウン

投稿2019/04/18 21:01

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Unity 無いので、一部、入れ替えて、シャッフルの部分のみテストしましたが、それらしく動いているようですが、どこが問題なのでしょうか?

C#

1public static void Shuffle<T>(List<T> list) 2{ 3 var rnd = new Random(); // System.Random 4 for (int i = list.Count - 1; i > 0; i--) { 5 //int j = Random.Range(0, i + 1); //[0]~[i] 6 int j = rnd.Next(i + 1); //[0]~[i] 7 Swap(list, i, j); 8 } 9} 10

コードは、読みずらいので、コードタグで括ってください。

投稿2019/04/18 14:56

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問