Klasik Mayın Tarlası oyununu kendi başına başarılı olana kadar çözen bir yapay zeka botu.
Bir gün Youtube'da gezinirken 'Code Bullet' kanalında gördüğüm...
Video 1: Uygulamanın aktif çalışma görüntüsü.
Bot şu şekilde çalışıyor. İlk önce 16x16'lık bir mayın tarlası olduğunu...
Tabii ki bu bot her oyunda %100 kazanma vadetmiyor...
Çalışma mantığı ise şöyle: İlk olarak rastgele bir hücre seçip...
Eğer yanarsa oyunu otomatik olarak yeniden başlatıyor ve kazanana kadar devam ediyor.
Bu botu kullanmak için ilk önce bilgisayarınızda Python 3+ ve PyAutoGUI...
import pyautogui
import time
import random
pyautogui.PAUSE = 0
pyautogui.MINIMUM_DURATION = 0
# Hücre içi sayılar için renk → sayı eşlemesi
RENKLER = {
(0, 0, 247): 1,
(0, 119, 0): 2,
(236, 0, 0): 3,
(0, 0, 128): 4,
(128, 0, 0): 5,
(0, 128, 128): 6,
(0, 0, 0): 7,
(128, 128, 128): 8
}
# Sabit ayarlar
check_offset_x = 601
check_offset_y = 427
cell_offset = 30
probe_dx = 15
probe_dy = 20
GRID_SIZE = 16
# Kazanma ve kaybetme pikselleri
win_pixel = (838, 367)
lose_pixel = (831, 378)
restart_click = (839, 368)
# İlk tıklama koordinatları
first_x = check_offset_x + 7 * cell_offset
first_y = check_offset_y + 7 * cell_offset
# Oyun başlatıcı
def oyunu_yeniden_baslat():
pyautogui.click(*restart_click)
time.sleep(0.2)
pyautogui.click(first_x, first_y)
time.sleep(0.2)
# Oyun durumu kontrolü
def oyun_durumu():
win = pyautogui.pixel(*win_pixel)
lose = pyautogui.pixel(*lose_pixel)
if win == (0, 0, 0):
return "win"
elif lose == (0, 0, 0):
return "lose"
return "ongoing"
# Komşuları döndür
def komsular(x, y):
return [
(x + dx, y + dy)
for dx in [-1, 0, 1]
for dy in [-1, 0, 1]
if not (dx == 0 and dy == 0) and 0 <= x + dx < GRID_SIZE and 0 <= y + dy < GRID_SIZE
]
# Hücre tıklama
def tıkla(x, y, sağ=False):
cx = check_offset_x + x * cell_offset
cy = check_offset_y + y * cell_offset
if sağ:
pyautogui.rightClick(cx, cy)
else:
pyautogui.click(cx, cy)
# Ana döngü
while True:
oyunu_yeniden_baslat()
while True:
durum = oyun_durumu()
if durum == "win":
exit()
elif durum == "lose":
break
screenshot = pyautogui.screenshot()
matris = []
for y in range(GRID_SIZE):
satir = []
for x in range(GRID_SIZE):
cx = check_offset_x + x * cell_offset
cy = check_offset_y + y * cell_offset
renk = screenshot.getpixel((cx, cy))
if renk == (255, 255, 255): # Kapalı hücre
probe = screenshot.getpixel((cx + probe_dx, cy + probe_dy))
if probe == (0, 0, 0): # Bayrak
satir.append('F')
else:
satir.append('-')
else:
probe = screenshot.getpixel((cx + probe_dx, cy + probe_dy))
sayi = RENKLER.get(probe, 0)
satir.append(str(sayi))
matris.append(satir)
# Açık hücre çok azsa, rastgele tıkla
acik_sayisi = sum(1 for row in matris for h in row if h not in ('-', 'F'))
if acik_sayisi < 2:
kapali = [(x, y) for y in range(GRID_SIZE) for x in range(GRID_SIZE) if matris[y][x] == '-']
if kapali:
random.shuffle(kapali)
tıkla(*kapali[0])
time.sleep(0.01)
continue
sag_tikla = set()
sol_tikla = set()
for y in range(GRID_SIZE):
for x in range(GRID_SIZE):
merkez = matris[y][x]
if merkez in '12345678':
m = int(merkez)
kapali_komsu = []
bayrak_say = 0
for nx, ny in komsular(x, y):
val = matris[ny][nx]
if val == '-':
kapali_komsu.append((nx, ny))
elif val == 'F':
bayrak_say += 1
if bayrak_say == m:
sol_tikla.update(kapali_komsu)
elif len(kapali_komsu) + bayrak_say == m:
sag_tikla.update(kapali_komsu)
for (x, y) in sag_tikla:
tıkla(x, y, sağ=True)
time.sleep(0.003)
for (x, y) in sol_tikla:
tıkla(x, y)
time.sleep(0.003)
# Eğer tıklanacak hücre kalmadıysa, rastgele seç
if not sag_tikla and not sol_tikla:
kapali = [(x, y) for y in range(GRID_SIZE) for x in range(GRID_SIZE) if matris[y][x] == '-']
if kapali:
random.shuffle(kapali)
tıkla(*kapali[0])
time.sleep(0.005)