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"),
),
],
),
);
}
}