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);
}
}
}