dart
1import 'dart:math'as math; 2 3random(BuildContext context) { 4 var list = ['a', 'b', 'c', 'd']; 5 6 list.shuffle(); 7 8 print('$list'); 9 10 } 11``` クイズアプリを制作において、登録してある文章(文字列)を重複せずに順番に取り出したいです。 12あらかじめ登録してある文章(a,b,c,d…)をボタンを押すたびにランダムで取り出してテキストに表示させたいです。 13 14一斉にランダムで取り出す方法、重複を許して取り出す方法などはわかるのですが、ボタンを押すたびにテキストに重複せずにランダムで表示させる方法がわかりません… 登録してある文章がすべて表示されたら「終了」と表示させることができるとさらにありがたいです… 15 教えていただけたら幸いです!
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
こんな感じでどうでしょうか?
コピーしてDartPadで実行してみてください。
Dart
1import 'package:flutter/material.dart'; 2 3final Color darkBlue = Color.fromARGB(255, 18, 32, 47); 4 5void main() { 6 runApp(MyApp()); 7} 8 9class MyApp extends StatelessWidget { 10 @override 11 Widget build(BuildContext context) { 12 return MaterialApp( 13 theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue), 14 debugShowCheckedModeBanner: false, 15 home: Scaffold( 16 body: Center( 17 child: MyWidget(), 18 ), 19 ), 20 ); 21 } 22} 23 24class MyWidget extends StatefulWidget { 25 @override 26 _MyWidgetState createState() => _MyWidgetState(); 27} 28 29class _MyWidgetState extends State<MyWidget> { 30 bool _isEnd = false; 31 String _text = ""; 32 List<String> _quizzes = ["クイズ1", "クイズ2", "クイズ3", "クイズ4"]; 33 34 @override 35 void initState() { 36 super.initState(); 37 _random(); 38 } 39 40 @override 41 Widget build(BuildContext context) { 42 return Column( 43 mainAxisAlignment: MainAxisAlignment.center, 44 children: [ 45 _isEnd ? Text("終了") : Text(_text), 46 if (!_isEnd) RaisedButton( 47 child: Text("次へ"), 48 onPressed: _random, 49 ), 50 ], 51 ); 52 } 53 54 void _random() { 55 setState(() { 56 if (_quizzes.length > 0) { 57 _quizzes.shuffle(); 58 _text = _quizzes[0]; 59 _quizzes.removeAt(0); 60 } else { 61 _isEnd = true; 62 } 63 }); 64 } 65 66} 67
投稿2020/07/29 02:25
編集2020/07/29 02:33総合スコア419
0
僕はDart/Flutterは使った事がないのですが、文法は他の言語とそれほど大きく違わないようなので、とりあえず僕の想像できる範囲内で書いてみますね。(Dart/Flutterの文法とかプログラムの組み方で間違っている部分があるかもしれないので、鵜呑みにはせずにあくまで参考程度に!)
「重複を許容せずにランダムに取り出す」とは、次のような理解でよろしいでしょうか?
・A, B, C, Dの4つのテキストがあるとしたら、ランダムに取り出す回数は全部で4回。
・例えば、1回目にランダムに選ばれたのがBだとしたら、2回目はA, C, Dの3つの中からランダムに1つ選ぶ。2回目に選ばれたのがDだとしたら、3回目はA, Cのどちらかからランダムに1つ選ぶ、みたいな感じ。
だとしたら、既に選ばれたテキストは最初のリストから除外し、残ったリスト内のアイテムからランダムに選ぶ、というのをリスト内のアイテムがなくなるまで繰り返せばいいと思います。
例えば、
import 'dart:math'as math; random(BuildContext context) { var list = ['a', 'b', 'c', 'd']; var listOriginalLength = list.length; //元のリスト内のアイテムの数を記録しておく // リスト内にアイテムが残っている限り、その中からランダムに選び続ける for(int i = 0; i < listOriginalLength; i++){ print('ボタンを押してください'); // ここにユーザーにボタンを押させる動作を入れる。 // 僕の今の頭の中の情報ではどうやるかはわかりません if(list.length > 1){ list.shuffle(); } print(´$list[0]´); // シャッフルした後でリスト内の最初のテキストを表示 if(listOriginalLength > 0){ list.removeAt(0); // 選ばれたアイテムをリストから取り除く(次回以降の重複を防ぐため) } } print('終了'); }
みたいな感じになるでしょうか。
※注※
僕自身もまだエンジニアではなく勉強中の身なので、もっと知見がある方で僕のコードに間違いを見つけましたら指摘していただけると助かります。
投稿2020/07/28 19:12
編集2020/07/28 19:17総合スコア59
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/29 03:34
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/29 02:30
2020/07/29 02:33
2020/07/30 06:39