示例#1
0
def doaction(action, piece):
	k = s = old = 0
	goal = piece[2] + action[0]
	r_p = numpy.rot90(piece[1],action[1])
	p = pt.getPiece()
	# if goal < 1:	goal = 1
	# elif goal > 9 and piece[0] == 1 and action[1] % 2:	goal = 9
	# elif goal > 8 and piece[0] == 1 and action[1] % 2 == 0:	goal = 6
	# elif goal > 8 and piece[0] != 1:	goal = 8

	if goal == p[2]:	k = 1

	if action[0] > 0 and goal != p[2]:
		pt.move('right')
	elif action[0] < 0 and goal != p[2]:
		pt.move('left')
	old = p[2]

	for i in range(len(p[1])):
		for j in range(len(p[1][i])):
			if r_p[i][j] != p[1][i][j]:
				s = 2
				break
			if s == 2:	break
		if s == 2:	break
	if s == 2:
		pt.rotate('ccw')
		s = 0
	else: s = 1

	if k == 1 and s == 1:	return 2
	else:
		return 1
示例#2
0
def play_game(state_list, action_list, Qtable):

	step = 0 # 合計ループ数
	old_state = new_state = [] #- state
	flag = 0
	reset()
	pt.init(0.5)

	# メインループ
	while(pt.alive()):

		#########################
		# ループごとの解析、操作をここに書く

		if step % 180 == 0 and flag == 0:
			new_board = pt.getBoard()
			for i in range(len(new_board)):
				for j in range(len(new_board[i])):
					if new_board[i][j] > 0 and new_board[i][j] < 8:	new_board[i][j] = 1
			piece = pt.getPiece()
			new_state = [new_board, piece]

		if new_state != old_state and flag == 0:
			action, value = egreedy.search_action(new_state)
			if action == []:
				action = egreedy.eGreedy(new_state)
			old_state = new_state
			flag = 1

		if step % 10 == 0 and flag == 1:
			flag = doaction(action, piece)
			if step % 100 == 0:	flag = 2

#			print(new_state)

		#########################
	
		# 次のループへ
		pt.loop()
		if flag == 2:
			print pt.param.flag['update']
			pt.move('down')
			if pt.param.flag['update']:
				print "update"
				pt.loop()
				flag = 0
			if pt.param.flag['gameover']:	alive = flag = 0
		step += 1

	# 終了    
	pt.quit()
示例#3
0
def qLearning(maxsteps = 100, rate_a = 0.6, rate_g = 0.3):
	#- state = [board_state, tetrimino]:	盤面の状態, テトリミノ
	#- steps, maxsteps:	エピソード数
	#- state_list:	状態リスト.盤面の状態と落ちてきている駒
	#- action_list:	行動リスト.[横移動回数,回転の回数]を保持
	#- Qtable:	Q値を格納する二次元配列

	steps = 0
	flag = 0

	while steps < maxsteps:
		rate = change_rate(steps/maxsteps, rate_a, rate_g)
		alpha, gamma = rate_a * rate, rate_g * rate
		#state_list = []
		pt.init(0.5)
		alive = 1
		old_board = board = []
		
		print "step:", steps, "start"
		while alive: #- ゲームオーバーになるまで
			if flag == 0:
				board = pt.getBoard()
				if old_board != board:
					for i in range(0,len(board)):
						for j in range(0,len(board[i])):
							if board[i][j] != 0 and board[i][j] != 8:	board[i][j] = 1
					piece = pt.getPiece()
					state = [board, piece]

					#- 行動の探査・搾取
					action = egreedy.eGreedy(state) # softmaxでもよいが、今はとりあえず

					#- state_list, action_list, Qtableの更新
					if action not in lists.action_list:
						lists.action_list.append(action)
					add_state(state)
					updateQ.updateQ(state, action, alpha, gamma)

					#- actionの実行
					old_board = board
					flag = 1

			#次の状態を準備
			if flag == 1:
				step = 0
				while flag != 2:
					flag = doaction(action, piece)
					step += 1
					if step % 100 == 0:
						flag = 2

			elif flag == 2:
				pt.loop()
				#pt.move('down')
                                pt.drop()
				if pt.param.flag['update']:
					pt.loop()
					flag = 0
				if pt.param.flag['gameover']:	alive = flag = 0

		steps += 1
		reset()
		check = 1
#		if len(lists.Qtable) != len(lists.state_list):	print "check"
		while check:
			if [] in lists.Qtable:	lists.Qtable.remove([])
			else:	check = 0

#		if len(lists.Qtable) != len(lists.state_list):	print len(lists.state_list),len(lists.Qtable)
#		flag = steps / maxsteps

	return lists.state_list, lists.action_list, lists.Qtable
示例#4
0
文件: test2.py 项目: fand/gakushu
       [8,0,0,0,0,0,0,0,0,0,0,8],
       [8,0,0,0,0,0,0,0,0,0,0,8],
       [8,0,0,0,0,0,0,0,0,0,0,8],
       [8,0,0,0,0,0,0,0,0,0,0,8],
       [8,0,0,0,0,0,0,0,0,0,0,8],
       [8,0,0,0,0,0,0,0,0,0,0,8],
       [8,8,8,8,8,8,8,8,8,8,8,8],
       [8,8,8,8,8,8,8,8,8,8,8,8],
       [8,8,8,8,8,8,8,8,8,8,8,8],
       [8,8,8,8,8,8,8,8,8,8,8,8],
       [8,8,8,8,8,8,8,8,8,8,8,8],
       [8,8,8,8,8,8,8,8,8,8,8,8]]

b = pt.getBoard()

ans = pt.answer(pt.getBoard(),pt.getPiece()[1], pt.getPiece()[2], 0, 2)
#ans = pt.answer([2,3,4,5,4,3],pt.getPiece()[1], pt.getPiece()[2], 0, 2)

pprint(ans)
pt.rotate('ccw')
pt.rotate('ccw')

# メインループ
while(pt.alive()):
    #########################
    # ループごとの解析、操作をここに書く

    pt.drop()
    # 次のループへ
    pt.loop()
    step += 1