Merge branch 'an_branch' of https://bdgit.educoder.net/pahiq8bnc/Jungle into an_branch
DLS deemoan_branch
commit
82bba6d366
@ -0,0 +1,247 @@
|
|||||||
|
from typing import List, Tuple
|
||||||
|
import pygame
|
||||||
|
import heapq
|
||||||
|
import socket_client as s
|
||||||
|
from main import right_move, left_move
|
||||||
|
import init
|
||||||
|
|
||||||
|
inf = 99999999
|
||||||
|
MAP1 = init.clac_MAP1()
|
||||||
|
|
||||||
|
def getMAP(Animals):
|
||||||
|
copyMAP = [[0 for i in range(7)] for j in range(9)]
|
||||||
|
for animalId in range(1, len(Animals)):
|
||||||
|
x, y = Animals[animalId]['old_x'], Animals[animalId]['old_y']
|
||||||
|
copyMAP[x][y] = animalId
|
||||||
|
return copyMAP
|
||||||
|
|
||||||
|
|
||||||
|
class PriorityQueue:
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.heap = []
|
||||||
|
self.count = 0
|
||||||
|
|
||||||
|
def push(self, item, priority):
|
||||||
|
entry = (priority, self.count, item)
|
||||||
|
heapq.heappush(self.heap, entry)
|
||||||
|
self.count += 1
|
||||||
|
|
||||||
|
def pop(self):
|
||||||
|
(_, _, item) = heapq.heappop(self.heap)
|
||||||
|
return item
|
||||||
|
|
||||||
|
def isEmpty(self):
|
||||||
|
return len(self.heap) == 0
|
||||||
|
|
||||||
|
def update(self, item, priority):
|
||||||
|
|
||||||
|
for index, (p, c, i) in enumerate(self.heap):
|
||||||
|
if i == item:
|
||||||
|
if p <= priority:
|
||||||
|
break
|
||||||
|
del self.heap[index]
|
||||||
|
self.heap.append((priority, c, item))
|
||||||
|
heapq.heapify(self.heap)
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
self.push(item, priority)
|
||||||
|
|
||||||
|
|
||||||
|
def getMovement(Id, Animals):
|
||||||
|
MAP = getMAP(Animals)
|
||||||
|
Movements = []
|
||||||
|
o_x, o_y = Animals[Id]['old_x'], Animals[Id]['old_y']
|
||||||
|
for x in range(len(MAP)):
|
||||||
|
for y in range(len(MAP[0])):
|
||||||
|
if 1 <= Id <= 7:
|
||||||
|
if right_move(o_x, o_y, x, y, Id, MAP, MAP1):
|
||||||
|
move = (Id, x - o_x, y - o_y)
|
||||||
|
Movements.append(move)
|
||||||
|
else:
|
||||||
|
if right_move(o_x, o_y, x, y, Id, MAP, MAP1):
|
||||||
|
move = (Id, x - o_x, y - o_y)
|
||||||
|
Movements.append(move)
|
||||||
|
return Movements
|
||||||
|
|
||||||
|
|
||||||
|
def getSuccessors(Animals, turn: int):
|
||||||
|
Successors = []
|
||||||
|
Actions = []
|
||||||
|
if turn == 0:
|
||||||
|
# 1 ~ 7
|
||||||
|
for Id in range(1, 8):
|
||||||
|
Move = getMovement(Id, Animals)
|
||||||
|
for oneStep in Move:
|
||||||
|
Actions.append(oneStep)
|
||||||
|
|
||||||
|
else:
|
||||||
|
# 8 ~ 14
|
||||||
|
for Id in range(8, 15):
|
||||||
|
Move = getMovement(Id, Animals)
|
||||||
|
for oneStep in Move:
|
||||||
|
Actions.append(oneStep)
|
||||||
|
|
||||||
|
# update the map
|
||||||
|
for action in Actions:
|
||||||
|
Id, dx, dy = action[0], action[1], action[2]
|
||||||
|
t_Animals = Animals
|
||||||
|
x = Animals[Id]['old_x'] + dx
|
||||||
|
y = Animals[Id]['old_y'] + dy
|
||||||
|
t_Animals[Id]['x'] = x
|
||||||
|
t_Animals[Id]['y'] = y
|
||||||
|
print(t_Animals)
|
||||||
|
Successors.append(t_Animals)
|
||||||
|
# updateMAP()
|
||||||
|
return Successors
|
||||||
|
|
||||||
|
|
||||||
|
class Information:
|
||||||
|
def __init__(self):
|
||||||
|
self.piece_score = {1: 100, 8: 100,
|
||||||
|
2: 70, 9: 70,
|
||||||
|
3: 60, 10: 60,
|
||||||
|
4: 80, 11: 80,
|
||||||
|
5: 90, 12: 90,
|
||||||
|
6: 120, 13: 120,
|
||||||
|
7: 120, 14: 120
|
||||||
|
}
|
||||||
|
self.mouse_score = [[11, 25, 50, 100000, 50, 25, 13],
|
||||||
|
[11, 20, 25, 50, 25, 20, 13],
|
||||||
|
[10, 15, 20, 20, 20, 15, 13],
|
||||||
|
[8, 9, 9, 11, 12, 13, 13],
|
||||||
|
[8, 8, 8, 9, 11, 12, 12],
|
||||||
|
[8, 8, 8, 9, 11, 12, 11],
|
||||||
|
[8, 8, 8, 9, 10, 10, 10],
|
||||||
|
[8, 8, 8, 9, 9, 9, 9],
|
||||||
|
[8, 8, 8, 0, 8, 8, 8]]
|
||||||
|
|
||||||
|
self.eagle_score = [[11, 15, 50, 100000, 50, 15, 11],
|
||||||
|
[12, 12, 20, 50, 20, 15, 12],
|
||||||
|
[14, 15, 20, 20, 20, 14, 14],
|
||||||
|
[13, 0, 0, 13, 0, 0, 13],
|
||||||
|
[12, 0, 0, 12, 0, 0, 12],
|
||||||
|
[11, 0, 0, 11, 0, 0, 11],
|
||||||
|
[10, 10, 10, 10, 10, 10, 10],
|
||||||
|
[8, 8, 8, 8, 8, 8, 8],
|
||||||
|
[8, 8, 8, 0, 8, 8, 8]]
|
||||||
|
|
||||||
|
self.fox_score = [[11, 15, 50, 100000, 50, 15, 11],
|
||||||
|
[12, 12, 20, 50, 20, 15, 12],
|
||||||
|
[14, 15, 20, 20, 20, 14, 14],
|
||||||
|
[13, 0, 0, 13, 0, 0, 13],
|
||||||
|
[12, 0, 0, 12, 0, 0, 12],
|
||||||
|
[11, 0, 0, 11, 0, 0, 11],
|
||||||
|
[10, 10, 10, 11, 10, 10, 10],
|
||||||
|
[8, 8, 9, 10, 9, 8, 8],
|
||||||
|
[8, 8, 10, 0, 10, 8, 8]]
|
||||||
|
|
||||||
|
self.wolf_score = [[11, 15, 50, 100000, 50, 15, 11],
|
||||||
|
[12, 12, 20, 50, 20, 15, 12],
|
||||||
|
[14, 15, 20, 20, 20, 14, 14],
|
||||||
|
[13, 0, 0, 13, 0, 0, 13],
|
||||||
|
[12, 0, 0, 12, 0, 0, 12],
|
||||||
|
[11, 0, 0, 11, 0, 0, 11],
|
||||||
|
[10, 10, 10, 11, 10, 10, 10],
|
||||||
|
[8, 8, 9, 10, 9, 8, 8],
|
||||||
|
[8, 8, 10, 0, 10, 8, 8]]
|
||||||
|
|
||||||
|
self.leopard_score = [[11, 15, 50, 100000, 50, 15, 11],
|
||||||
|
[12, 12, 20, 50, 20, 15, 12],
|
||||||
|
[14, 15, 20, 20, 20, 14, 14],
|
||||||
|
[13, 0, 0, 13, 0, 0, 13],
|
||||||
|
[12, 0, 0, 12, 0, 0, 12],
|
||||||
|
[11, 0, 0, 11, 0, 0, 11],
|
||||||
|
[10, 10, 10, 11, 10, 10, 10],
|
||||||
|
[8, 8, 9, 10, 9, 8, 8],
|
||||||
|
[8, 8, 10, 0, 10, 8, 8]]
|
||||||
|
|
||||||
|
self.lion_score = [[20, 40, 50, 100000, 50, 40, 20],
|
||||||
|
[20, 25, 40, 50, 40, 25, 20],
|
||||||
|
[18, 30, 30, 20, 30, 30, 18],
|
||||||
|
[15, 0, 0, 15, 0, 0, 15],
|
||||||
|
[12, 0, 0, 15, 0, 0, 12],
|
||||||
|
[11, 0, 0, 15, 0, 0, 11],
|
||||||
|
[14, 16, 16, 9, 16, 16, 14],
|
||||||
|
[12, 12, 12, 12, 12, 12, 12],
|
||||||
|
[5, 12, 12, 0, 12, 12, 5]]
|
||||||
|
|
||||||
|
self.elephant_score = [[20, 40, 50, 100000, 50, 40, 20],
|
||||||
|
[20, 25, 40, 50, 40, 25, 20],
|
||||||
|
[18, 30, 30, 20, 30, 30, 18],
|
||||||
|
[15, 0, 0, 15, 0, 0, 15],
|
||||||
|
[12, 0, 0, 15, 0, 0, 12],
|
||||||
|
[11, 0, 0, 15, 0, 0, 11],
|
||||||
|
[14, 16, 16, 9, 16, 16, 14],
|
||||||
|
[12, 12, 12, 12, 12, 12, 12],
|
||||||
|
[5, 12, 12, 0, 12, 12, 5]]
|
||||||
|
|
||||||
|
self.position_score = {1: self.mouse_score,
|
||||||
|
8: self.mouse_score[::-1],
|
||||||
|
2: self.eagle_score,
|
||||||
|
9: self.eagle_score[::-1],
|
||||||
|
3: self.fox_score,
|
||||||
|
10: self.fox_score[::-1],
|
||||||
|
4: self.wolf_score,
|
||||||
|
11: self.wolf_score[::-1],
|
||||||
|
5: self.leopard_score,
|
||||||
|
12: self.leopard_score[::-1],
|
||||||
|
6: self.lion_score,
|
||||||
|
13: self.lion_score[::-1],
|
||||||
|
7: self.elephant_score,
|
||||||
|
14: self.elephant_score[::-1]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def Heuristic(Animals, pTurn):
|
||||||
|
score = 0
|
||||||
|
information = Information()
|
||||||
|
piece_score = information.piece_score
|
||||||
|
for animalId in range(1, len(Animals)):
|
||||||
|
x, y = Animals[animalId]['x'], Animals[animalId]['y']
|
||||||
|
|
||||||
|
if 1 <= animalId <= 14:
|
||||||
|
animalIdValue = information.position_score[animalId][x][y]
|
||||||
|
if pTurn == 0:
|
||||||
|
if 1 <= animalId <= 7:
|
||||||
|
score += (animalIdValue + piece_score[animalId])
|
||||||
|
else:
|
||||||
|
score -= (animalIdValue + piece_score[animalId])
|
||||||
|
else:
|
||||||
|
if 1 <= animalId <= 7:
|
||||||
|
score -= (animalIdValue + piece_score[animalId])
|
||||||
|
else:
|
||||||
|
score += (animalIdValue + piece_score[animalId])
|
||||||
|
return score
|
||||||
|
|
||||||
|
|
||||||
|
def depthLimitedSearch2(curAnimals, turn): # depth = 2
|
||||||
|
Successors = getSuccessors(curAnimals, turn)
|
||||||
|
tempNextMove = [(Successor, inf) for Successor in Successors]
|
||||||
|
nextMove = []
|
||||||
|
if turn:
|
||||||
|
turn2 = 0
|
||||||
|
else:
|
||||||
|
turn2 = 1
|
||||||
|
for Move in tempNextMove:
|
||||||
|
Successors2 = getSuccessors(Move[0], turn2)
|
||||||
|
nextMove2 = [(Successor2, Heuristic(Successor2, turn2)) for Successor2 in Successors2]
|
||||||
|
max2 = inf
|
||||||
|
for action2 in nextMove2:
|
||||||
|
if action2[1] < max2:
|
||||||
|
max2 = action2[1]
|
||||||
|
nextMove.append((Move, max2))
|
||||||
|
min1 = -inf
|
||||||
|
index = 0
|
||||||
|
for i in range(len(nextMove)):
|
||||||
|
if nextMove[i][1] > min1:
|
||||||
|
min1 = nextMove[i][1]
|
||||||
|
index = i
|
||||||
|
return nextMove[index][0]
|
||||||
|
|
||||||
|
|
||||||
|
axis = [(0, 0), (2, 6), (1, 1), (1, 5), (2, 2), (2, 4), (2, 3), (2, 0), (6, 0), (7, 5), (7, 1), (6, 4), (6, 2),
|
||||||
|
(6, 3), (6, 6)]
|
||||||
|
Axis = s.Chessmen_axis(axis)
|
||||||
|
Animals = Axis.axis
|
||||||
|
print(len(axis))
|
Loading…
Reference in new issue