Как сделать файлы сохранения для моего редактора уровней в Pygame? - PullRequest
0 голосов
/ 10 сентября 2018

Итак, у меня недавно появился этот редактор уровней, и я пытаюсь добавить функцию, чтобы сохранить вашу работу.Я пробовал мариновать, но это не сработало, поэтому я придумал более сложный метод, который вы увидите в приведенном ниже коде, но я не знаю, почему он не работает ... Если у вас есть лучшее представление осделав функцию сохранения для этого редактора, добавьте ответ и, если возможно, добавьте измененный код.Во всяком случае, вот полный код:

import winsound
import pygame
import time
import json

total_squares = 0
locx = []
locy = []
ctype = ['red', 'red', 'yellow']
gotkey = False
keycolor = 'yellow'
kdsw = 50
kdsh = 50
kx = 0
ky = 0
kx2 = 0
ky2 = 0
kable = False
drawingkey = False
swidth = 800
slength = 500
tx = 0
ty = 0
leftmode = False
gtl = True
drawingbadguy = False
locationx = 0
locationy = 0
bgx = 0
bgy = 0
hyes = False
hastimer = False
start_time = 0
upmode = False
tstate = 'normal'
no_transformed = 0
t_able = False
thisx = 0
thisy = 0
elapsed_time2 = 0
st = False
deg = False
egx = 400
egy = 250
endgoal = 0
lm = 0
sizex = 30
sizey = 30
playing = False
pozx = 0
pozy = 0
pxy = pozy
pxc = 0
color = 'red'
cube_list_red = []
cube_list_green = []
cube_list_purple = []
cube_list_brown = []
red_squares = []
green_squares = []
purple_squares_down = []
brown_squares_right = []
purple_squares_up = []
brown_squares_left = []
running = True

screenq = input('How big should the screen be? (mini, normal, big, large): ')
print('OK! There will be a text tutorial in 3.. 2.. 1..')
print('Welcome to pyEditor! This is the tutorial.')
print('Press E to place or move the end goal. When you are done, press E again.')
print('Press J to modify where the player spawns. Press J again when you are done.')
print('Press C to switch trough colors (Each color does something different) and click to place the color')
print('Here is the color table: ')
print('Red: You die when you touch it')
print('Green: You are teleported to a selected location (Press SHIFT while the color green is selected)')
print('Purple: You can go up it but not down / you can go down but not up (Press Z to place purple blocks that go up not down and press Z again to place purple blocks that go down)')
print('Brown: You can go left / right but no right / left (The same as purple but with X')
print('Keydoor: Press somewhere to put the keydoor and somewhere to put the key. You cannot go trough the keydoor without the key!')
print('You can press M to enable transformation ( If you press "T" while playing you can transform )')
print('You can press H to place a "Bad Guy" that goes after you (You can set Its speed with SHIFT)')
print('WIP: Press RSHIFT to place checkpoints')
print('And That IS about it!')


if screenq == 'mini':
    swidth = 500
    slength = 300
elif screenq == 'normal':
    swidth = 800
    slength = 500
elif screenq == 'big':
    swidth = 1000
    slength = 600
elif screenq == 'large':
    swidth = 1200
    slength = 700
else:
    print('Invalid Response! Screen size set to {"normal"}!')
    swidth = 800
    slength = 500

pygame.init()
screen = pygame.display.set_mode((swidth, slength))

def stop():
    playing = False
    pozx = 0
    pozy = 0

drawing_cube = False
dsp = False
jy = False
egm = False

while running:

    class Cube:
        def update(self):
            self.cx, self.cy = pygame.mouse.get_pos()
            self.square = pygame.Rect(self.cx, self.cy, 50, 50)
            locx.append(self.cx)
            locy.append(self.cy)
            if color == 'red':
                red_squares.append(self.square)
                ctype.append('red')
            elif color == 'green':
                green_squares.append(self.square)
                ctype.append('green')
            elif color == 'purple':
                if upmode:
                    purple_squares_up.append(self.square)
                    ctype.append('upPurple')
                else:
                    purple_squares_down.append(self.square)
                    ctype.append('downPurple')
            elif color == 'brown':
                if leftmode:
                    brown_squares_left.append(self.square)
                    ctype.append('leftBrown')
                else:
                    brown_squares_right.append(self.square)
                    ctype.append('rightBrown')

        def lupdate(self):
            global locx
            global locy
            global ctype

            self.cx = locx[0]
            self.cy = locy[0]
            self.square = pygame.Rect(self.cx, self.cy, 50, 50)
            print(self.square)
            if ctype == 'red':
                red_squares.append(self.square)
            else:
                print('')
            ctype.pop(0)
            locx.pop(0)
            locy.pop(0)

        def draw_red(self): 
            pygame.draw.rect(screen, (255, 0, 0), self.square)
            print(cube_list_red)
        def draw_green(self):
            pygame.draw.rect(screen, (0, 255, 0), self.square)
        def draw_purple(self):
            pygame.draw.rect(screen, (238, 130, 238), self.square)
        def draw_brown(self):
            pygame.draw.rect(screen, (165, 42, 42), self.square)

        def check_collide_red(self):
           for red_square in red_squares:
               if player.colliderect(red_square):
                   winsound.Beep(2000, 300)
                   time.sleep(0.7)
                   global playing
                   global pozx
                   global pozy
                   pozx = thisx
                   pozy = thisy
                   keycolor = 'yellow'
                   gotkey = False
                   playing = False
                   no_transformed = 0
                   tstate = 'normal'
                   print('You lost!')

        def check_collide_green(self):
            for green_square in green_squares:
                if player.colliderect(green_square):
                    global pozx
                    global pozy
                    pozx = pxc
                    pozy = pxy

        def check_collide_purple(self):
            for purple_square in purple_squares_down:
                if player.colliderect(purple_square):
                    global pozy
                    pozy = pozy + 0.40
            for purple_square in purple_squares_up:
                if player.colliderect(purple_square):
                    pozy = pozy - 0.40

        def check_collide_brown(self):
            for brown_square in brown_squares_right:
                if player.colliderect(brown_square):
                    global pozx
                    pozx = pozx + 0.40
            for brown_square in brown_squares_left:
                if player.colliderect(brown_square):
                    pozx = pozx - 0.40

    cube = Cube()

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN:
            if not playing:
                total_squares = total_squares + 1
                if not jy:
                    if not egm:
                        if not hyes:
                            if color != 'keydoor':
                                cube = Cube()
                                cube.update()
                                if color == 'red':
                                    cube_list_red.append(cube)
                                elif color == 'green':
                                    cube_list_green.append(cube)
                                elif color == 'purple':
                                    cube_list_purple.append(cube)
                                elif color == 'brown':
                                    cube_list_brown.append(cube)
                                drawing_cube = True
                            else:
                                if not kable:
                                    try:
                                        ctype.remove('keydoor')
                                    except:
                                        print('')
                                    kx, ky = pygame.mouse.get_pos()
                                    locx.append(kx)
                                    locy.append(ky)
                                    ctype.append('keydoor')
                                    print('Press where you want the key to be!')
                                    kable = True
                                    time.sleep(0.3)
                                else:
                                    try:
                                        ctype.remove('key')
                                    except:
                                        print('')
                                    kable = False
                                    kx2, ky2 = pygame.mouse.get_pos()
                                    locx.append(kx2)
                                    locy.append(ky2)
                                    ctype.append('key')
                                    drawingkey = True
                                    time.sleep(0.3)
                        else:
                            bgx, bgy = pygame.mouse.get_pos()
                            locx.append(bgx)
                            locy.append(bgy)
                            ctype.append('badguy')
                            tx, ty = pygame.mouse.get_pos()
                            drawingbadguy = True
                            hyes = False
                            time.sleep(0.5)
                    else:
                        egx, egy = pygame.mouse.get_pos()
                        locx.append(egx)
                        locy.append(egy)
                        ctype.append('endgoal')
                        endgoal = pygame.Rect(egx, egy, 50, 50)
                        deg = True
                        print('End Goal set at '+str(egx)+', '+str(egy))
                        time.sleep(0.5)
                else:
                    thisx, thisy = pygame.mouse.get_pos()
                    pozx, pozy = thisx, thisy
                    time.sleep(0.5)
                    print('Set spawnPoint at '+str(thisx)+', '+str(thisy))

    key = pygame.key.get_pressed()
    if key[pygame.K_c]:
        if not playing:
            if color == 'red':
                color = 'green'
                time.sleep(0.5)
                print(color)
            elif color == 'green':
                color = 'purple'
                time.sleep(0.5)
                print(color)
            elif color == 'purple':
                color = 'brown'
                time.sleep(0.5)
                print(color)
            elif color == 'brown':
                color = 'keydoor'
                time.sleep(0.5)
                print(color)
            elif color == 'keydoor':
                color = 'red'
                time.sleep(0.5)
                print(color)

    elif key[pygame.K_r]:
        cube_list_red.clear()
        cube_list_green.clear()
        cube_list_purple.clear()
        cube_list_brown.clear()
        red_squares.clear()
        green_squares.clear()
        purple_squares_up.clear()
        purple_squares_down.clear()
        brown_squares_left.clear()
        brown_squares_right.clear()
        ctype.clear()
        locx.clear()
        locy.clear()
        total_squares = 0
        drawingkey = False
    elif key[pygame.K_u]:
        if not playing:
            total_squares = total_squares - 1
            if color == 'red':
                if len(cube_list_red) > 0:
                    ctype.remove('red')
                    cube_list_red.pop()
                    red_squares.pop()
                    time.sleep(0.5)
            elif color == 'green':
                if len(cube_list_green) > 0:
                    ctype.remove('green')
                    cube_list_green.pop()
                    green_squares.pop()
                    time.sleep(0.5)
            elif color == 'purple':
                if len(cube_list_purple) > 0:
                    cube_list_purple.pop()
                    if upmode:
                        ctype.remove(upPurple)
                        purple_squares_up.pop()
                    else:
                        ctype.remove(downPurple)
                        purple_squares_down.pop()
                    time.sleep(0.5)
            elif color == 'brown':
                if len(cube_list_brown) > 0:
                    cube_list_brown.pop()
                    if leftmode:
                        ctype.remove('leftBrown')
                        brown_squares_left.pop()
                    else:
                        ctype.remove('rightBrown')
                        brown_squares_right.pop()
                time.sleep(0.5)
            elif color == 'keydoor':
                ctype.remove('keydoor')
                ctype.remove('key')
                drawingkey = False
                time.sleep(0.5)
    elif key[pygame.K_p]:
        bgx, bgy = tx, ty
        playing = True
        start_time = time.time()
    elif key[pygame.K_9]:
        playing = False
        pozx = thisx
        pozy = thisy
        no_transformed = 0
        tstate = 'normal'
        keycolor = 'yellow'
        gotkey = False
    if key[pygame.K_w] == True:
        if pozy >= 0 and playing != False:
            pozy = pozy - 0.40
            lm = 1
    if key[pygame.K_a] == True:
        if pozx >= 0 and playing != False:
            pozx = pozx - 0.40
            lm = 0
    if key[pygame.K_s] == True:
        if pozy <= slength - sizey and playing != False:
            pozy = pozy + 0.40
            lm = 0
    if key[pygame.K_d] == True and playing != False:
        if pozx <= swidth - sizex:
            pozx = pozx + 0.40
            lm = 0
    elif key[pygame.K_LSHIFT] and not playing:
        if color == 'green':
            cht = input('Where do you want the player to teleport when touching a green block? (type "middle", "middle top", "middle down", "middle left", "middle right", "top left", "top right", "down right", "down left"): ')
            if cht == 'middle':
                pxc = swidth/2
                pxy = slength/2
            elif cht == 'middle top':
                pxc = swidth/2
                pxy = 0
            elif cht == 'middle down':
                pxc = swidth/2
                pxy = slength
            elif cht == 'middle left':
                pxc = swidth
                pxy = slength/2
            elif cht == 'middle right':
                pxc = swidth
                pxy = slength/2
            elif cht == 'top left':
                pxc = 0
                pxy = 0
            elif cht == 'top right':
                pxc = swidth
                pxy = 0
            elif cht == 'down left':
                pxc = 0
                pxy = slength
            elif cht == 'down right':
                pxc = swidth
                pxy = slength
            else:
                print('Invalid Syntax!')
        elif color == 'keydoor':
            kdsw = input('How many pixels wide should the keydoor be? (default is 50): ')
            kdsh = input('How many pixels long should the keydoor be? (default is 50): ')
            print('All Set!')

    elif key[pygame.K_j]:
        if jy == False and not playing:
            jy = True
            print('Spawn Point mode activated')
            time.sleep(0.5)
        else:
            if not playing:
                jy = False
                print('Spawn Point mode deactivated')
                time.sleep(0.5)
    elif key[pygame.K_e]:
        if not jy and not playing:
            if egm == False:
                egm = True
                print('End Goal mode activated')
                time.sleep(0.5)
            else:
                egm = False
                print('End Goal mode deactivated')
                time.sleep(0.5)
    elif key[pygame.K_m]:
        if not playing:
            question = input('Should the player be able to transform? (Y / N): ')
            if question == 'Y':
                t_able = True
                q2 = input('Ok! How many times can they do that?: ')
                print('All set!')
            elif question == 'N':
                t_able = False
                print('Ok!')
            else:
                print('Invalid Syntax!')
                t_able = False
    elif key[pygame.K_t]:
        if playing and t_able:
            if no_transformed < int(q2):
                if tstate == 'normal':
                    tstate = 'transformed'
                    sizex = 10
                    sizey = 50
                    no_transformed = no_transformed + 1
                    time.sleep(0.2)
                else:
                    tstate = 'normal'
                    sizex = 30
                    sizey = 30
                    no_transformed = no_transformed + 1
                    time.sleep(0.2)
            else:
                print('You reached the limit of transforming!')
                time.sleep(0.5)
    elif key[pygame.K_z] == True and not playing:
        if upmode == False:
            print('Purple UpMode has been activated!')
            upmode = True
            time.sleep(0.5)
        else:
            print('Purple UpMode has been deactivated!')
            upmode = False
            time.sleep(0.5)
    elif key[pygame.K_0] and not playing:
        seconds = input('How much should the timer last in seconds?: ')
        hastimer = True
    elif key[pygame.K_h]:
        print('Press where you want to place the bad & moving guy')
        hyes = True
        time.sleep(0.3)
    elif key[pygame.K_x]:
        if not playing:
            if leftmode == False:
                print('Brown LeftMode has been activated!')
                leftmode = True
                time.sleep(0.3)
            else:
                print('Brown LeftMode has been deactivated!')
                leftmode = False
                time.sleep(0.3)

    elif key[pygame.K_1] and not playing:
        saveorload = input('Would you like to save or load?: ')
        if saveorload == 'save':
            with open('thisfile.txt', 'w+') as filehandler:
                json.dump([locx, locy, ctype, thisx, thisy, total_squares], filehandler)
                print('Saved!')
        elif saveorload == 'load':
            with open('thisfile.txt', 'r') as filehandler:
                locx, locy, ctype, thisx, thisy, total_squares = json.load(filehandler)
                print('Variables loaded! Drawing cubes.. Please wait!')
                pozx = thisx
                pozy = thisy
                print(total_squares)
                for i in range(total_squares):
                    cube.lupdate()
                    if ctype[0] == 'red':
                        cube_list_red.append(cube)
                        print(cube_list_red)


    if drawingbadguy and playing:
        if pozx > bgx:
            bgx = bgx + 0.20
        if pozx < bgx:
            bgx = bgx - 0.20
        if pozy > bgy:
            bgy = bgy + 0.20
        if pozy < bgy:
            bgy = bgy - 0.20

    screen.fill((0, 0, 255))
    player = pygame.Rect(pozx, pozy, sizex, sizey)
    if drawing_cube: 
        for cube in cube_list_red:
            cube.draw_red()
        for cube in cube_list_green:
            cube.draw_green()
        for cube in cube_list_purple:
            cube.draw_purple()
        for cube in cube_list_brown:
            cube.draw_brown()

    if deg:
        pygame.draw.rect(screen, (0, 0, 0), endgoal)
    if drawingbadguy:
        badguy = pygame.Rect(bgx, bgy, 40, 40)
        pygame.draw.rect(screen, (255, 99, 71), badguy)
    if drawingkey:
        keydoor = pygame.Rect(kx, ky, int(kdsw), int(kdsh))
        key = pygame.Rect(kx2, ky2, 10, 10)
        pygame.draw.rect(screen, (243, 239, 224), keydoor)
        if keycolor == 'yellow':
            pygame.draw.rect(screen, (255, 255, 0), key)
        else:
            pygame.draw.rect(screen, (0, 0, 255), key)

    if playing:
        elapsed_time = time.time() - start_time
        if hastimer:
            if int(elapsed_time) >= int(seconds):
                print("Time's Up!")
                playing = False
                pozx = thisx
                pozy = thisy
                time.sleep(0.5)

        pygame.draw.rect(screen, (0, 0, 0), player)
        cube.check_collide_red()
        cube.check_collide_green()
        cube.check_collide_purple()
        cube.check_collide_brown()
        if drawingbadguy:
            if player.colliderect(badguy):
                playing = False
                pozx = thisx
                pozy = thisy
        if drawingkey and keycolor == 'yellow':
            if player.colliderect(key):
                keycolor = 'blue'
                gotkey = True
                print('You got the key!')
        if drawingkey and player.colliderect(keydoor):
            if gotkey:
                gotkey = True
            else:
                print('Nope')
                pozx = thisx
                pozy = thisy
        try:
            if player.colliderect(endgoal):
                print('You won!')
                gotkey = False
                keycolor = 'yellow'
                time.sleep(0.7)
                playing = False
                pozx = thisx
                pozy = thisy
                no_transformed = 0
                tstate = 'normal'
        except:
            print('Could not find end goal!')
            playing = False

    pygame.display.flip()



pygame.quit()

Если вы можете помочь мне до четверга, это будет с благодарностью!Спасибо!

...