Skip to content

Instantly share code, notes, and snippets.

@alectogeek
Last active December 7, 2021 21:38
Show Gist options
  • Save alectogeek/192bdc9783f9ee031ff4b9a41dfc3de0 to your computer and use it in GitHub Desktop.
Save alectogeek/192bdc9783f9ee031ff4b9a41dfc3de0 to your computer and use it in GitHub Desktop.

Revisions

  1. alectogeek revised this gist Dec 7, 2021. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion main.dart
    Original file line number Diff line number Diff line change
    @@ -114,7 +114,7 @@ class _MyHomePageState extends State<MyHomePage> {
    final TextEditingController _bidEditingController =
    TextEditingController(text: '10');
    final TextEditingController _userBalanceEditingController =
    TextEditingController(text: '100000');
    TextEditingController(text: '10000');
    final TextEditingController _casinoBalanceEditingController =
    TextEditingController(text: '100000000000');

  2. alectogeek revised this gist Dec 7, 2021. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion main.dart
    Original file line number Diff line number Diff line change
    @@ -102,7 +102,7 @@ class MyHomePage extends StatefulWidget {
    class _MyHomePageState extends State<MyHomePage> {
    bool isCalculating = false;
    int casinoBalance = 100000000000;
    int userBalance = 100000;
    int userBalance = 10000;
    int bid = 10;
    int bidIncrease = 0;
    int playTimes = 1;
  3. alectogeek revised this gist Dec 7, 2021. 1 changed file with 86 additions and 156 deletions.
    242 changes: 86 additions & 156 deletions main.dart
    Original file line number Diff line number Diff line change
    @@ -1,12 +1,51 @@
    import 'dart:math';

    import 'package:flutter/cupertino.dart';
    import 'package:flutter/foundation.dart';
    import 'package:flutter/material.dart';
    import 'package:charts_flutter/flutter.dart' as charts;

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

    LoopCalculationResults runLoopGame(
    LoopCalculationInput input
    ) {
    List<ChartItem> chartLogs = [];
    int sessionDifference = 0;


    int userBalance = input.userBalance;
    int casinoBalance = input.casinoBalance;
    int actualBid = input.actualBid;
    int bidIncrease = input.bidIncrease;
    int playTimes = input.playTimes;

    for (int i = 0; i < playTimes; i++) {
    final bool didWin = Random.secure().nextBool();
    if (didWin) {
    userBalance = userBalance + actualBid;
    casinoBalance = casinoBalance - actualBid;
    sessionDifference += actualBid;

    chartLogs.add(ChartItem(i, userBalance, actualBid));
    } else {
    userBalance = userBalance - actualBid;
    casinoBalance = casinoBalance + actualBid;
    sessionDifference -= actualBid;
    chartLogs.add(ChartItem(i, userBalance, -actualBid));
    }
    actualBid += bidIncrease;
    }
    return LoopCalculationResults(
    userBalance,
    casinoBalance,
    actualBid,
    sessionDifference,
    chartLogs,
    );
    }

    class ChartItem {
    ChartItem(this.index, this.value, this.delta);

    @@ -15,6 +54,27 @@ class ChartItem {
    final int delta;
    }

    class LoopCalculationInput {
    final int userBalance;
    final int casinoBalance;
    final int actualBid;
    final int bidIncrease;
    final int playTimes;

    LoopCalculationInput(this.userBalance, this.casinoBalance, this.actualBid, this.bidIncrease, this.playTimes);
    }

    class LoopCalculationResults {

    final int userBalance;
    final int casinoBalance;
    final int actualBid;
    final int sessionDifference;
    final List<ChartItem> chartLogs;

    LoopCalculationResults(this.userBalance, this.casinoBalance, this.actualBid, this.sessionDifference, this.chartLogs);
    }

    class MyApp extends StatelessWidget {
    const MyApp({Key? key}) : super(key: key);

    @@ -40,6 +100,7 @@ class MyHomePage extends StatefulWidget {
    }

    class _MyHomePageState extends State<MyHomePage> {
    bool isCalculating = false;
    int casinoBalance = 100000000000;
    int userBalance = 100000;
    int bid = 10;
    @@ -57,27 +118,25 @@ class _MyHomePageState extends State<MyHomePage> {
    final TextEditingController _casinoBalanceEditingController =
    TextEditingController(text: '100000000000');

    void runGame() {
    int sessionDifference = 0;
    void runGame() async {

    int actualBid = bid;

    setState(() {
    isCalculating = true;
    });

    chartLogs.clear();

    for (int i = 0; i < playTimes; i++) {
    final bool didWin = Random().nextInt(2) == 1;
    if (didWin) {
    userBalance = userBalance + actualBid;
    casinoBalance = casinoBalance - actualBid;
    sessionDifference += actualBid;

    chartLogs.add(ChartItem(i, casinoBalance, actualBid));
    } else {
    userBalance = userBalance - actualBid;
    casinoBalance = casinoBalance + actualBid;
    sessionDifference -= actualBid;
    chartLogs.add(ChartItem(i, casinoBalance, -actualBid));
    }
    actualBid += bidIncrease;
    }
    // final LoopCalculationResults results = runLoopGame(userBalance, casinoBalance, actualBid, bidIncrease, playTimes);
    final input = LoopCalculationInput(userBalance, casinoBalance, actualBid, bidIncrease, playTimes);
    final LoopCalculationResults results = await compute(runLoopGame, input);

    actualBid = results.actualBid;
    casinoBalance = results.casinoBalance;
    userBalance = results.userBalance;
    int sessionDifference = results.sessionDifference;
    chartLogs = results.chartLogs;

    _userBalanceEditingController.text = userBalance.toString();
    _casinoBalanceEditingController.text = casinoBalance.toString();
    @@ -91,6 +150,7 @@ class _MyHomePageState extends State<MyHomePage> {
    setState(() {
    bid = actualBid;
    _bidEditingController.text = actualBid.toString();
    isCalculating = false;
    });

    Future<void>.delayed(Duration(milliseconds: 50)).then((value) {
    @@ -102,24 +162,7 @@ class _MyHomePageState extends State<MyHomePage> {

    @override
    Widget build(BuildContext context) {
    List<charts.Series<ChartItem, num>> series = [
    charts.Series(
    id: "Баланс казино",
    data: chartLogs,
    domainFn: (ChartItem series, _) => series.index,
    measureFn: (ChartItem series, _) => series.value,
    // measureLowerBoundFn: (ChartItem series, _) => min(chartLogs.first.value, chartLogs.last.value),
    // measureUpperBoundFn: (ChartItem series, _) => max(chartLogs.first.value, chartLogs.last.value),
    colorFn: (ChartItem series, _) =>
    const charts.Color(r: 0, b: 255, g: 0)
    // (series.delta == 0
    // ? charts.Color(r: 0, b: 255, g: 0)
    // : series.delta > 0
    // ? const charts.Color(r: 255, b: 0, g: 0)
    // : const charts.Color(r: 0, b: 0, g: 255)
    // ),
    )
    ];

    return Scaffold(
    appBar: AppBar(
    title: Text(widget.title),
    @@ -269,34 +312,6 @@ class _MyHomePageState extends State<MyHomePage> {
    margin: const EdgeInsets.only(top: 10, left: 10),
    child: Column(
    children: [
    Expanded(
    child: chartLogs.isEmpty ? Text('Нет данных для отображения') : charts.LineChart(
    series,
    domainAxis: charts.NumericAxisSpec(
    tickProviderSpec:
    charts.BasicNumericTickProviderSpec(
    zeroBound: false,
    ),
    viewport: charts.NumericExtents(0, playTimes),
    ),
    primaryMeasureAxis: charts.NumericAxisSpec(
    tickProviderSpec:
    charts.BasicNumericTickProviderSpec(
    zeroBound: false,
    ),
    // tickFormatterSpec:
    // charts.BasicNumericTickFormatterSpec(
    // (measure) =>
    // exp(measure!).round().toString(),
    // ),
    viewport: charts.NumericExtents(
    chartLogs.map((e) => e.value).reduce(min),
    chartLogs.map((e) => e.value).reduce(max),
    ),
    ),
    animate: true,
    ),
    ),
    Expanded(
    child: ListView.builder(
    // reverse: true,
    @@ -333,47 +348,6 @@ class _MyHomePageState extends State<MyHomePage> {
    children: [
    Column(
    children: [
    Container(
    height: 50,
    width: 250,
    child: TextFormField(
    initialValue: '1',
    style: TextStyle(
    fontSize: 22,
    fontWeight: FontWeight.w400,
    height: 1.41,
    color: Color(0xFF14151F),
    decoration: TextDecoration.none,
    ),
    autovalidateMode: AutovalidateMode.disabled,
    onEditingComplete: () {},
    decoration: const InputDecoration(
    labelText: 'Количество игр',
    labelStyle: TextStyle(
    fontSize: 20,
    fontWeight: FontWeight.w400,
    height: 1.41,
    color: Color(0xFF9698A9),
    decoration: TextDecoration.none,
    ),
    isDense: true,
    alignLabelWithHint: true,
    border: UnderlineInputBorder(
    borderSide: BorderSide(
    color: Color(0xFFECF0F3), width: 1),
    borderRadius: BorderRadius.zero),
    ),
    textCapitalization: TextCapitalization.words,
    onChanged: (value) {
    if (int.tryParse(value) != null) {
    playTimes = int.tryParse(value)!;
    }
    },
    validator: (value) {
    return null;
    },
    ),
    ),
    SizedBox(height: 20),
    Container(
    height: 50,
    @@ -418,53 +392,7 @@ class _MyHomePageState extends State<MyHomePage> {
    ),
    ],
    ),
    const SizedBox(width: 40),
    Column(
    children: [
    Container(
    height: 50,
    width: 250,
    child: TextFormField(
    initialValue: '0',
    style: TextStyle(
    fontSize: 22,
    fontWeight: FontWeight.w400,
    height: 1.41,
    color: Color(0xFF14151F),
    decoration: TextDecoration.none,
    ),
    autovalidateMode: AutovalidateMode.disabled,
    onEditingComplete: () {},
    decoration: const InputDecoration(
    labelText:
    'Размер увеличения ставки после каждой игры',
    labelStyle: TextStyle(
    fontSize: 20,
    fontWeight: FontWeight.w400,
    height: 1.41,
    color: Color(0xFF9698A9),
    decoration: TextDecoration.none,
    ),
    isDense: true,
    alignLabelWithHint: true,
    border: UnderlineInputBorder(
    borderSide: BorderSide(
    color: Color(0xFFECF0F3), width: 1),
    borderRadius: BorderRadius.zero),
    ),
    textCapitalization: TextCapitalization.words,
    onChanged: (value) {
    if (int.tryParse(value) != null) {
    bidIncrease = int.tryParse(value)!;
    }
    },
    validator: (value) {
    return null;
    },
    ),
    ),
    ],
    )

    ],
    ),
    ),
    @@ -474,11 +402,13 @@ class _MyHomePageState extends State<MyHomePage> {
    ),
    ),
    floatingActionButton: FloatingActionButton(
    backgroundColor: isCalculating ? Colors.grey : null,
    onPressed: () {
    runGame();
    if (!isCalculating) {
    runGame();
    }
    },
    tooltip: 'Increment',
    child: Text('Play'),
    child: isCalculating ? CupertinoActivityIndicator() : Text('Play'),
    ),
    );
    }
  4. alectogeek revised this gist Dec 5, 2021. 1 changed file with 90 additions and 21 deletions.
    111 changes: 90 additions & 21 deletions main.dart
    Original file line number Diff line number Diff line change
    @@ -1,11 +1,20 @@
    import 'dart:math';

    import 'package:flutter/material.dart';
    import 'package:charts_flutter/flutter.dart' as charts;

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

    class ChartItem {
    ChartItem(this.index, this.value, this.delta);

    final int index;
    final int value;
    final int delta;
    }

    class MyApp extends StatelessWidget {
    const MyApp({Key? key}) : super(key: key);

    @@ -38,35 +47,41 @@ class _MyHomePageState extends State<MyHomePage> {
    int playTimes = 1;

    List<String> logs = [];
    List<ChartItem> chartLogs = [];

    final ScrollController _scrollController = ScrollController();
    TextEditingController _bidEditingController = TextEditingController(text: '10');
    TextEditingController _userBalanceEditingController = TextEditingController(text: '100000');
    TextEditingController _casinoBalanceEditingController = TextEditingController(text: '100000000000');
    final TextEditingController _bidEditingController =
    TextEditingController(text: '10');
    final TextEditingController _userBalanceEditingController =
    TextEditingController(text: '100000');
    final TextEditingController _casinoBalanceEditingController =
    TextEditingController(text: '100000000000');

    void runGame() {
    int sessionDifference = 0;
    int actualBid = bid;
    chartLogs.clear();

    for (int i = 0; i < playTimes; i++) {
    final bool didWin = Random().nextInt(2) == 1;
    if (didWin) {
    setState(() {
    userBalance = userBalance + actualBid;
    casinoBalance = casinoBalance - actualBid;
    sessionDifference+=actualBid;
    });
    userBalance = userBalance + actualBid;
    casinoBalance = casinoBalance - actualBid;
    sessionDifference += actualBid;

    chartLogs.add(ChartItem(i, casinoBalance, actualBid));
    } else {
    userBalance = userBalance - actualBid;
    casinoBalance = casinoBalance + actualBid;
    sessionDifference-=actualBid;
    sessionDifference -= actualBid;
    chartLogs.add(ChartItem(i, casinoBalance, -actualBid));
    }
    actualBid += bidIncrease;
    }

    _userBalanceEditingController.text = userBalance.toString();
    _casinoBalanceEditingController.text = casinoBalance.toString();


    if (sessionDifference >= 0) {
    logs.add('Игрок выиграл: +$sessionDifference, игр: $playTimes');
    } else {
    @@ -87,6 +102,24 @@ class _MyHomePageState extends State<MyHomePage> {

    @override
    Widget build(BuildContext context) {
    List<charts.Series<ChartItem, num>> series = [
    charts.Series(
    id: "Баланс казино",
    data: chartLogs,
    domainFn: (ChartItem series, _) => series.index,
    measureFn: (ChartItem series, _) => series.value,
    // measureLowerBoundFn: (ChartItem series, _) => min(chartLogs.first.value, chartLogs.last.value),
    // measureUpperBoundFn: (ChartItem series, _) => max(chartLogs.first.value, chartLogs.last.value),
    colorFn: (ChartItem series, _) =>
    const charts.Color(r: 0, b: 255, g: 0)
    // (series.delta == 0
    // ? charts.Color(r: 0, b: 255, g: 0)
    // : series.delta > 0
    // ? const charts.Color(r: 255, b: 0, g: 0)
    // : const charts.Color(r: 0, b: 0, g: 255)
    // ),
    )
    ];
    return Scaffold(
    appBar: AppBar(
    title: Text(widget.title),
    @@ -115,7 +148,8 @@ class _MyHomePageState extends State<MyHomePage> {
    boxShadow: [
    BoxShadow(
    offset: const Offset(0, 16),
    color: const Color(0xFF0A0A5C).withOpacity(0.08),
    color:
    const Color(0xFF0A0A5C).withOpacity(0.08),
    blurRadius: 40,
    spreadRadius: -12,
    )
    @@ -172,7 +206,8 @@ class _MyHomePageState extends State<MyHomePage> {
    boxShadow: [
    BoxShadow(
    offset: const Offset(0, 16),
    color: const Color(0xFF0A0A5C).withOpacity(0.08),
    color:
    const Color(0xFF0A0A5C).withOpacity(0.08),
    blurRadius: 40,
    spreadRadius: -12,
    )
    @@ -232,13 +267,47 @@ class _MyHomePageState extends State<MyHomePage> {
    Expanded(
    child: Container(
    margin: const EdgeInsets.only(top: 10, left: 10),
    child: ListView.builder(
    // reverse: true,
    controller: _scrollController,
    itemCount: logs.length,
    itemBuilder: (context, index) {
    return Text(logs[index]);
    },
    child: Column(
    children: [
    Expanded(
    child: chartLogs.isEmpty ? Text('Нет данных для отображения') : charts.LineChart(
    series,
    domainAxis: charts.NumericAxisSpec(
    tickProviderSpec:
    charts.BasicNumericTickProviderSpec(
    zeroBound: false,
    ),
    viewport: charts.NumericExtents(0, playTimes),
    ),
    primaryMeasureAxis: charts.NumericAxisSpec(
    tickProviderSpec:
    charts.BasicNumericTickProviderSpec(
    zeroBound: false,
    ),
    // tickFormatterSpec:
    // charts.BasicNumericTickFormatterSpec(
    // (measure) =>
    // exp(measure!).round().toString(),
    // ),
    viewport: charts.NumericExtents(
    chartLogs.map((e) => e.value).reduce(min),
    chartLogs.map((e) => e.value).reduce(max),
    ),
    ),
    animate: true,
    ),
    ),
    Expanded(
    child: ListView.builder(
    // reverse: true,
    controller: _scrollController,
    itemCount: logs.length,
    itemBuilder: (context, index) {
    return Text(logs[index]);
    },
    ),
    ),
    ],
    ),
    ),
    )
    @@ -367,7 +436,8 @@ class _MyHomePageState extends State<MyHomePage> {
    autovalidateMode: AutovalidateMode.disabled,
    onEditingComplete: () {},
    decoration: const InputDecoration(
    labelText: 'Размер увеличения ставки после каждой игры',
    labelText:
    'Размер увеличения ставки после каждой игры',
    labelStyle: TextStyle(
    fontSize: 20,
    fontWeight: FontWeight.w400,
    @@ -393,7 +463,6 @@ class _MyHomePageState extends State<MyHomePage> {
    },
    ),
    ),

    ],
    )
    ],
  5. alectogeek revised this gist Dec 5, 2021. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions main.dart
    Original file line number Diff line number Diff line change
    @@ -31,7 +31,7 @@ class MyHomePage extends StatefulWidget {
    }

    class _MyHomePageState extends State<MyHomePage> {
    int casinoBalance = 100000;
    int casinoBalance = 100000000000;
    int userBalance = 100000;
    int bid = 10;
    int bidIncrease = 0;
    @@ -41,7 +41,7 @@ class _MyHomePageState extends State<MyHomePage> {
    final ScrollController _scrollController = ScrollController();
    TextEditingController _bidEditingController = TextEditingController(text: '10');
    TextEditingController _userBalanceEditingController = TextEditingController(text: '100000');
    TextEditingController _casinoBalanceEditingController = TextEditingController(text: '100000');
    TextEditingController _casinoBalanceEditingController = TextEditingController(text: '100000000000');

    void runGame() {
    int sessionDifference = 0;
  6. alectogeek revised this gist Dec 5, 2021. 1 changed file with 102 additions and 98 deletions.
    200 changes: 102 additions & 98 deletions main.dart
    Original file line number Diff line number Diff line change
    @@ -39,7 +39,9 @@ class _MyHomePageState extends State<MyHomePage> {

    List<String> logs = [];
    final ScrollController _scrollController = ScrollController();
    TextEditingController _textEditingController = TextEditingController(text: '10');
    TextEditingController _bidEditingController = TextEditingController(text: '10');
    TextEditingController _userBalanceEditingController = TextEditingController(text: '100000');
    TextEditingController _casinoBalanceEditingController = TextEditingController(text: '100000');

    void runGame() {
    int sessionDifference = 0;
    @@ -60,15 +62,20 @@ class _MyHomePageState extends State<MyHomePage> {
    }
    actualBid += bidIncrease;
    }

    _userBalanceEditingController.text = userBalance.toString();
    _casinoBalanceEditingController.text = casinoBalance.toString();


    if (sessionDifference >= 0) {
    logs.add('Игрок выиграл: +$sessionDifference');
    logs.add('Игрок выиграл: +$sessionDifference, игр: $playTimes');
    } else {
    logs.add('Игрок проиграл: $sessionDifference');
    logs.add('Игрок проиграл: $sessionDifference, игр: $playTimes');
    }

    setState(() {
    bid = actualBid;
    _textEditingController.text = actualBid.toString();
    _bidEditingController.text = actualBid.toString();
    });

    Future<void>.delayed(Duration(milliseconds: 50)).then((value) {
    @@ -114,9 +121,50 @@ class _MyHomePageState extends State<MyHomePage> {
    )
    ],
    ),
    child: Text('Баланс казино: ${userBalance}'),
    child: Container(
    height: 50,
    width: 250,
    child: TextFormField(
    controller: _casinoBalanceEditingController,
    // initialValue: casinoBalance.toString(),
    style: TextStyle(
    fontSize: 22,
    fontWeight: FontWeight.w400,
    height: 1.41,
    color: Color(0xFF14151F),
    decoration: TextDecoration.none,
    ),
    autovalidateMode: AutovalidateMode.disabled,
    onEditingComplete: () {},
    decoration: const InputDecoration(
    labelText: 'Баланс казино',
    labelStyle: TextStyle(
    fontSize: 20,
    fontWeight: FontWeight.w400,
    height: 1.41,
    color: Color(0xFF9698A9),
    decoration: TextDecoration.none,
    ),
    isDense: true,
    alignLabelWithHint: true,
    border: UnderlineInputBorder(
    borderSide: BorderSide(
    color: Color(0xFFECF0F3), width: 1),
    borderRadius: BorderRadius.zero),
    ),
    textCapitalization: TextCapitalization.words,
    onChanged: (value) {
    if (int.tryParse(value) != null) {
    casinoBalance = int.tryParse(value)!;
    }
    },
    validator: (value) {
    return null;
    },
    ),
    ),
    ),
    const SizedBox(height: 50),
    const SizedBox(height: 10),
    Container(
    padding: const EdgeInsets.all(20),
    decoration: BoxDecoration(
    @@ -130,7 +178,48 @@ class _MyHomePageState extends State<MyHomePage> {
    )
    ],
    ),
    child: Text('Баланс участника: ${casinoBalance}'),
    child: Container(
    height: 50,
    width: 250,
    child: TextFormField(
    controller: _userBalanceEditingController,
    // initialValue: userBalance.toString(),
    style: TextStyle(
    fontSize: 22,
    fontWeight: FontWeight.w400,
    height: 1.41,
    color: Color(0xFF14151F),
    decoration: TextDecoration.none,
    ),
    autovalidateMode: AutovalidateMode.disabled,
    onEditingComplete: () {},
    decoration: const InputDecoration(
    labelText: 'Баланс игрока',
    labelStyle: TextStyle(
    fontSize: 20,
    fontWeight: FontWeight.w400,
    height: 1.41,
    color: Color(0xFF9698A9),
    decoration: TextDecoration.none,
    ),
    isDense: true,
    alignLabelWithHint: true,
    border: UnderlineInputBorder(
    borderSide: BorderSide(
    color: Color(0xFFECF0F3), width: 1),
    borderRadius: BorderRadius.zero),
    ),
    textCapitalization: TextCapitalization.words,
    onChanged: (value) {
    if (int.tryParse(value) != null) {
    userBalance = int.tryParse(value)!;
    }
    },
    validator: (value) {
    return null;
    },
    ),
    ),
    ),
    ],
    ),
    @@ -175,95 +264,6 @@ class _MyHomePageState extends State<MyHomePage> {
    children: [
    Column(
    children: [
    Container(
    height: 50,
    width: 250,
    child: TextFormField(
    initialValue: userBalance.toString(),
    style: TextStyle(
    fontSize: 22,
    fontWeight: FontWeight.w400,
    height: 1.41,
    color: Color(0xFF14151F),
    decoration: TextDecoration.none,
    ),
    autovalidateMode: AutovalidateMode.disabled,
    onEditingComplete: () {},
    decoration: const InputDecoration(
    labelText: 'Баланс игрока',
    labelStyle: TextStyle(
    fontSize: 20,
    fontWeight: FontWeight.w400,
    height: 1.41,
    color: Color(0xFF9698A9),
    decoration: TextDecoration.none,
    ),
    isDense: true,
    alignLabelWithHint: true,
    border: UnderlineInputBorder(
    borderSide: BorderSide(
    color: Color(0xFFECF0F3), width: 1),
    borderRadius: BorderRadius.zero),
    ),
    textCapitalization: TextCapitalization.words,
    onChanged: (value) {
    if (int.tryParse(value) != null) {
    userBalance = int.tryParse(value)!;
    }
    },
    validator: (value) {
    return null;
    },
    ),
    ),
    SizedBox(height: 20),
    Container(
    height: 50,
    width: 250,
    child: TextFormField(
    initialValue: casinoBalance.toString(),
    style: TextStyle(
    fontSize: 22,
    fontWeight: FontWeight.w400,
    height: 1.41,
    color: Color(0xFF14151F),
    decoration: TextDecoration.none,
    ),
    autovalidateMode: AutovalidateMode.disabled,
    onEditingComplete: () {},
    decoration: const InputDecoration(
    labelText: 'Баланс казино',
    labelStyle: TextStyle(
    fontSize: 20,
    fontWeight: FontWeight.w400,
    height: 1.41,
    color: Color(0xFF9698A9),
    decoration: TextDecoration.none,
    ),
    isDense: true,
    alignLabelWithHint: true,
    border: UnderlineInputBorder(
    borderSide: BorderSide(
    color: Color(0xFFECF0F3), width: 1),
    borderRadius: BorderRadius.zero),
    ),
    textCapitalization: TextCapitalization.words,
    onChanged: (value) {
    if (int.tryParse(value) != null) {
    casinoBalance = int.tryParse(value)!;
    }
    },
    validator: (value) {
    return null;
    },
    ),
    ),
    ],
    ),
    const SizedBox(width: 40),
    Column(
    children: [

    Container(
    height: 50,
    width: 250,
    @@ -310,7 +310,7 @@ class _MyHomePageState extends State<MyHomePage> {
    height: 50,
    width: 250,
    child: TextFormField(
    controller: _textEditingController,
    controller: _bidEditingController,
    style: TextStyle(
    fontSize: 22,
    fontWeight: FontWeight.w400,
    @@ -347,7 +347,11 @@ class _MyHomePageState extends State<MyHomePage> {
    },
    ),
    ),
    SizedBox(height: 20),
    ],
    ),
    const SizedBox(width: 40),
    Column(
    children: [
    Container(
    height: 50,
    width: 250,
  7. alectogeek revised this gist Dec 5, 2021. 1 changed file with 95 additions and 11 deletions.
    106 changes: 95 additions & 11 deletions main.dart
    Original file line number Diff line number Diff line change
    @@ -46,18 +46,16 @@ class _MyHomePageState extends State<MyHomePage> {
    int actualBid = bid;

    for (int i = 0; i < playTimes; i++) {
    setState(() {
    userBalance -= actualBid;
    casinoBalance += actualBid;
    });
    final bool didWin = Random().nextInt(2) == 1;
    if (didWin) {
    setState(() {
    userBalance = userBalance + 2 * actualBid;
    userBalance = userBalance + actualBid;
    casinoBalance = casinoBalance - actualBid;
    sessionDifference+=actualBid;
    });
    } else {
    userBalance = userBalance - actualBid;
    casinoBalance = casinoBalance + actualBid;
    sessionDifference-=actualBid;
    }
    actualBid += bidIncrease;
    @@ -177,6 +175,95 @@ class _MyHomePageState extends State<MyHomePage> {
    children: [
    Column(
    children: [
    Container(
    height: 50,
    width: 250,
    child: TextFormField(
    initialValue: userBalance.toString(),
    style: TextStyle(
    fontSize: 22,
    fontWeight: FontWeight.w400,
    height: 1.41,
    color: Color(0xFF14151F),
    decoration: TextDecoration.none,
    ),
    autovalidateMode: AutovalidateMode.disabled,
    onEditingComplete: () {},
    decoration: const InputDecoration(
    labelText: 'Баланс игрока',
    labelStyle: TextStyle(
    fontSize: 20,
    fontWeight: FontWeight.w400,
    height: 1.41,
    color: Color(0xFF9698A9),
    decoration: TextDecoration.none,
    ),
    isDense: true,
    alignLabelWithHint: true,
    border: UnderlineInputBorder(
    borderSide: BorderSide(
    color: Color(0xFFECF0F3), width: 1),
    borderRadius: BorderRadius.zero),
    ),
    textCapitalization: TextCapitalization.words,
    onChanged: (value) {
    if (int.tryParse(value) != null) {
    userBalance = int.tryParse(value)!;
    }
    },
    validator: (value) {
    return null;
    },
    ),
    ),
    SizedBox(height: 20),
    Container(
    height: 50,
    width: 250,
    child: TextFormField(
    initialValue: casinoBalance.toString(),
    style: TextStyle(
    fontSize: 22,
    fontWeight: FontWeight.w400,
    height: 1.41,
    color: Color(0xFF14151F),
    decoration: TextDecoration.none,
    ),
    autovalidateMode: AutovalidateMode.disabled,
    onEditingComplete: () {},
    decoration: const InputDecoration(
    labelText: 'Баланс казино',
    labelStyle: TextStyle(
    fontSize: 20,
    fontWeight: FontWeight.w400,
    height: 1.41,
    color: Color(0xFF9698A9),
    decoration: TextDecoration.none,
    ),
    isDense: true,
    alignLabelWithHint: true,
    border: UnderlineInputBorder(
    borderSide: BorderSide(
    color: Color(0xFFECF0F3), width: 1),
    borderRadius: BorderRadius.zero),
    ),
    textCapitalization: TextCapitalization.words,
    onChanged: (value) {
    if (int.tryParse(value) != null) {
    casinoBalance = int.tryParse(value)!;
    }
    },
    validator: (value) {
    return null;
    },
    ),
    ),
    ],
    ),
    const SizedBox(width: 40),
    Column(
    children: [

    Container(
    height: 50,
    width: 250,
    @@ -260,11 +347,7 @@ class _MyHomePageState extends State<MyHomePage> {
    },
    ),
    ),
    ],
    ),
    const SizedBox(width: 40),
    Column(
    children: [
    SizedBox(height: 20),
    Container(
    height: 50,
    width: 250,
    @@ -306,6 +389,7 @@ class _MyHomePageState extends State<MyHomePage> {
    },
    ),
    ),

    ],
    )
    ],
    @@ -321,7 +405,7 @@ class _MyHomePageState extends State<MyHomePage> {
    runGame();
    },
    tooltip: 'Increment',
    child: const Icon(Icons.add),
    child: Text('Play'),
    ),
    );
    }
  8. alectogeek revised this gist Dec 5, 2021. 1 changed file with 309 additions and 15 deletions.
    324 changes: 309 additions & 15 deletions main.dart
    Original file line number Diff line number Diff line change
    @@ -1,34 +1,328 @@
    import 'package:flutter/material.dart';
    import 'dart:math';

    const Color darkBlue = Color.fromARGB(255, 18, 32, 47);
    import 'package:flutter/material.dart';

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

    class MyApp extends StatelessWidget {
    const MyApp({Key? key}) : super(key: key);

    @override
    Widget build(BuildContext context) {
    return MaterialApp(
    theme: ThemeData.dark().copyWith(
    scaffoldBackgroundColor: darkBlue,
    ),
    debugShowCheckedModeBanner: false,
    home: Scaffold(
    body: Center(
    child: MyWidget(),
    ),
    title: 'Flutter Demo',
    theme: ThemeData(
    primarySwatch: Colors.blue,
    ),
    home: const MyHomePage(title: 'Dice'),
    );
    }
    }

    class MyWidget extends StatelessWidget {
    class MyHomePage extends StatefulWidget {
    const MyHomePage({Key? key, required this.title}) : super(key: key);

    final String title;

    @override
    State<MyHomePage> createState() => _MyHomePageState();
    }

    class _MyHomePageState extends State<MyHomePage> {
    int casinoBalance = 100000;
    int userBalance = 100000;
    int bid = 10;
    int bidIncrease = 0;
    int playTimes = 1;

    List<String> logs = [];
    final ScrollController _scrollController = ScrollController();
    TextEditingController _textEditingController = TextEditingController(text: '10');

    void runGame() {
    int sessionDifference = 0;
    int actualBid = bid;

    for (int i = 0; i < playTimes; i++) {
    setState(() {
    userBalance -= actualBid;
    casinoBalance += actualBid;
    });
    final bool didWin = Random().nextInt(2) == 1;
    if (didWin) {
    setState(() {
    userBalance = userBalance + 2 * actualBid;
    casinoBalance = casinoBalance - actualBid;
    sessionDifference+=actualBid;
    });
    } else {
    sessionDifference-=actualBid;
    }
    actualBid += bidIncrease;
    }
    if (sessionDifference >= 0) {
    logs.add('Игрок выиграл: +$sessionDifference');
    } else {
    logs.add('Игрок проиграл: $sessionDifference');
    }

    setState(() {
    bid = actualBid;
    _textEditingController.text = actualBid.toString();
    });

    Future<void>.delayed(Duration(milliseconds: 50)).then((value) {
    WidgetsBinding.instance!.addPostFrameCallback((timeStamp) {
    _scrollController.jumpTo(_scrollController.position.maxScrollExtent);
    });
    });
    }

    @override
    Widget build(BuildContext context) {
    return Text(
    'Сделаю вот тут тогда?',
    style: Theme.of(context).textTheme.headline4,
    return Scaffold(
    appBar: AppBar(
    title: Text(widget.title),
    ),
    body: SafeArea(
    child: GestureDetector(
    onTap: () {
    FocusScope.of(context).unfocus();
    },
    child: Column(
    children: [
    Expanded(
    child: Row(
    children: [
    Expanded(
    child: Column(
    mainAxisAlignment: MainAxisAlignment.center,
    crossAxisAlignment: CrossAxisAlignment.center,
    mainAxisSize: MainAxisSize.min,
    children: <Widget>[
    const SizedBox(height: 20),
    Container(
    padding: const EdgeInsets.all(20),
    decoration: BoxDecoration(
    color: Colors.white,
    boxShadow: [
    BoxShadow(
    offset: const Offset(0, 16),
    color: const Color(0xFF0A0A5C).withOpacity(0.08),
    blurRadius: 40,
    spreadRadius: -12,
    )
    ],
    ),
    child: Text('Баланс казино: ${userBalance}'),
    ),
    const SizedBox(height: 50),
    Container(
    padding: const EdgeInsets.all(20),
    decoration: BoxDecoration(
    color: Colors.white,
    boxShadow: [
    BoxShadow(
    offset: const Offset(0, 16),
    color: const Color(0xFF0A0A5C).withOpacity(0.08),
    blurRadius: 40,
    spreadRadius: -12,
    )
    ],
    ),
    child: Text('Баланс участника: ${casinoBalance}'),
    ),
    ],
    ),
    ),
    Container(
    height: double.maxFinite,
    width: 1,
    color: Colors.grey,
    ),
    Expanded(
    child: Container(
    margin: const EdgeInsets.only(top: 10, left: 10),
    child: ListView.builder(
    // reverse: true,
    controller: _scrollController,
    itemCount: logs.length,
    itemBuilder: (context, index) {
    return Text(logs[index]);
    },
    ),
    ),
    )
    ],
    ),
    ),
    Expanded(
    child: Container(
    margin: const EdgeInsets.all(20),
    padding: const EdgeInsets.all(20),
    decoration: BoxDecoration(
    color: Colors.white,
    boxShadow: [
    BoxShadow(
    offset: const Offset(0, 16),
    color: const Color(0xFF0A0A5C).withOpacity(0.08),
    blurRadius: 40,
    spreadRadius: -12,
    )
    ],
    ),
    child: Row(
    children: [
    Column(
    children: [
    Container(
    height: 50,
    width: 250,
    child: TextFormField(
    initialValue: '1',
    style: TextStyle(
    fontSize: 22,
    fontWeight: FontWeight.w400,
    height: 1.41,
    color: Color(0xFF14151F),
    decoration: TextDecoration.none,
    ),
    autovalidateMode: AutovalidateMode.disabled,
    onEditingComplete: () {},
    decoration: const InputDecoration(
    labelText: 'Количество игр',
    labelStyle: TextStyle(
    fontSize: 20,
    fontWeight: FontWeight.w400,
    height: 1.41,
    color: Color(0xFF9698A9),
    decoration: TextDecoration.none,
    ),
    isDense: true,
    alignLabelWithHint: true,
    border: UnderlineInputBorder(
    borderSide: BorderSide(
    color: Color(0xFFECF0F3), width: 1),
    borderRadius: BorderRadius.zero),
    ),
    textCapitalization: TextCapitalization.words,
    onChanged: (value) {
    if (int.tryParse(value) != null) {
    playTimes = int.tryParse(value)!;
    }
    },
    validator: (value) {
    return null;
    },
    ),
    ),
    SizedBox(height: 20),
    Container(
    height: 50,
    width: 250,
    child: TextFormField(
    controller: _textEditingController,
    style: TextStyle(
    fontSize: 22,
    fontWeight: FontWeight.w400,
    height: 1.41,
    color: Color(0xFF14151F),
    decoration: TextDecoration.none,
    ),
    autovalidateMode: AutovalidateMode.disabled,
    onEditingComplete: () {},
    decoration: const InputDecoration(
    labelText: 'Ставка',
    labelStyle: TextStyle(
    fontSize: 20,
    fontWeight: FontWeight.w400,
    height: 1.41,
    color: Color(0xFF9698A9),
    decoration: TextDecoration.none,
    ),
    isDense: true,
    alignLabelWithHint: true,
    border: UnderlineInputBorder(
    borderSide: BorderSide(
    color: Color(0xFFECF0F3), width: 1),
    borderRadius: BorderRadius.zero),
    ),
    textCapitalization: TextCapitalization.words,
    onChanged: (value) {
    if (int.tryParse(value) != null) {
    bid = int.tryParse(value)!;
    }
    },
    validator: (value) {
    return null;
    },
    ),
    ),
    ],
    ),
    const SizedBox(width: 40),
    Column(
    children: [
    Container(
    height: 50,
    width: 250,
    child: TextFormField(
    initialValue: '0',
    style: TextStyle(
    fontSize: 22,
    fontWeight: FontWeight.w400,
    height: 1.41,
    color: Color(0xFF14151F),
    decoration: TextDecoration.none,
    ),
    autovalidateMode: AutovalidateMode.disabled,
    onEditingComplete: () {},
    decoration: const InputDecoration(
    labelText: 'Размер увеличения ставки после каждой игры',
    labelStyle: TextStyle(
    fontSize: 20,
    fontWeight: FontWeight.w400,
    height: 1.41,
    color: Color(0xFF9698A9),
    decoration: TextDecoration.none,
    ),
    isDense: true,
    alignLabelWithHint: true,
    border: UnderlineInputBorder(
    borderSide: BorderSide(
    color: Color(0xFFECF0F3), width: 1),
    borderRadius: BorderRadius.zero),
    ),
    textCapitalization: TextCapitalization.words,
    onChanged: (value) {
    if (int.tryParse(value) != null) {
    bidIncrease = int.tryParse(value)!;
    }
    },
    validator: (value) {
    return null;
    },
    ),
    ),
    ],
    )
    ],
    ),
    ),
    ),
    ],
    ),
    ),
    ),
    floatingActionButton: FloatingActionButton(
    onPressed: () {
    runGame();
    },
    tooltip: 'Increment',
    child: const Icon(Icons.add),
    ),
    );
    }
    }
  9. alectogeek renamed this gist Dec 5, 2021. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  10. alectogeek created this gist Dec 5, 2021.
    34 changes: 34 additions & 0 deletions gistfile1.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,34 @@
    import 'package:flutter/material.dart';

    const Color darkBlue = Color.fromARGB(255, 18, 32, 47);

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

    class MyApp extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
    return MaterialApp(
    theme: ThemeData.dark().copyWith(
    scaffoldBackgroundColor: darkBlue,
    ),
    debugShowCheckedModeBanner: false,
    home: Scaffold(
    body: Center(
    child: MyWidget(),
    ),
    ),
    );
    }
    }

    class MyWidget extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
    return Text(
    'Сделаю вот тут тогда?',
    style: Theme.of(context).textTheme.headline4,
    );
    }
    }