티스토리 뷰

개발

얼불춤 만들기(A Dance of Fire and Ice)

KWG07(joseph0528) 2021. 1. 9. 23:16

얼 불춤이라는 리듬 게임이 있는데 하고 싶지만 게임을 깔 수가 없어서 직접 만든다.

현재 맵은 3개고 노래는 아직 모든 맵에 추가가 안되어있다.

 

 

지금 아직은 미완성이고 잘못 눌렀을 때 돌아가는 건 있지만 타이밍이 늦었을 때 다시 돌아가는 건 아직 추가를 안 했다.

앞으로 계속 만들 예정이고 작품이 잘 나왔으면 좋겠다.

 

import sys
import random
import pygame
import time
import math
import map
from tkinter import *
from tkinter import messagebox
from pygame.locals import QUIT,KEYDOWN,K_LEFT,K_RIGHT,K_UP,K_DOWN,Rect,MOUSEBUTTONDOWN,K_SPACE
def start():
    pygame.init()
    FPSCLOCK = pygame.time.Clock()
    SURFACE = pygame.display.set_mode((1000,1000))
    SURFACE.fill((0,0,0))
    block=[]
    item=[]
    itemspeed=[]
    itemslow=[]
    cx=200
    cy=200
    y_max=90
    map.map(block,item,itemspeed,itemslow,cx,cy,y_max,1)
    blocksize=len(block)-1
    under=0
    changeb=[3,3]
    itemlen=len(item)-1
    itemspeedlen=len(itemspeed)-1
    itemslowlen=len(itemslow)-1
    print(blocksize,itemlen,itemspeedlen,itemslowlen)
    #print(item)
    #print(blocksize)
    changeball=0
    ballx=[3,3]
    fast=pygame.image.load("rabbit.jpg")
    slow=pygame.image.load("turtle.jpg")
    changeswap=pygame.image.load("change.jpg")
    tickspeed=50
    swap=1
    st=0
    st1=0
    st2=0
    next=0
    itemnext=0
    itemspeednext=0
    itemslownext=0
    stemp=[-1,1]
    qr=[fast,slow,changeswap]
    judgment=[[],[],[]]
    judgmentmessage=["perfect","slow","fast"]
    judgmentcolor=[(0,255,0),(255,128,0),(255,0,0)]
    qp=0
    ani=[0]*(blocksize+1)
    SURFACE.fill((0,0,0))
    font1=pygame.font.SysFont('notosansmonocjkkrregular',100)
    img1=font1.render("3",True,(255,255,255))
    SURFACE.blit(img1, (500,500))
    pygame.display.update()
    FPSCLOCK.tick(1)
    SURFACE.fill((0,0,0))
    font1=pygame.font.SysFont('notosansmonocjkkrregular',100)
    img1=font1.render("2",True,(255,255,255))
    SURFACE.blit(img1, (500,500))
    pygame.display.update()
    FPSCLOCK.tick(1)
    SURFACE.fill((0,0,0))
    font1=pygame.font.SysFont('notosansmonocjkkrregular',100)
    img1=font1.render("1",True,(255,255,255))
    SURFACE.blit(img1, (500,500))
    pygame.display.update()
    FPSCLOCK.tick(1)
    SURFACE.fill((0,0,0))
    font1=pygame.font.SysFont('notosansmonocjkkrregular',100)
    img1=font1.render("Start",True,(255,255,255))
    SURFACE.blit(img1, (450,500))
    pygame.display.update()
    FPSCLOCK.tick(1)
    my_image=pygame.Surface((50,50))
    #pygame.mixer.music.load('star.mp3')
    #pygame.mixer.music.play(1)
    #start=time.time()
    while 1:
        
        #print(time.time()-start)
        qnext=0
        rnext=0
        inext=0
        SURFACE.fill((0,0,0))
        pygame.draw.rect(SURFACE,(0,255,0),(block[min(blocksize,next)][0],block[min(blocksize,next)][1],block[min(blocksize,next)][2],block[min(blocksize,next)][3]),3)
        pygame.draw.rect(SURFACE,(0,255,0),(block[min(blocksize,next+1)][0],block[min(blocksize,next+1)][1],block[min(blocksize,next+1)][2],block[min(blocksize,next+1)][3]),3)
        pygame.draw.rect(SURFACE,(0,255,0),(block[min(blocksize,next+2)][0],block[min(blocksize,next+2)][1],block[min(blocksize,next+2)][2],block[min(blocksize,next+2)][3]),3)
        #change
        if block[min(blocksize,next+1)][0]-45<=item[min(itemlen,itemnext)][0]<=block[min(blocksize,next+1)][0]+45 and \
            block[min(blocksize,next+1)][1]-25<=item[min(itemlen,itemnext)][1]<=block[min(blocksize,next+1)][1]+25:
            if block[min(blocksize,next+1)][4]==1:
                SURFACE.blit(changeswap,(item[min(itemlen,itemnext)][0],item[min(itemlen,itemnext)][1]))
                qnext=1
        if block[min(blocksize,next+2)][0]-45<=item[min(itemlen,itemnext+qnext)][0]<=block[min(blocksize,next+2)][0]+45 and \
            block[min(blocksize,next+2)][1]-25<=item[min(itemlen,itemnext+qnext)][1]<=block[min(blocksize,next+2)][1]+25:
            if block[min(blocksize,next+2)][4]==1:
                SURFACE.blit(changeswap,(item[min(itemlen,itemnext+qnext)][0],item[min(itemlen,itemnext+qnext)][1]))
        #speed
        if block[min(blocksize,next+1)][0]-45<=itemspeed[min(itemspeedlen,itemspeednext)][0]<=block[min(blocksize,next+1)][0]+45 and \
            block[min(blocksize,next+1)][1]-25<=itemspeed[min(itemspeedlen,itemspeednext)][1]<=block[min(blocksize,next+1)][1]+25:
            if block[min(blocksize,next+1)][4]==2:
                SURFACE.blit(fast,(itemspeed[min(itemspeedlen,itemspeednext)][0],itemspeed[min(itemspeedlen,itemspeednext)][1]))
                rnext=1
        if block[min(blocksize,next+2)][0]-45<=itemspeed[min(itemspeedlen,itemspeednext+rnext)][0]<=block[min(blocksize,next+2)][0]+45 and \
           block[min(blocksize,next+2)][1]-25<=itemspeed[min(itemspeedlen,itemspeednext+rnext)][1]<=block[min(blocksize,next+2)][1]+25:
            if block[min(blocksize,next+2)][4]==2:
                SURFACE.blit(fast,(itemspeed[min(itemspeedlen,itemspeednext+rnext)][0],itemspeed[min(itemspeedlen,itemspeednext+rnext)][1]))
        #slow
        if block[min(blocksize,next+1)][0]-45<=itemslow[min(itemslowlen,itemslownext)][0]<=block[min(blocksize,next+1)][0]+45 and \
            block[min(blocksize,next+1)][1]-25<=itemslow[min(itemslowlen,itemslownext)][1]<=block[min(blocksize,next+1)][1]+25:
            if block[min(blocksize,next+1)][4]==3:
                SURFACE.blit(slow,(itemslow[min(itemslowlen,itemslownext)][0],itemslow[min(itemslowlen,itemslownext)][1]))
                inext=1
        if block[min(blocksize,next+2)][0]-45<=itemslow[min(itemslowlen,itemslownext+inext)][0]<=block[min(blocksize,next+2)][0]+45 and \
            block[min(blocksize,next+2)][1]-25<=itemslow[min(itemslowlen,itemslownext+inext)][1]<=block[min(blocksize,next+2)][1]+25:
            if block[min(blocksize,next+1)][4]==3:
                SURFACE.blit(slow,(itemslow[min(itemslowlen,itemslownext+inext)][0],itemslow[min(itemslowlen,itemslownext+inext)][1]))
        #print(judgment)
        for i_ in range(3):
            tpop=-1
            for i in judgment[i_]:
                tpop+=1
                if i[2]<=tickspeed:
                    font1=pygame.font.SysFont('notosansmonocjkkrregular',30)
                    img1=font1.render(judgmentmessage[i_],True,judgmentcolor[i_])
                    SURFACE.blit(img1, (i[0]+20,i[1]-40))
                    i[2]+=1
                    
                else:
                    judgment[i_].pop(tpop)

                
        if block[min(blocksize,next+2)][0]-45<=itemslow[min(itemslowlen,itemslownext+inext)][0]<=block[min(blocksize,next+2)][0]+45 and \
           block[min(blocksize,next+2)][1]-25<=itemslow[min(itemslowlen,itemslownext+inext)][1]<=block[min(blocksize,next+2)][1]+25:
            if block[min(blocksize,next+2)][4]==3:
                SURFACE.blit(slow,(itemslow[min(itemslowlen,itemslownext+inext)][0],itemslow[min(itemslowlen,itemslownext+inext)][1]))
        rx=cx+y_max*math.sin(ballx[changeball%2])
        ry=cy+y_max*math.cos(ballx[changeball%2])
        rx1=cx+y_max*math.sin(ballx[changeball%2]+stemp[swap%2]*0.4)
        ry1=cy+y_max*math.cos(ballx[changeball%2]+stemp[swap%2]*0.4)
        rx2=cx+y_max*math.sin(ballx[changeball%2]+stemp[swap%2]*0.7)
        ry2=cy+y_max*math.cos(ballx[changeball%2]+stemp[swap%2]*0.7)
        
        if changeball%2==0:pygame.draw.circle(SURFACE,(255,0,0),(int(cx+25),int(cy+25)),90,2)
        else:pygame.draw.circle(SURFACE,(0,84,255),(int(cx+25),int(cy+25)),90,2)
        crxy=[[cx,cy],[rx,ry]]
        crxy1=[[cx,cy],[rx1,ry1]]
        crxy2=[[cx,cy],[rx2,ry2]]
        qx=crxy[0][0]
        qy=crxy[0][1]
        #print(crxy)
        #print((changeball+1)%2)
        pygame.draw.ellipse(SURFACE,(255,80,0),Rect(crxy2[changeball%2][0],crxy2[changeball%2][1],50,50)) #turn
        pygame.draw.ellipse(SURFACE,(255,60,0),Rect(crxy1[changeball%2][0],crxy1[changeball%2][1],50,50)) #turn
        pygame.draw.ellipse(SURFACE,(255,0,0),Rect(crxy[changeball%2][0],crxy[changeball%2][1],50,50)) #turn
        pygame.draw.ellipse(SURFACE,(0,84,255),Rect(crxy2[(changeball+1)%2][0],crxy2[(changeball+1)%2][1],50,50))
        pygame.draw.ellipse(SURFACE,(0,44,255),Rect(crxy1[(changeball+1)%2][0],crxy1[(changeball+1)%2][1],50,50))
        pygame.draw.ellipse(SURFACE,(0,4,255),Rect(crxy[(changeball+1)%2][0],crxy[(changeball+1)%2][1],50,50))
        if swap%2==0:ballx[changeball%2]+=0.1
        else:ballx[changeball%2]-=0.1
        key=0
        for event  in pygame.event.get():
            if event.type==QUIT:pygame.quit();sys.exit()
            elif event.type==KEYDOWN:key=event.key
            if key==K_DOWN or key==K_LEFT or key==K_RIGHT or key==K_UP:
                if block[min(blocksize,next+1)][1]-25<=ry<=block[min(blocksize,next+1)][1]+25 and block[min(blocksize,next+1)][0]-45<=rx<=block[min(blocksize,next+1)][0]+45:

                    if block[min(blocksize,next+1)][1]-10<=ry<=block[min(blocksize,next+1)][1]+10:judgment[0].append([block[min(blocksize,next+1)][0],block[min(blocksize,next+1)][1],0])
                    elif block[min(blocksize,next+1)][1]+10<=ry:judgment[1].append([block[min(blocksize,next+1)][0],block[min(blocksize,next+1)][1],0])
                    elif block[min(blocksize,next+1)][1]-10>=ry:judgment[2].append([block[min(blocksize,next+1)][0],block[min(blocksize,next+1)][1],0])

                    if block[min(blocksize,next+1)][1]-25<=item[min(itemlen,itemnext)][1]<=block[min(blocksize,next+1)][1]+25 and \
                       block[min(blocksize,next+1)][0]-45<=item[min(itemlen,itemnext)][0]<=block[min(blocksize,next+1)][0]+45:
                        if block[min(blocksize,next+1)][4]==1:
                            swap+=1
                            itemnext+=1
                    if block[min(blocksize,next+1)][1]-25<=itemspeed[min(itemspeedlen,itemspeednext)][1]<=block[min(blocksize,next+1)][1]+25 and \
                       block[min(blocksize,next+1)][0]-45<=itemspeed[min(itemspeedlen,itemspeednext)][0]<=block[min(blocksize,next+1)][0]+45:
                        if block[min(blocksize,next+1)][4]==2:
                            tickspeed+=5
                            itemspeednext+=1
                    if block[min(blocksize,next+1)][1]-25<=itemslow[min(itemslowlen,itemslownext)][1]<=block[min(blocksize,next+1)][1]+25 and \
                       block[min(blocksize,next+1)][0]-45<=itemslow[min(itemslowlen,itemslownext)][0]<=block[min(blocksize,next+1)][0]+45:
                        if block[min(blocksize,next+1)][4]==3:
                            tickspeed-=5
                            itemslownext+=1
                    #cx=rx;cy=ry
                    #print("qp",qp)
                    if block[min(blocksize,next+1)][4]!=4:
                        if block[min(blocksize,next+1)][2]==70:
                            cx=block[min(blocksize,next+1)][0]+10
                            cy=block[min(blocksize,next+1)][1]
                        else:
                            cx=block[min(blocksize,next+1)][0]+25
                            cy=block[min(blocksize,next+1)][1]
                        changeball+=1;st=0;st1=0;st2=0
                        ballx[changeball%2]=ballx[(changeball+1)%2]+changeb[swap%2]
                        next+=1
                else:
                    qewqr=0
                    #pygame.mixer.music.stop()
                    #pygame.mixer.music.load('star.mp3')
                    #pygame.mixer.music.play(1)
                    #under=0;cx=200;cy=200;ballx=[3,3];changeball=0;
                    #st=0;st1=0;st2=0
                    #next=0
                    #itemnext=0
                    #itemspeednext=0
                    #itemslownext=0
                    #tickspeed=50
                    #swap=1
        pygame.display.update()
        FPSCLOCK.tick(tickspeed)
start()

(이건 메인 코드이다.)

import sys
import random
import pygame
import time
import math
from tkinter import *
from tkinter import messagebox
from pygame.locals import QUIT,KEYDOWN,K_LEFT,K_RIGHT,K_UP,K_DOWN,Rect,MOUSEBUTTONDOWN,K_SPACE
def map(block,item,itemspeed,itemslow,cx,cy,y_max,cm):
    if cm==1:
        #y_max+=90
        #cx+=200
        #cy+=200
        block+=[[180+i*90,200,90,50,0] for i in range(8)]+[[180+i*90,290,90,50,0] for i in range(7,-1,-1)]+[[200,380,70,50,0]]+[[270+i*90,380,90,50,0] for i in range(7)]
        block+=[[810,470,70,50,0]]+[[270+i*90,470,90,50,0] for i in range(5,-1,-1)]+[[200,470,70,50,0]]
        block+=[[200,560,70,50,0],[270,560,90,50,0],[360,560,90,50,0],[450,560,70,50,0],[450,470,70,50,0],[360,470,90,50,0],[380,560,90,50,0],[470,560,90,50,0],[560,560,70,50,0]]
        block+=[[560,470,70,50,0],[470,470,90,50,0],[470,380,90,50,0],[560,380,70,50,0],[560,290,70,50,0],[470,290,90,50,0]]
        block+=[[380,290,90,50,0],[310,290,70,50,0],[310,380,70,50,0],[310,470,70,50,0],[310,560,70,50,0]]
        block+=[[380,560,90,50,1],[470,560,90,50,1],[560,560,90,50,1],[650,560,90,50,1],[740,560,90,50,1],[830,560,70,50,1]]
        block+=[[830,470,70,50,0],[830,380,70,50,0],[830,290,70,50,0],[830,200,70,50,0]]
        block+=[[740,200,90,50,0],[650,200,90,50,0],[560,200,90,50,0],[470,200,90,50,0],[380,200,90,50,0],[290,200,90,50,0]]
        for i in range(5):
            block.extend([[290,290+i*90,70,50,0],[380,290+i*90,70,50,0],[380,200+i*90,70,50,0],[290,200+i*90,70,50,0],[290,290+i*90,70,50,0]])
        block+=[[290,740,90,50,0],[380,740,90,50,0],[470,740,90,50,0],[560,740,70,50,1],[470,740,70,50,1],[560,740,70,50,1]]
        block+=[[560,650,70,50,0],[560,560,70,50,0],[560,470,70,50,0],[560,380,70,50,0]]#,[650,380,70,50,4],[470,380,90,50,0]]
        block[7][2]=70
        block[8][2]=70
        block[15][0]+=20
        block[15][2]=70
        block[23][2]=70
        block[3][4]=2
        block[66][4]=3
        item+=[[830,205,90,50],[380,295,90,50],[650,385,90,50],[200,565,70,50],[500,475,70,50],[570,385,70,50]]
        item+=[[400,565,90,50],[490,565,90,50],[580,565,90,50],[670,565,90,50],[760,565,90,50],[850,565,90,50],[580,745,90,50],[490,745,90,50],[580,745,90,50]]
        block[7][4]=1
        block[13][4]=1
        block[21][4]=1
        block[24][4]=1
        block[32][4]=1
        block[42][4]=1
        block[44][4]=1
        itemspeed+=[[470,205,90,50],[670,205,90,50],[400,205,90,50]]
        itemslow+=[[390,205,90,50]]
    elif cm==2:
        block+=[[180+i*90,200,90,50,0] for i in range(8)]+[[810,290+i*90,70,50,0] for i in range(7)]
        block+=[[720,830,70,50,1],[720,740,70,50,1],[630,740,70,50,1],[630,650,70,50,1],[540,650,70,50,1],[540,560,70,50,1],[450,560,70,50,1],[450,470,70,50,1],[360,470,70,50,1]]
        block+=[[360,380,90,50,0],[270,380,90,50,0],[270,470,90,50,3],[270,560,90,50,3],[270,650,90,50,0],[270,740,90,50,0],[270,830,90,50,0]]
        block+=[[270,740,70,50,0],[360,740,70,50,0],[360,830,70,50,0],[270,830,70,50,0]]
        block+=[[270,740,70,50,0],[360,740,70,50,0],[360,830,70,50,0],[270,830,70,50,0]]
        block+=[[270,740,70,50,0],[360,740,70,50,0],[360,830,70,50,0],[270,830,70,50,0]]
        block[2][4]=2
        block[7][2]=70
        itemspeed+=[[380,205,90,50]]
        item+=[[740,835,90,50],[740,745,90,50],[650,745,90,50],[650,655,90,50],[560,655,90,50],[560,565,90,50],[470,565,90,50],[470,475,90,50],[380,475,90,50]]
        itemslow+=[[290,475,90,50],[290,565,90,50]]
    elif cm==3:
        block+=[[180+i*90,200,90,50,0] for i in range(8)]+[[180+i*90,290,90,50,0] for i in range(7,-1,-1)]
        block+=[[180+i*90,380,90,50,0] for i in range(8)]+[[180+i*90,470,90,50,0] for i in range(7,-1,-1)]
        block+=[[180+i*90,560,90,50,0] for i in range(8)]+[[180+i*90,650,90,50,0] for i in range(7,-1,-1)]
        block+=[[180+i*90,740,90,50,0] for i in range(8)]+[[180+i*90,830,90,50,0] for i in range(7,-1,-1)]
        block[7][4]=1
        block[15][4]=1
        block[23][4]=1
        block[31][4]=1
        block[39][4]=1
        block[47][4]=1
        block[55][4]=1
        block[63][4]=1
        itemspeed+=[[0,0,0,0]]
        item+=[[830,205,90,50],[200,295,90,50],[830,385,90,50],[200,475,90,50],[830,565,90,50],[200,655,90,50],[830,745,90,50],[200,835,90,50]]
        itemslow+=[[-10,-10,101,10]]

(이건 맵 코드이다.)

이걸 해보고 싶으면 2번째 코드는 map이라고 저장하고 1번째 코드는 A Dance of Fire and Ice라고 저장한다 그리고 pygame을 설치해야 되고 파이썬 파일은 같은 위치에 있어야 한다. 아직 exe파일로 변환은 안 해놔서 나중에 exe파일로 바꾸면 그때 파일로 올리겠다.

A Dance of Fire and Ice game.py
0.01MB
change.jpg
0.00MB
map.py
0.00MB
rabbit.jpg
0.00MB
star.mp3
2.18MB
test.py
0.00MB
turtle.jpg
0.00MB

그림파일도 저장해야지 오류 없이 사용할 수 있다.

 

'개발' 카테고리의 다른 글

2048게임 제작  (5) 2021.02.28
디스코드 봇 업데이트  (0) 2021.02.08
디스코드 봇 개발  (1) 2021.01.25
tile게임 만들기  (0) 2021.01.15
오목 게임 만들기  (0) 2021.01.13
댓글