AI prompts
base on # tictactoe
A mobile game built in Flutter. You can find it published on stores:
- [App Store (iOS)](https://apps.apple.com/us/app/tic-tac-toe-puzzle-game/id1611729977)
- [Play Store (Android)](https://play.google.com/store/apps/details?id=dev.flutter.tictactoe)
This game was built using the [`game_template`](https://github.com/flutter/samples/tree/master/game_template)
that you'll find in [github.com/flutter/samples](https://github.com/flutter/samples).
Note: The name of the game in app stores is "Tic Tac Toe Puzzle Game". Because that's what it is,
and because every other variation of "Tic Tac Toe" is already taken.
## Demo
To make it easier for everyone to play with the sample, it's currently
published as a web demo, too, in two versions:
- a version [mimicking a phone][] in portrait mode even when you open the link on a desktop
- a version that [uses the whole browser window][]
[mimicking a phone]: https://filiph.github.io/tictactoe/mobile.html
[uses the whole browser window]: https://filiph.github.io/tictactoe/
## Development
To run the app in debug mode:
flutter run
### Code organization
Code is organized in a loose and shallow feature-first fashion.
In `lib/src`, you'll therefore find directories such as `ads`, `ai`, `audio`
or `main_menu`. Nothing fancy, but usable.
The state management approach is intentionally low-level. That way, it's easy to
take this project and run with it, without having to learn new paradigms, or having
to remember to run `flutter pub run build_runner watch`. You are,
of course, encouraged to use whatever paradigm, helper package or code generation
scheme to build on top of this project.
### Building for production
The following assumes using [FVM][]. Just remove `fvm` from the commands if you
don't use FVM for Flutter version management.
[FVM]: https://fvm.app/
To build and publish to github.io:
fvm flutter pub global run peanut \
--web-renderer canvaskit \
--extra-args "--base-href=/tictactoe/" \
&& git push origin --set-upstream gh-pages
To build the app for iOS (and open Xcode when finished):
fvm flutter build ipa --bundle-sksl-path warmup_2022-05-12_ios.sksl.json && open build/ios/archive/Runner.xcarchive
To build the app for Android (and open the folder with the bundle when finished):
fvm flutter build appbundle --bundle-sksl-path warmup_2024-01-30_android_pixel5.sksl.json && open build/app/outputs/bundle/release
#### SkSL shaders
To update the `warmup_2022-04-27_xxx.sksl.json` files used in the commands above,
use the official [SkSL shader warmup guide][].
[SkSL shader warmup guide]: https://docs.flutter.dev/perf/shader#how-to-use-sksl-warmup
The game, despite being simple, uses shaders all over the place for the "drawing ink"
effect. In my testing, the performance is fine on most reasonable devices,
but why not make it even better?
Note: You can remove the `--bundle-sksl-path warmup_xxx.json` part
of the commands above if you're in a place where you care more about
development speed than performance. For example, when you need a quick
turnaround for some testing and can't be bothered to manually
re-capture the shaders.
### Icon
Updating the launcher icon:
fvm flutter pub run flutter_launcher_icons
", Assign "at most 3 tags" to the expected json: {"id":"10013","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"