我从Spyder控制台收到的错误如下:
runfile('/ Users / ozgeozler / Pygame / rl_game.py', wdir ='/ Users / ozgeozler / Pygame')集数:1 2019-04-28 23:48:19.057 python [33387:195175]检测到IMKClient停转,请报告您的 用户方案附加了捕获了以下内容的Spindump(或sysdiagnose) 问题-执行了(imkxpc_attributesForCharacterIndex:reply :)块 非常慢(2070.59秒)。 2019-04-28 23:48:19.057 python [33387:195175]检测到IMKClient停转,请报告您的 用户方案附加了捕获了以下内容的Spindump(或sysdiagnose) 问题-(imkxpc_windowLevelWithReply :)块执行非常缓慢 (2068.59秒)。追溯(最近一次通话):
文件“”,第1行,在 runfile('/ Users / ozgeozler / Pygame / rl_game.py',wdir ='/ Users / ozgeozler / Pygame')
文件 “ /anaconda3/lib/python3.6/site-packages/spyder_kernels/customize/spydercustomize.py”, 运行文件中的第827行 execfile(文件名,命名空间)
文件 “ /anaconda3/lib/python3.6/site-packages/spyder_kernels/customize/spydercustomize.py”, 第110行,在execfile中 exec(compile(f.read(),文件名,'exec'),命名空间)
文件“ /Users/ozgeozler/Pygame/rl_game.py”,位于第331行 env.run()
文件“ /Users/ozgeozler/Pygame/rl_game.py”,第262行,正在运行 state = self.initialStates()
AttributeError:“ Env”对象没有属性“ initialStates”
runfile('/ Users / ozgeozler / Pygame / rl_game.py', wdir ='/ Users / ozgeozler / Pygame')第1集:Traceback(最新 最后通话):
文件“”,第1行,在 runfile('/ Users / ozgeozler / Pygame / rl_game.py',wdir ='/ Users / ozgeozler / Pygame')
文件 “ /anaconda3/lib/python3.6/site-packages/spyder_kernels/customize/spydercustomize.py”, 运行文件中的第827行 execfile(文件名,命名空间)
文件 “ /anaconda3/lib/python3.6/site-packages/spyder_kernels/customize/spydercustomize.py”, 第110行,在execfile中 exec(compile(f.read(),文件名,'exec'),命名空间)
文件“ /Users/ozgeozler/Pygame/rl_game.py”,位于第331行 env.run()
文件“ /Users/ozgeozler/Pygame/rl_game.py”,第298行,正在运行 self.agent.replay(batch_size)
文件“ /Users/ozgeozler/Pygame/rl_game.py”,第168行,正在重播 train_target = self.model.predict(状态)
文件 “ /anaconda3/lib/python3.6/site-packages/keras/engine/training.py”, 行1149,在预测中 x,_,_ = self._standardize_user_data(x)
文件 “ /anaconda3/lib/python3.6/site-packages/keras/engine/training.py”, _standardize_user_data中的第751行 exception_prefix ='input')
文件 “ /anaconda3/lib/python3.6/site-packages/keras/engine/training_utils.py”, 第138行,位于standardize_input_data中 str(data_shape))
ValueError:检查输入时出错:预期density_5_input具有 形状(4,),但数组的形状为(1,)
我正在尝试完成与Udemy上的强化学习相关的课程。基本上,我跟随教练。我住进了火车和结果的一部分。
P.s:我对Python和RL非常陌生。
谢谢。
"""
RL GAME
"""
#pygame template
import pygame
import random
import numpy as np
from collections import deque
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import Adam
import random
#window size
WIDTH=360
HEIGHT=360
FPS=30 #OYUNUN NE KADAR HIZLI OLACAĞI
#colors
WHITE=(225, 225, 225)
BLACK=(0,0,0)
RED=(250,0,0)
GREEN=(0,225,0)
BLUE=(0,0,225)
class Player (pygame.sprite.Sprite):
# sprite for a player
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image=pygame.Surface((20,20))
self.image.fill(BLUE)
#parameterenin farklı metodlarına erişim sağlayabilmek için
self.rect=self.image.get_rect()
self.radius= 10
pygame.draw.circle(self.image, RED, self.rect.center,self.radius) #circle i nereye çizmek istiyorsun sorusu ile ilgili
self.rect.centerx =WIDTH/2
self.rect.bottom =HEIGHT-1
self.speedx=0 #0 pixel ilerliyor BAŞLANGİÇTA
def update(self,action): #buradaki action: sağa git sola git veya hiçbir şey yapma demek.
self.speedx=0
#keyboarddan komut alabilmek için pygame kullanılıyor
keystate=pygame.key.get_pressed()
if keystate[pygame.K_LEFT] or action == 0:
self.speedx=-4
elif keystate[pygame.K_RIGHT] or action == 1:
self.speedx=4
else:
self.speedx=0
#toplama yapmazsak tuşa bassan da spride hareket etmiyor.
self.rect.x +=self.speedx
#bu olmazsa sağ tarafta ekran dışına çıkabilir. Ya da sol tarafta da aynısı olur.
#sınır koyuyoruz
if self.rect.right > WIDTH:
self.rect.right= WIDTH
if self.rect.left < 0:
self.rect.left = 0
def getCoordinates(self):
return(self.rect.x, self.rect.y)
#düşman tanımı için yeni bir class yazılır
class Enemy(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
#düşmanlar yaratılıyor
self.image =pygame.Surface((10,10))
self.image.fill(RED)
self.rect=self.image.get_rect() #rectangle ile çevreleyelim ki faydalarını kullanabilelim.
self.radius= 5
pygame.draw.circle(self.image, WHITE, self.rect.center,self.radius) #circle i nereye çizmek istiyorsun sorusu ile ilgili
#ekrana sığındırma yöntemi =WIDTH -self.rect.width
self.rect.x =random.randrange(0, WIDTH -self.rect.width)
self.rect.y =random.randrange(2,6)
self.speedx =0 #ilerde çapraz olarak hareket ettirmek istersek diye yaratıldı.
self.speedy=3
#düşmanların hareket ettirilme kısmı
def update(self):
self.rect.x +=self.speedx
self.rect.y +=self.speedy
if self.rect.top > HEIGHT +10:
self.rect.x =random.randrange(0, WIDTH -self.rect.width)
self.rect.y =random.randrange(2,6)
self.speedy=3
def getCoordinates(self): # rectangle ın x ve y sini alacak.
return(self.rect.x, self.rect.y)
class DQLAgent:
def __init__(self):
#parameters/hyperparameters
#parametreler yaratılır.
#Input'a bu kadar nöron koyacaz.
self.state_size = 4 #distance
#[(playerx- m1x),(playery- m1y),(playerx- m2x),(playery- m2y)]
#Output'a da bu kadar nöron koyacağız.
self.action_size = 3 # right, left, no move
self.gamma = 0.95
self.learning_rate = 0.001
self.epsilon = 1 #explore rate
self.epsilon_decay = 0.995
self.epsilon_min = 0.01
#deque'yu liste olarak düşün
self.memory = deque(maxlen=1000)
#agentın içindeki NN'yı tanımlayan
self.model = self.build_model()
def build_model(self):
#CONSTRUUCTİON OF NN for DQL
model= Sequential()
model.add(Dense(48,input_dim = self.state_size, activation= "relu"))
model.add(Dense(self.action_size, activation="linear"))
model.compile(loss="mse", optimizer= Adam(lr= self.learning_rate))
return model
def remember(self, state, action, reward, next_state,done):
#STORAGE of state,action,reward,next_state,done
self.memory.append((state,action,reward,next_state,done))
def act(self, state):
#action belirlenen yerdir
#önce state bir array e çevriliyor. çünkü bir alt satırdaki
#kodlar array olarak istiyor, state olarak kabul etmiyor.
state=np.array(state)
if np.random.rand()< self.epsilon:
return random.randrange(self.action_size) #eski hali ile --> env.action_space.sample()
act_values= self.model.predict(state)
return np.argmax(act_values[0]) # q değerimin en yuksek oldugu action ı return et diyorum.
def replay(self, batch_size):
#TRAINING
#replay memory yeterince dolu (16) olmazsa önceki
#tecrübelerinden yararlanamıyor.
#16 tane state,action,reward,next_state,done yoksa,
#replay metodunu kullanamıyorsun.
if len(self.memory) < batch_size:
return
minibatch = random.sample(self.memory,batch_size)
for state,action,reward,next_state,done in minibatch:
state=np.array(state)
next_state=np.array(next_state)
if done:#kırmızı alan için yazıldı bu if else
target=reward
else:
target=reward + self.gamma*np.amax(self.model.predict(next_state)[0])
#amax önce flaten ediyor sonra maxı seçiyor
train_target = self.model.predict(state)
train_target[0][action] = target
self.model.fit(state, train_target, verbose=0)
def adaptiveEGreedy(self):
#CONSTRUCTION OF NN for DQL
if self.epsilon > self.epsilon_min:
self.epsilon *= self.epsilon_decay
class Env(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.all_sprite =pygame.sprite.Group()
self.enemy= pygame.sprite.Group()
self.player=Player()
self.all_sprite.add(self.player)
self.m1 =Enemy() #1. düşmanı oluşturduk
self.m2=Enemy() #2. düşmanı oluşturduk
self.all_sprite.add(self.m1) # burada oluşturduğum 1. düşmanı sprite in içine ekliyoruz.
self.all_sprite.add(self.m2) # # burada oluşturduğum 2. düşmanı sprite in içine ekliyoruz.
self.enemy.add(self.m1)
self.enemy.add(self.m2)
self.reward=0
self.total_reward=0
self.done=False
self.agent=DQLAgent()
def findDistance(self, a,b):
d=a-b
return d
#environmentte action alınınca agentı environment içinde yeni statee taşıyor.
def step(self, action):
state_list=[]
#update enemy
self.player.update(action)
self.enemy.update() #enemy ler action almıyorlar çünkü onlar zaten her update de aşağı doğru hızları kadar iniyorlaar.
# get coordinate of player and enemies
next_player_state=self.player.getCoordinates()
next_m1_state=self.m1.getCoordinates()
next_m2_state=self.m2.getCoordinates()
#find distance
state_list.append(self.findDistance(next_player_state[0],next_m1_state[0]))
state_list.append(self.findDistance(next_player_state[1],next_m1_state[1]) )
state_list.append(self.findDistance(next_player_state[0],next_m2_state[0]))
state_list.append(self.findDistance(next_player_state[1],next_m2_state[1]) )
return[state_list]
#reset motodu
def initialState(self):
#agent bir bölümü tamamladığında ve başka bir bölüme geçtiğinde environmentde bütün değreleri baştan yaratma için.
#benim agent im hariç geri kalan herşeyi resetlemek gerek.
self.all_sprite =pygame.sprite.Group()
self.enemy= pygame.sprite.Group()
self.player=Player()
self.all_sprite.add(self.player)
self.m1 =Enemy() #1. düşmanı oluşturduk
self.m2=Enemy() #2. düşmanı oluşturduk
self.all_sprite.add(self.m1) # burada oluşturduğum 1. düşmanı sprite in içine ekliyoruz.
self.all_sprite.add(self.m2) # # burada oluşturduğum 2. düşmanı sprite in içine ekliyoruz.
self.enemy.add(self.m1)
self.enemy.add(self.m2)
self.reward=0
self.total_reward=0
self.done=False
state_list=[]
# get coordinate of player and enemies
player_state=self.player.getCoordinates()
m1_state=self.m1.getCoordinates()
m2_state=self.m2.getCoordinates()
#find distance
state_list.append(self.findDistance(player_state[0],m1_state[0]))
state_list.append(self.findDistance(player_state[1],m1_state[1]) )
state_list.append(self.findDistance(player_state[0],m2_state[0]))
state_list.append(self.findDistance(player_state[1],m2_state[1]) )
return[state_list], self
def run(self):
#game loop
state= self.initialState()
running=True
batch_size=24
while running:
self.reward=2 #kafamdan tasarladığım ödül, her ölmediğinde 2 puan toplayacak
#keep loop running at the rght speed
clock.tick(FPS)
#process input
#oyundan çıkabilmek için update
for event in pygame.event.get():
if event.type==pygame.QUIT:
running = False
#update
#agent a bir action seçtiriyorum.
action=self.agent.act(state)
next_state= self.step(action)
self.total_reward+=self.reward
hits = pygame.sprite.spritecollide(self.player,self.enemy,False,pygame.sprite.collide_circle)
if hits:
self.reward= -150
self.total_reward+=self.reward
self.done=True
running = False #GAME LOOPDAN ÇIKIYORSA
print("Total reward: ", self.total_reward)
self.agent.remember(state,action, self.reward, next_state, self.done)
#update state /storage
state=next_state
#training
self.agent.replay(batch_size)
#epsilon greedy
#bir sonraki bölümde nasıl bir action seçeceğiimize kara verdiğimiz metodumuz.
self.agent.adaptiveEGreedy()
#draw and render
screen.fill(GREEN)
self.all_sprite.draw(screen)
#after drawing flip dislay
pygame.display.flip()
pygame.quit()
if __name__ == "__main__":
env=Env()
liste=[]
t=0
while True:
t+=1
print("Episode: ", t)
liste.append(env.total_reward)
#initialize pygame and create window
pygame.init()
screen= pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption("RL GAME")
clock=pygame.time.Clock()
env.run()
我希望看到一个游戏屏幕,其中有一个特工试图学习逃避来自上方敌人的逃生。
答案 0 :(得分:0)
现在我的代码以一种我不理解的方式工作,因为我没有完全更改任何内容。在这里。
"""
RL GAME
"""
#pygame template
import pygame
import random
import numpy as np
from collections import deque
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import Adam
import random
#window size
WIDTH=360
HEIGHT=360
FPS=30 #OYUNUN NE KADAR HIZLI OLACAĞI
#colors
WHITE=(225, 225, 225)
BLACK=(0,0,0)
RED=(250,0,0)
GREEN=(0,225,0)
BLUE=(0,0,225)
class Player (pygame.sprite.Sprite):
# sprite for a player
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image=pygame.Surface((20,20))
self.image.fill(BLUE)
#parameterenin farklı metodlarına erişim sağlayabilmek için
self.rect=self.image.get_rect()
self.radius= 10 #kutular arasında boşluğuengellemek için circle çiziminde kullanılacak.
pygame.draw.circle(self.image, RED, self.rect.center,self.radius) #circle i nereye çizmek istiyorsun sorusu ile ilgili
self.rect.centerx =WIDTH/2
self.rect.bottom =HEIGHT-1
self.speedx=0 #0 pixel ilerliyor BAŞLANGİÇTA
def update(self,action): #buradaki action: sağa git sola git veya hiçbir şey yapma demek.
self.speedx=0
#keyboarddan komut alabilmek için pygame kullanılıyor
keystate=pygame.key.get_pressed()
if keystate[pygame.K_LEFT] or action == 0: #kendi environment ımızı tasarladığım için kendimiz değer veriyoruz 0 diye.
self.speedx=-4
elif keystate[pygame.K_RIGHT] or action == 1: #kendi environment ımızı tasarladığım için kendimiz değer veriyoruz 1 diye.
self.speedx=4
else:
self.speedx=0
#toplama yapmazsak tuşa bassan da spride hareket etmiyor.
self.rect.x +=self.speedx
#bu olmazsa sağ tarafta ekran dışına çıkabilir. Ya da sol tarafta da aynısı olur.
#sınır koyuyoruz
if self.rect.right > WIDTH:
self.rect.right= WIDTH
if self.rect.left < 0:
self.rect.left = 0
def getCoordinates(self):
return(self.rect.x, self.rect.y)
#düşman tanımı için yeni bir class yazılır
class Enemy(pygame.sprite.Sprite):
def __init__(self): #image yaratmak için
pygame.sprite.Sprite.__init__(self)
#artık düşmanlar yaratılıyor
self.image =pygame.Surface((10,10)) #10x01 luk dikdörtgen image yaratma kısmı
self.image.fill(RED) #red yapalım.
self.rect=self.image.get_rect() #rectangle ile çevreleyelim ki faydalarını kullanabilelim.
self.radius= 5 #içine 5 lik daire oturtma
#rastgele bir saldırı gerçekleşmesi için
pygame.draw.circle(self.image, WHITE, self.rect.center,self.radius) #circle i nereye çizmek istiyorsun sorusu ile ilgili
#ekrana sığındırma yöntemi =WIDTH -self.rect.width
#düşman ekran dışından gelmesin diye sığdırma
self.rect.x =random.randrange(0, WIDTH -self.rect.width)
#düşmanın y ekseninden 2-6 sınırları içinden gelmeye başlaması için.
self.rect.y =random.randrange(2,6)
self.speedx =0 #ilerde çapraz olarak hareket ettirmek istersek diye yaratıldı.
self.speedy=3
#düşmanların hareket ettirilme kısmı
def update(self):
self.rect.x +=self.speedx #x ekseninde düz bir şekilde gidecek diye bu şekilde yazıldı.
self.rect.y +=self.speedy
if self.rect.top > HEIGHT +10: #eğer enemy ekrandan aşağı fazla inip görünmez olursa
#yine bir önceki tanımdaki gibi enemyler ekrana girsin diye.
self.rect.x =random.randrange(0, WIDTH -self.rect.width)
self.rect.y =random.randrange(2,6)
self.speedy=3
# =============================================================================
# if self.rect.left > WIDTH -10:
# self.rect.x =random.randrange(0, WIDTH -self.rect.width)
# self.rect.y =random.randrange(2,6)
# self.speedx=2
#
# if self.rect.right > WIDTH +10:
# self.rect.x =random.randrange(0, WIDTH -self.rect.width)
# self.rect.y =random.randrange(2,6)
# self.speedX=2
#
# =============================================================================
def getCoordinates(self): # rectangle ın x ve y sini alacak.
return(self.rect.x, self.rect.y)
class DQLAgent:
def __init__(self):
#parameters/hyperparameters
#parametreler yaratılır.
#Input'a bu kadar nöron koyacaz.
self.state_size = 4 #distance
#[(playerx- m1x),(playery- m1y),(playerx- m2x),(playery- m2y)]
#Output'a da bu kadar nöron koyacağız.
self.action_size = 3 # right, left, no move
self.gamma = 0.95
self.learning_rate = 0.001
self.epsilon = 1 #explore rate
self.epsilon_decay = 0.995
self.epsilon_min = 0.01
#deque'yu liste olarak düşün
self.memory = deque(maxlen=1000)
#agentın içindeki NN'yı tanımlayan
self.model = self.build_model()
def build_model(self):
#CONSTRUUCTİON OF NN for DQL
model= Sequential()
model.add(Dense(48,input_dim = self.state_size, activation= "relu"))
model.add(Dense(self.action_size, activation="linear"))
model.compile(loss="mse", optimizer= Adam(lr= self.learning_rate))
return model
def remember(self, state, action, reward, next_state,done):
#STORAGE of state,action,reward,next_state,done
self.memory.append((state,action,reward,next_state,done))
def act(self, state):
#action belirlenen yerdir
#önce state bir array e çevriliyor. çünkü bir alt satırdaki
#kodlar array olarak istiyor, state olarak kabul etmiyor.
state=np.array(state)
if np.random.rand()<= self.epsilon:
return random.randrange(self.action_size)# random bir şekilde haraekt etmek istiyor.
#eski hali ile --> env.action_space.sample()
act_values= self.model.predict(state) #state predict edilir.
return np.argmax(act_values[0]) # pedict'e göre, q değerimin en yuksek oldugu action ı return et diyorum.
def replay(self, batch_size):
#TRAINING
#replay memory yeterince dolu (16) olmazsa önceki
#tecrübelerinden yararlanamıyor.
#16 tane state,action,reward,next_state,done yoksa,
#replay metodunu kullanamıyorsun.
if len(self.memory) < batch_size:
return
minibatch = random.sample(self.memory,batch_size)
for state,action,reward,next_state,done in minibatch:
state=np.array(state)
next_state=np.array(next_state)
if done:#kırmızı alan için yazıldı bu if else
target=reward
else:
target=reward + self.gamma*np.amax(self.model.predict(next_state)[0])
#amax önce flaten ediyor sonra maxı seçiyor
train_target = self.model.predict(state)
train_target[0][action] = target
self.model.fit(state, train_target, verbose=0)
def adaptiveEGreedy(self):
#CONSTRUCTION OF NN for DQL
if self.epsilon > self.epsilon_min:
self.epsilon *= self.epsilon_decay
class Env(pygame.sprite.Sprite):
def __init__(self): #initializer
pygame.sprite.Sprite.__init__(self) #sprite klassına inherit edebilmek için gereken kod kısmı.
#hepsinin başında self var çünkü bunlar bir class'ın içinde yaratılıyor ve bunlar bizim initial paramtereler.
self.all_sprite =pygame.sprite.Group()
self.enemy= pygame.sprite.Group() #düşamn sprite'ı
self.player=Player() #player sprite'ı
self.all_sprite.add(self.player) #player'ı sprite'ın içine ekledik.
self.m1 =Enemy() #1. düşmanı oluşturduk
self.m2=Enemy() #2. düşmanı oluşturduk
self.all_sprite.add(self.m1) # burada oluşturduğum 1. düşmanı sprite in içine ekliyoruz.
self.all_sprite.add(self.m2) # # burada oluşturduğum 2. düşmanı sprite in içine ekliyoruz.
self.enemy.add(self.m1)
self.enemy.add(self.m2)
#diğer önemli parameterelerin tanımlanması.
self.reward=0
self.total_reward=0
self.done=False #bölümümün bitip bitmediği.
self.agent=DQLAgent()
def findDistance(self, a,b):
d=a-b
return d
#environmentte action alınınca agentı environment içinde yeni statee taşıyor.
#içine bir action alan step metodu environment içinde agent'i bir sonraki state'e taşıyor.
def step(self, action):
state_list=[]
#update enemy ve player: bu ikisini next state için ekranda bir adım ileri taşıyor.
self.player.update(action) #player için update metodu çağrılır.
self.enemy.update() #enemy ler action almıyorlar çünkü onlar zaten her update de aşağı doğru hızları kadar iniyorlaar.
# get coordinate of player and enemies
next_player_state=self.player.getCoordinates()
next_m1_state=self.m1.getCoordinates()
next_m2_state=self.m2.getCoordinates()
#find distance
#statelerimi tuttuğum listeye distancelar eklenir.
state_list.append(self.findDistance(next_player_state[0],next_m1_state[0]))
state_list.append(self.findDistance(next_player_state[1],next_m1_state[1]))
state_list.append(self.findDistance(next_player_state[0],next_m2_state[0]))
state_list.append(self.findDistance(next_player_state[1],next_m2_state[1]))
return[state_list]
#reset motodu
def initialState(self):
#agent bir bölümü tamamladığında ve başka bir bölüme geçtiğinde environmentde bütün değreleri baştan yaratma için.
#benim agent im hariç geri kalan herşeyi resetlemek gerek.
self.all_sprite =pygame.sprite.Group()
self.enemy= pygame.sprite.Group()
self.player=Player()
self.all_sprite.add(self.player)
self.m1 =Enemy() #1. düşmanı oluşturduk
self.m2=Enemy() #2. düşmanı oluşturduk
self.all_sprite.add(self.m1) # burada oluşturduğum 1. düşmanı sprite in içine ekliyoruz.
self.all_sprite.add(self.m2) # # burada oluşturduğum 2. düşmanı sprite in içine ekliyoruz.
self.enemy.add(self.m1)
self.enemy.add(self.m2)
self.reward=0
self.total_reward=0
self.done=False
state_list=[]
# get coordinate of player and enemies
player_state=self.player.getCoordinates()
m1_state=self.m1.getCoordinates()
m2_state=self.m2.getCoordinates()
#find distance
#yukarıdakinin next'leri olmadan hali.
#next ler yok çinkü demin uodate ettiğim için next stateleri alıyorduk.
#ama burada update etmediğim için player ve düşmanlarımın hangi koordinatta olduğunu alırım.
state_list.append(self.findDistance(player_state[0],m1_state[0]))
state_list.append(self.findDistance(player_state[1],m1_state[1]) )
state_list.append(self.findDistance(player_state[0],m2_state[0]))
state_list.append(self.findDistance(player_state[1],m2_state[1]) )
return[state_list]
def run(self): #tüm dql algoritmasının koşacagı kısım
#game loop
state= self.initialState()
running=True
batch_size=24
while running:
self.reward=2 #kafamdan tasarladığım ödül, her ölmediğinde 2 puan toplayacak
#keep loop running at the rght speed
clock.tick(FPS)
#process input
#oyundan çıkabilmek için update
for event in pygame.event.get():
if event.type==pygame.QUIT:
running = False
#update kısım burada başlıyor.
#agent a bir action seçtiriyorum.
action=self.agent.act(state) #act metoduna bir state yolladım ve buradan bir action seçtim.
next_state= self.step(action) #bu action a göre step metodu bize ne state döndürecek?
self.total_reward+=self.reward #total reward hesaplanma kısmı
#pygame.sprite.collide_circle ile collision tipi belirtilir .
hits = pygame.sprite.spritecollide(self.player,self.enemy,False,pygame.sprite.collide_circle)
if hits:
self.reward= -150
self.total_reward+=self.reward
self.done=True
running = False #GAME LOOPDAN ÇIKIYORSA
print("Total reward: ", self.total_reward)
#eğer çarpma olmadıysa
#hatırlamam lazım.
#storage
self.agent.remember(state,action, self.reward, next_state, self.done)
#update state
state=next_state
#training
self.agent.replay(batch_size)
#epsilon greedy
#bir sonraki bölümde nasıl bir action seçeceğiimize kara verdiğimiz metodumuz.
self.agent.adaptiveEGreedy()
#draw and render
screen.fill(GREEN)
self.all_sprite.draw(screen)
#after drawing flip dislay
pygame.display.flip()
pygame.quit()
#main loop kısmı
if __name__ == "__main__":
env=Env()
liste=[] #burada reward larımı tutacağım.
t=0
while True:
t+=1
print("Episode: ", t)
liste.append(env.total_reward) # listeden gelen total reward depolanır.
#initialize pygame and create window
pygame.init()
screen= pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption("RL GAME")
clock=pygame.time.Clock()
env.run() #environment'i run eden kod.