diff --git a/lib/game.dart b/lib/game.dart new file mode 100644 index 0000000..b705402 --- /dev/null +++ b/lib/game.dart @@ -0,0 +1,38 @@ +import 'player.dart'; + +class Game { + List players = []; + int numWolves; + + Game(this.numWolves); + + void addPlayer(String name) { + players.add(Player(name: name)); + } + + void assignRoles() { + List indexes = List.generate(players.length, (index) => index)..shuffle(); + for (var player in players) { + player.role = 'Dorfbewohner'; // Reset roles + } + for (int i = 0; i < numWolves; i++) { + players[indexes[i]].role = 'Werwolf'; + } + } + + void incrementWolves() { + if (numWolves < players.length) { + numWolves++; + } + } + + void decrementWolves() { + if (numWolves > 1) { + numWolves--; + } + } + + void toggleReveal(int index) { + players[index].isRevealed = !players[index].isRevealed; + } +} diff --git a/lib/main.dart b/lib/main.dart index 0f230ec..9fad434 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,112 +1,89 @@ -import 'package:flutter/material.dart'; - -void main() { - runApp(MyApp()); -} - -class MyApp extends StatelessWidget { - @override - Widget build(BuildContext context) { - return MaterialApp( - home: UserDataForm(), - ); - } -} - -class UserDataForm extends StatefulWidget { - @override - _UserDataFormState createState() => _UserDataFormState(); -} - -class _UserDataFormState extends State { - final _formKey = GlobalKey(); - String _name = ''; - int _age = 0; - double _height = 0.0; - - void _submitData() { - if (_formKey.currentState!.validate()) { - _formKey.currentState!.save(); - // Zeigt einen Dialog mit den gespeicherten Daten - showDialog( - context: context, - builder: (context) { - return AlertDialog( - title: Text('Gespeicherte Daten'), - content: Text( - 'Name: $_name\nAlter: $_age\nGröße: ${_height.toStringAsFixed(2)} m'), - actions: [ - TextButton( - child: Text('OK'), - onPressed: () { - Navigator.of(context).pop(); - }, - ), - ], - ); - }, - ); - } - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text('Benutzerdaten-Formular'), - ), - body: Form( - key: _formKey, - child: Column( - children: [ - TextFormField( - decoration: InputDecoration(labelText: 'Name'), - onSaved: (value) { - _name = value!; - }, - validator: (value) { - if (value!.isEmpty) { - return 'Bitte einen Namen eingeben'; - } - return null; - }, - ), - TextFormField( - decoration: InputDecoration(labelText: 'Alter'), - keyboardType: TextInputType.number, - onSaved: (value) { - _age = int.parse(value!); - }, - validator: (value) { - if (value!.isEmpty || int.tryParse(value) == null) { - return 'Bitte ein gültiges Alter eingeben'; - } - return null; - }, - ), - TextFormField( - decoration: InputDecoration(labelText: 'Größe (in Metern)'), - keyboardType: TextInputType.numberWithOptions(decimal: true), - onSaved: (value) { - _height = double.parse(value!); - }, - validator: (value) { - if (value!.isEmpty || double.tryParse(value) == null) { - return 'Bitte eine gültige Größe eingeben'; - } - return null; - }, - ), - Padding( - padding: const EdgeInsets.only(top: 20.0), - child: ElevatedButton( - onPressed: _submitData, - child: Text('Speichern und anzeigen'), - ), - ), - ], - ), - ), - ); - } -} +import 'package:flutter/material.dart'; +import 'game.dart'; + +void main() { + runApp(MaterialApp(home: WerewolfGame())); +} + +class WerewolfGame extends StatefulWidget { + @override + _WerewolfGameState createState() => _WerewolfGameState(); +} + +class _WerewolfGameState extends State { + final Game game = Game(1); // Initial number of wolves + final TextEditingController _playerController = TextEditingController(); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text("Werwolf Spiel")), + body: Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: TextField( + controller: _playerController, + decoration: InputDecoration(labelText: 'Spielername'), + onSubmitted: (value) { + setState(() { + game.addPlayer(value); + _playerController.clear(); + }); + }, + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + FloatingActionButton( + onPressed: () { + setState(() { + game.decrementWolves(); + }); + }, + child: Icon(Icons.remove), + mini: true, + ), + Text('Anzahl der Werwölfe: ${game.numWolves}', style: TextStyle(fontSize: 16)), + FloatingActionButton( + onPressed: () { + setState(() { + game.incrementWolves(); + }); + }, + child: Icon(Icons.add), + mini: true, + ), + ], + ), + ElevatedButton( + onPressed: () { + setState(() { + game.assignRoles(); + }); + }, + child: Text('Spiel starten'), + ), + Expanded( + child: ListView.builder( + itemCount: game.players.length, + itemBuilder: (context, index) { + return ListTile( + title: Text(game.players[index].name), + trailing: Icon(game.players[index].isRevealed ? Icons.visibility : Icons.visibility_off), + onTap: () { + setState(() { + game.toggleReveal(index); + }); + }, + subtitle: game.players[index].isRevealed ? Text(game.players[index].role) : null, + ); + }, + ), + ), + ], + ), + ); + } +} diff --git a/lib/player.dart b/lib/player.dart new file mode 100644 index 0000000..214cc5f --- /dev/null +++ b/lib/player.dart @@ -0,0 +1,7 @@ +class Player { + String name; + String role; + bool isRevealed; + + Player({required this.name, this.role = 'Dorfbewohner', this.isRevealed = false}); +} diff --git a/lib/testClass.dart b/lib/testClass.dart index 8e94089..6e9b359 100644 --- a/lib/testClass.dart +++ b/lib/testClass.dart @@ -1,125 +1,125 @@ -import 'package:flutter/material.dart'; - -void main() { - runApp(const MyApp()); -} - -class MyApp extends StatelessWidget { - const MyApp({super.key}); - - // This widget is the root of your application. - @override - Widget build(BuildContext context) { - return MaterialApp( - title: 'Flutter Demo', - theme: ThemeData( - // This is the theme of your application. - // - // TRY THIS: Try running your application with "flutter run". You'll see - // the application has a purple toolbar. Then, without quitting the app, - // try changing the seedColor in the colorScheme below to Colors.green - // and then invoke "hot reload" (save your changes or press the "hot - // reload" button in a Flutter-supported IDE, or press "r" if you used - // the command line to start the app). - // - // Notice that the counter didn't reset back to zero; the application - // state is not lost during the reload. To reset the state, use hot - // restart instead. - // - // This works for code too, not just values: Most code changes can be - // tested with just a hot reload. - colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), - useMaterial3: true, - ), - home: const MyHomePage(title: 'Flutter Demo Home Page'), - ); - } -} - -class MyHomePage extends StatefulWidget { - const MyHomePage({super.key, required this.title}); - - // This widget is the home page of your application. It is stateful, meaning - // that it has a State object (defined below) that contains fields that affect - // how it looks. - - // This class is the configuration for the state. It holds the values (in this - // case the title) provided by the parent (in this case the App widget) and - // used by the build method of the State. Fields in a Widget subclass are - // always marked "final". - - final String title; - - @override - State createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - int _counter = 0; - - void _incrementCounter() { - setState(() { - // This call to setState tells the Flutter framework that something has - // changed in this State, which causes it to rerun the build method below - // so that the display can reflect the updated values. If we changed - // _counter without calling setState(), then the build method would not be - // called again, and so nothing would appear to happen. - _counter++; - }); - } - - @override - Widget build(BuildContext context) { - // This method is rerun every time setState is called, for instance as done - // by the _incrementCounter method above. - // - // The Flutter framework has been optimized to make rerunning build methods - // fast, so that you can just rebuild anything that needs updating rather - // than having to individually change instances of widgets. - return Scaffold( - appBar: AppBar( - // TRY THIS: Try changing the color here to a specific color (to - // Colors.amber, perhaps?) and trigger a hot reload to see the AppBar - // change color while the other colors stay the same. - backgroundColor: Theme.of(context).colorScheme.inversePrimary, - // Here we take the value from the MyHomePage object that was created by - // the App.build method, and use it to set our appbar title. - title: Text(widget.title), - ), - body: Center( - // Center is a layout widget. It takes a single child and positions it - // in the middle of the parent. - child: Column( - // Column is also a layout widget. It takes a list of children and - // arranges them vertically. By default, it sizes itself to fit its - // children horizontally, and tries to be as tall as its parent. - // - // Column has various properties to control how it sizes itself and - // how it positions its children. Here we use mainAxisAlignment to - // center the children vertically; the main axis here is the vertical - // axis because Columns are vertical (the cross axis would be - // horizontal). - // - // TRY THIS: Invoke "debug painting" (choose the "Toggle Debug Paint" - // action in the IDE, or press "p" in the console), to see the - // wireframe for each widget. - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text( - 'You have pushed the button this many times:', - ), - Text( - '$_counter', - style: Theme.of(context).textTheme.headlineMedium, - ), - ], - ), - ), - floatingActionButton: FloatingActionButton( - onPressed: _incrementCounter, - tooltip: 'Increment', - child: const Icon(Icons.add), - ), // This trailing comma makes auto-formatting nicer for build methods. - ); - } -} +import 'package:flutter/material.dart'; + +void main() { + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + // This widget is the root of your application. + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Demo', + theme: ThemeData( + // This is the theme of your application. + // + // TRY THIS: Try running your application with "flutter run". You'll see + // the application has a purple toolbar. Then, without quitting the app, + // try changing the seedColor in the colorScheme below to Colors.green + // and then invoke "hot reload" (save your changes or press the "hot + // reload" button in a Flutter-supported IDE, or press "r" if you used + // the command line to start the app). + // + // Notice that the counter didn't reset back to zero; the application + // state is not lost during the reload. To reset the state, use hot + // restart instead. + // + // This works for code too, not just values: Most code changes can be + // tested with just a hot reload. + colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), + useMaterial3: true, + ), + home: const MyHomePage(title: 'Flutter Demo Home Page'), + ); + } +} + +class MyHomePage extends StatefulWidget { + const MyHomePage({super.key, required this.title}); + + // This widget is the home page of your application. It is stateful, meaning + // that it has a State object (defined below) that contains fields that affect + // how it looks. + + // This class is the configuration for the state. It holds the values (in this + // case the title) provided by the parent (in this case the App widget) and + // used by the build method of the State. Fields in a Widget subclass are + // always marked "final". + + final String title; + + @override + State createState() => _MyHomePageState(); +} + +class _MyHomePageState extends State { + int _counter = 0; + + void _incrementCounter() { + setState(() { + // This call to setState tells the Flutter framework that something has + // changed in this State, which causes it to rerun the build method below + // so that the display can reflect the updated values. If we changed + // _counter without calling setState(), then the build method would not be + // called again, and so nothing would appear to happen. + _counter++; + }); + } + + @override + Widget build(BuildContext context) { + // This method is rerun every time setState is called, for instance as done + // by the _incrementCounter method above. + // + // The Flutter framework has been optimized to make rerunning build methods + // fast, so that you can just rebuild anything that needs updating rather + // than having to individually change instances of widgets. + return Scaffold( + appBar: AppBar( + // TRY THIS: Try changing the color here to a specific color (to + // Colors.amber, perhaps?) and trigger a hot reload to see the AppBar + // change color while the other colors stay the same. + backgroundColor: Theme.of(context).colorScheme.inversePrimary, + // Here we take the value from the MyHomePage object that was created by + // the App.build method, and use it to set our appbar title. + title: Text(widget.title), + ), + body: Center( + // Center is a layout widget. It takes a single child and positions it + // in the middle of the parent. + child: Column( + // Column is also a layout widget. It takes a list of children and + // arranges them vertically. By default, it sizes itself to fit its + // children horizontally, and tries to be as tall as its parent. + // + // Column has various properties to control how it sizes itself and + // how it positions its children. Here we use mainAxisAlignment to + // center the children vertically; the main axis here is the vertical + // axis because Columns are vertical (the cross axis would be + // horizontal). + // + // TRY THIS: Invoke "debug painting" (choose the "Toggle Debug Paint" + // action in the IDE, or press "p" in the console), to see the + // wireframe for each widget. + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + 'You have pushed the button this many times:', + ), + Text( + '$_counter', + style: Theme.of(context).textTheme.headlineMedium, + ), + ], + ), + ), + floatingActionButton: FloatingActionButton( + onPressed: _incrementCounter, + tooltip: 'Increment', + child: const Icon(Icons.add), + ), // This trailing comma makes auto-formatting nicer for build methods. + ); + } +}