Flutter ile yılan oyunu geliştirme kodu

Basit yılan oyunu nasıl yazılır aşağıdaki kodu inceleyerek uygulayabilirsiniz

import 'dart:async';
import 'dart:math';

import 'package:flutter/material.dart';

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

class YilanOyunu extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Yılan Oyunu',
      theme: ThemeData(
        primarySwatch: Colors.green,
      ),
      home: YilanOyunuSayfasi(),
    );
  }
}

class YilanOyunuSayfasi extends StatefulWidget {
  const YilanOyunuSayfasi();

  @override
  State<YilanOyunuSayfasi> createState() => _YilanOyunuSayfasiDurumu();
}

enum Yon { yukari, asagi, sol, sag }

class _YilanOyunuSayfasiDurumu extends State<YilanOyunuSayfasi> {
  int satir = 20, sutun = 20;
  List<int> sinirListesi = [];
  List<int> yilanPozisyonu = [];
  int yilanKafasi = 0;
  int puan = 11;
  late Yon yon;
  late int yemPozisyonu = 0;

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

  void oyunuBaslat() {
    sinirOlustur();
    yemiOlustur(); // Zamanlayıcıyı kurmadan önce yemPozisyonu'nun başlatıldığından emin olun
    yon = Yon.sag;
    yilanPozisyonu = [45, 44, 43];
    yilanKafasi = yilanPozisyonu.first;
    Timer.periodic(const Duration(milliseconds: 300), (timer) {
      yilaniGuncelle();
      if (carpismaKontrolu()) {
        timer.cancel();
        oyunBittiDialogunuGoster();
      }
    });
  }

  void oyunBittiDialogunuGoster() {
    showDialog(
      context: context,
      barrierDismissible: false,
      builder: (context) {
        return AlertDialog(
          title: const Text("Oyun Bitti"),
          content: const Text("Yılanınız çarptı!"),
          actions: [
            TextButton(
              onPressed: () {
                Navigator.of(context).pop();
                oyunuBaslat();
              },
              child: const Text("Yeniden Başlat"),
            ),
          ],
        );
      },
    );
  }

  bool carpismaKontrolu() {
    // Yılan sınırla veya kendisiyle çarpışırsa
    return sinirListesi.contains(yilanKafasi) ||
        yilanPozisyonu.sublist(1).contains(yilanKafasi);
  }

  void yemiOlustur() {
    yemPozisyonu = Random().nextInt(satir * sutun);
    if (sinirListesi.contains(yemPozisyonu)) {
      yemiOlustur();
    }
  }

  void yilaniGuncelle() {
    setState(() {
      switch (yon) {
        case Yon.yukari:
          yilanPozisyonu.insert(0, (yilanKafasi - sutun) % (satir * sutun));
          break;
        case Yon.asagi:
          yilanPozisyonu.insert(0, (yilanKafasi + sutun) % (satir * sutun));
          break;
        case Yon.sag:
          yilanPozisyonu.insert(0, (yilanKafasi + 1) % (satir * sutun));
          break;
        case Yon.sol:
          yilanPozisyonu.insert(0, (yilanKafasi - 1) % (satir * sutun));
          break;
      }
    });

    if (yilanKafasi == yemPozisyonu) {
      puan++;
      yemiOlustur();
    } else {
      yilanPozisyonu.removeLast();
    }

    yilanKafasi = yilanPozisyonu.first;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [
          Expanded(child: _oyunAlani()),
          _oyunKontrolleri(),
        ],
      ),
    );
  }

  Widget _oyunAlani() {
    return GridView.builder(
      gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
        crossAxisCount: sutun,
        childAspectRatio: 1,
      ),
      itemBuilder: (context, index) {
        return Container(
          margin: const EdgeInsets.all(1),
          decoration: BoxDecoration(
            borderRadius: BorderRadius.circular(8),
            color: _kutuyuDoldur(index),
          ),
        );
      },
      itemCount: satir * sutun,
    );
  }

  Widget _oyunKontrolleri() {
    return Container(
      padding: const EdgeInsets.all(20),
      width: double.infinity,
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Text("Puan: $puan"),
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: [
              IconButton(
                onPressed: () {
                  if (yon != Yon.asagi) yon = Yon.yukari;
                },
                icon: const Icon(Icons.arrow_circle_up),
                iconSize: 50,
              ),
            ],
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              IconButton(
                onPressed: () {
                  if (yon != Yon.sag) {
                    yon = Yon.sol;
                  }
                },
                icon: const Icon(Icons.arrow_circle_left_outlined),
                iconSize: 50,
              ),
              IconButton(
                onPressed: () {
                  if (yon != Yon.sol) {
                    yon = Yon.sag;
                  }
                },
                icon: const Icon(Icons.arrow_circle_right_outlined),
                iconSize: 50,
              ),
            ],
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: [
              IconButton(
                onPressed: () {
                  if (yon != Yon.yukari) yon = Yon.asagi;
                },
                icon: const Icon(Icons.arrow_circle_down_outlined),
                iconSize: 50,
              ),
            ],
          ),
        ],
      ),
    );
  }

  Color _kutuyuDoldur(int index) {
    if (sinirListesi.contains(index)) {
      return Colors.yellow;
    } else {
      if (yilanPozisyonu.contains(index)) {
        if (yilanKafasi == index) {
          return Colors.green;
        } else {
          return Colors.white.withOpacity(0.9);
        }
      } else {
        if (index == yemPozisyonu) {
          return Colors.red;
        }
      }
    }
    return Colors.grey.withOpacity(0.05);
  }

  void sinirOlustur() {
    for (int i = 0; i < sutun; i++) {
      if (!sinirListesi.contains(i)) sinirListesi.add(i);
    }
    for (int i = 0; i < satir * sutun; i = i + sutun) {
      if (!sinirListesi.contains(i)) sinirListesi.add(i);
    }
    for (int i = sutun - 1; i < satir * sutun; i = i + sutun) {
      if (!sinirListesi.contains(i)) sinirListesi.add(i);
    }
    for (int i = (satir * sutun) - sutun; i < satir * sutun; i = i + 1) {
      if (!sinirListesi.contains(i)) sinirListesi.add(i);
    }
  }
}

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir