パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

Flutter DartのサンプルプログラムがAI?からマスターマインドまで

2025-02-23 | 新規1000万人ぐらいにプログラムをマスターしてもらいたい

Dartを手軽にマスターしようとコドゲのテストを受けようとしたら

3年少し前に100点取っていた うーん何にも覚えていない

Flutterに使うということを当時はまったく知らないでやっていたのだろう ChatGPTもまだ、なかったのではないだろうか

 

しょうがないので

 

昨日作成したmyappを少し変えてみる

まずピクセルアート変換というものをやってみる

ソースはChatGPTで作成したのかな?

実は表示までデバックにそこそこ時間がかかっている

理由は画像を使うのに

pubspec.yaml に色々と設定しないといけないらしく、いろいろ教えてもらう

あとassets imagesフォルダーを作成して画像ファイルを入れる(フォルダー名とかはサンプルソースに合わせてます)

やる内容によってここに設定して

今回追加したのは33、34、61、62行

 

そして反映させてから動かす

そしてぼかしたのがこちら

ソースリスト lib内のmain.dart

 

import 'dart:ui';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Stack(
          children: [
            // ローカル画像を背景に設定
            Positioned.fill(
              child: Image.asset(
                'assets/images/background.jpg', // ローカル画像を指定
                fit: BoxFit.cover,
              ),
            ),
            // ぼかしフィルタ
            Positioned.fill(
              child: BackdropFilter(
                filter: ImageFilter.blur(sigmaX: 10, sigmaY: 10), // ぼかしの強さ
                child: Container(
                  color: Colors.white.withOpacity(0.2), // 半透明の白
                ),
              ),
            ),
            // テキストを表示
            Center(
              child: Text(
                'Frosted Glass Effect',
                style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

 

Dartのサイトでも学習しようとこんなもの見つける

なんとか裏にボールを送り込もうしたけど、画面が縦長すぎて難しく断念

 

なんとサンプルプログラムでAIも動かせる

APIキーというのを取得して設定すると動く

ここでもFlutterでマスターマインドを作ってもらうが、ここのコードはコピペできなかったので

写経して実行 真っ赤になって怒られ(エラーがでて)カッコのあとのカンマとかセミコロンとか今ひとつわからず挫折

(画面はあとから「Python教えて」で実行したもの)

 

どうにもバグが取れなかったので、ChatGPTさんに作ってもらったので遊んでみる

同じ色使えるというのはちょっと難しい

 

こちらはlib内のmain.dartを変更するだけで動きました

 

ソースリスト

 

import 'dart:math';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MastermindGame(),
    );
  }
}

class MastermindGame extends StatefulWidget {
  @override
  _MastermindGameState createState() => _MastermindGameState();
}

class _MastermindGameState extends State {
  final List colors = [Colors.red, Colors.blue, Colors.green, Colors.yellow, Colors.purple, Colors.orange];
  late List secretCode;
  List guesses = [];
  List feedbacks = [];
  List currentGuess = [-1, -1, -1, -1];

  @override
  void initState() {
    super.initState();
    _generateSecretCode();
  }

  void _generateSecretCode() {
    Random random = Random();
    secretCode = List.generate(4, (_) => random.nextInt(colors.length));
    print("Secret Code: $secretCode"); // デバッグ用
  }

  void _checkGuess() {
    if (currentGuess.contains(-1)) return; // 未選択の場合は無視

    int correctPosition = 0;
    int correctColor = 0;
    List secretTemp = List.from(secretCode);
    List guessTemp = List.from(currentGuess);

    for (int i = 0; i < 4; i++) {
      if (guessTemp[i] == secretTemp[i]) {
        correctPosition++;
        secretTemp[i] = -1;
        guessTemp[i] = -2;
      }
    }

    for (int i = 0; i < 4; i++) {
      if (secretTemp.contains(guessTemp[i])) {
        correctColor++;
        secretTemp[secretTemp.indexOf(guessTemp[i])] = -1;
      }
    }

    setState(() {
      guesses.add(List.from(currentGuess));
      feedbacks.add([correctPosition, correctColor]);
      currentGuess = [-1, -1, -1, -1]; // 初期化
    });

    if (correctPosition == 4) {
      _showResultDialog(true);
    } else if (guesses.length >= 10) {
      _showResultDialog(false);
    }
  }

  void _showResultDialog(bool isWin) {
    showDialog(
      context: context,
      builder: (_) => AlertDialog(
        title: Text(isWin ? "You Win!" : "Game Over"),
        content: Text("Answer: ${secretCode.map((i) => colors[i])}"),
        actions: [
          TextButton(
            onPressed: () {
              Navigator.pop(context);
              setState(() {
                guesses.clear();
                feedbacks.clear();
                _generateSecretCode();
              });
            },
            child: const Text("Restart"),
          ),
        ],
      ),
    );
  }

  Widget _buildGuessRow(List guess, List feedback) {
    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceBetween,
      children: [
        Row(
          children: guess.map((i) => _buildColorCircle(colors[i])).toList(),
        ),
        Text("⚫ ${feedback[0]}  ⚪ ${feedback[1]}"),
      ],
    );
  }

  Widget _buildColorCircle(Color color, {VoidCallback? onTap}) {
    return GestureDetector(
      onTap: onTap,
      child: Container(
        margin: const EdgeInsets.all(4),
        width: 40,
        height: 40,
        decoration: BoxDecoration(shape: BoxShape.circle, color: color, border: Border.all(color: Colors.black)),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("Mastermind")),
      body: Column(
        children: [
          Expanded(
            child: ListView.builder(
              itemCount: guesses.length,
              itemBuilder: (context, index) => _buildGuessRow(guesses[index], feedbacks[index]),
            ),
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: List.generate(4, (index) {
              return _buildColorCircle(
                currentGuess[index] == -1 ? Colors.grey : colors[currentGuess[index]],
                onTap: () {
                  setState(() {
                    currentGuess[index] = (currentGuess[index] + 1) % colors.length;
                  });
                },
              );
            }),
          ),
          const SizedBox(height: 10),
          ElevatedButton(
            onPressed: _checkGuess,
            child: const Text("Check Guess"),
          ),
        ],
      ),
    );
  }
}

 


最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。