import wfea
import pygame
import pygame.font
import sys
import math
from random import *
global GRASS_BLOCK
global WALL_BLOCK
GRASS_BLOCK = 0
WALL_BLOCK = 101
# Game parameters
SCREEN_WIDTH, SCREEN_HEIGHT = 640, 480
BG_COLOR = 150, 170, 120
WALL_COLOR = 40, 40, 40
SQUARE_COLOR = 255, 255, 255
class MouseFollowingSquare(wfea.WFEAObject):
def __init__(self, x, y):
super(MouseFollowingSquare, self).__init__()
self.x = x
self.y = y
self.xVelocity = 0
self.yVelocity = 0
def notPassable(self, grid, x, y):
# First get all the blocks that are being touched
all_connected = [ [int(x / 32), int(y / 32)] ]
if int(x / 32) != int((x + 16) / 32):
all_connected.append([all_connected[0][0] + 1, all_connected[0][1]])
if int(y / 32) != int((y + 16) / 32):
all_connected.append([all_connected[0][0] + 1, all_connected[0][1] + 1])
if int(y / 32) != int((y + 16) / 32):
all_connected.append([all_connected[0][0], all_connected[0][1] + 1])
for i in range(len(all_connected)):
if grid.getPassingValue(all_connected[i][0], all_connected[i][1]) < 0:
return True
return False
def update(self, magic, mouse, grid, counter):
self.xVelocity, self.yVelocity = magic.getNextMovementVector(mouse, self, counter)
self.xVelocity = self.xVelocity * 3
self.yVelocity = self.yVelocity * 3
nextX = self.x + self.xVelocity
if self.notPassable(grid, nextX, self.y):
self.yVelocity = self.yVelocity + 0.5
self.xVelocity = 0
nextY = self.y + self.yVelocity
if self.notPassable(grid, self.x, nextY):
self.yVelocity = 0
self.xVelocity = self.xVelocity + 0.5
nextX = self.x + self.xVelocity
nextY = self.y + self.yVelocity
if not self.notPassable(grid, nextX, nextY):
self.x = nextX
self.y = nextY
pygame.init()
screen = pygame.display.set_mode(
(SCREEN_WIDTH, SCREEN_HEIGHT), pygame.DOUBLEBUF, 32)
clock = pygame.time.Clock()
def exit_game():
pygame.quit()
sys.exit(0)
myfont = pygame.font.SysFont("monospace", 11)
def spawnSquare(grid):
xLoc = -1
yLoc = -1
while xLoc < 0 or yLoc < 0 or grid.getPassingValue(xLoc, yLoc) < 0:
xLoc = randrange(1, 19)
yLoc = randrange(1, 14)
return MouseFollowingSquare(xLoc * 32 + 2, yLoc * 32 + 2)
def spawnSquares(num, grid):
res = []
for i in range(num):
res.append(spawnSquare(grid))
return res
def drawGrid(obj, grid, counter):
for x in range(grid.width):
for y in range(grid.height):
if(grid.getType(x, y) == GRASS_BLOCK):
pass
elif(grid.getType(x, y) == WALL_BLOCK):
pygame.draw.rect(screen, WALL_COLOR,
pygame.Rect(x * 32, y * 32, 32, 32))
for x in range(grid.width):
for y in range(grid.height):
if grid.isUpdated(obj, x, y, counter) and grid.getDistanceValue(obj, x, y) >= 0:
opacity = int(255 - getHeat(grid.getDistanceValue(obj, x, y)))
if opacity > 255:
opacity = 255
elif opacity < 0:
opacity = 0
drawTransparentRect(x * 32, y * 32, 255, 0, 0, opacity)
label = myfont.render(str(int(grid.getDistanceValue(obj, x, y))), 1, (255,255,0))
screen.blit(label, (x * 32, y * 32))
def getHeat(resistance):
return (50 * math.log(resistance + 5) - 50)
transSurface = pygame.Surface((32, 32))
def drawTransparentRect(xLoc, yLoc, red, green, blue, opacity): # Draws a 32x32 square of the specified color and opacity
transSurface.set_alpha(opacity)
transSurface.fill((red, green, blue))
screen.blit(transSurface, (xLoc, yLoc))
mGrid = wfea.Grid(20, 15)
mouse = wfea.Objective(30)
mouse.x = 10
mouse.y = 7
pathFind = True
magic = wfea.WFEASearch(mGrid, [mouse])
stalkerSquares = spawnSquares(50, mGrid)
mGrid.addObjective(mouse)
counter = 0
while True:
if not wfea.DEBUG:
time_passed = clock.tick(30)
else:
time_passed = clock.tick(1)
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit_game()
elif event.type == 5: # constant for mouse press I got from testing
# 1 frame outdated but should be fine
currentType = mGrid.getType(mouse.x, mouse.y)
if currentType == wfea.GRASS_BLOCK:
mGrid.setType(mouse.x, mouse.y, wfea.WALL_BLOCK)
elif currentType == wfea.WALL_BLOCK:
mGrid.setType(mouse.x, mouse.y, wfea.GRASS_BLOCK)
else:
print("Odd type found when mouse pressed")
elif event.type == 2:
print(event.key)
if event.key == 114: # R
wallChance = randrange(1, 16) # 1 - 15% chance of a wall
for xind in range(mGrid.width):
for yind in range(mGrid.height):
if randrange(0, 101) < wallChance:
mGrid.setType(xind, yind, wfea.WALL_BLOCK)
else:
mGrid.setType(xind, yind, wfea.GRASS_BLOCK)
stalkerSquares = spawnSquares(len(stalkerSquares), mGrid)
elif event.key == 99: # C
for xind in range(mGrid.width):
for yind in range(mGrid.height):
mGrid.setType(xind, yind, wfea.GRASS_BLOCK)
elif event.key == 100: # D
wfea.DEBUG = not wfea.DEBUG
else:
pathFind = not pathFind
print("Pathfinding toggled")
screen.fill(BG_COLOR)
temp = pygame.mouse.get_pos()
mouse.x = int(temp[0] / 32)
mouse.y = int(temp[1] / 32)
magic.updateObjectivesPF(counter)
drawGrid(mouse, mGrid, counter)
toResp = []
if pathFind:
for sqInd in range(len(stalkerSquares)):
square = stalkerSquares[sqInd]
square.update(magic, mouse, mGrid, counter)
pygame.draw.rect(screen, SQUARE_COLOR, pygame.Rect(square.x, square.y, 16, 16))
xBlock = int(square.x / 32)
yBlock = int(square.y / 32)
if mGrid.getPassingValue(xBlock, yBlock) < 0 or (xBlock == mouse.x and yBlock == mouse.y):
toResp.append(sqInd)
continue
for sqInd in toResp:
stalkerSquares[sqInd] = spawnSquare(mGrid)
pygame.display.flip()
counter = counter + 1