🧽Python/~2021.01

멀티 서바이벌게임 만들기 Python #1

Mawile 2020. 11. 14.
728x90

 

 

개발환경 >> PythonIdle

언어 >> Python 3.8.5

운영체제 >> Windows10

 

 

 

 


 

 

안녕하세요

이번에는 파이썬으로 멀티 게임 만들기 시리즈인데요

지금은 대충 아무이미지나 쓸 거지만

나중에 완성단계 가면 그림도 리뉴얼할 거예요

 

그러면 코드 설명과 코드 갑니다~~

 

 


 

 

[[[   서버   ]]]

import pygame #게임을위한 메인모듈
import pyautogui #조작감살짝 늘리기
import sys #콘솔창제어
import socket #소켓
import threading #멀티쓰레딩


pygame.init() #시작
pygame.display.set_caption('helloworld') #제목
height=960 #세로
width=1200 #가로


enemy_img = pygame.image.load('dd.png') #이미지로드
imgw=enemy_img.get_size()[0] #[0]은 이미지 가로길이
imgh=enemy_img.get_size()[1] #[1]은 이미지 세로길이
enex=0 #현재 적의 x좌표
eney=imgw #현재 적의 y좌표

def consoles():
    global eney,enex
    while True:
        msg=client.recv(1024)
        if(msg.decode()=='up'): #소켓으로부터받은데이터가 up일경우 적y좌표조정
            eney-=30
        elif(msg.decode()=='down'): #소켓으로부터받은데이터가 down일경우 적y좌표조정
            eney+=30
        elif(msg.decode()=='right'): #소켓으로부터받은데이터가 right일경우 적x좌표조정
            enex+=30
        elif(msg.decode()=='left'): #소켓으로부터받은데이터가 left일경우 적x좌표조정
            enex-=30


def acceptC():
    global client,server,addr
    server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    server.bind(('서버아이피주소',8080))
    server.listen()
    client,addr=server.accept()

    thr=threading.Thread(target=consoles,args=())
    #클라이언트로부터 받는 데이터를 관리하기위한
    #멀티쓰레딩(밑에는 데몬스레드라고 선언 -> c++로 따지면 detach와같습니다)
    thr.Daemon=True
    thr.start()



def GameMain():
    global eney,enex
    screen = pygame.display.set_mode((width,height))
    fps = pygame.time.Clock()

    img = pygame.image.load('dd.png') #이미지불러오기
    imgh=img.get_size()[1]
    imgw=img.get_size()[0]
    x=0
    y=imgw


    while True:
        screen.fill((255,255,255))

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                    pyautogui.keyUp('up')
                    #이걸하는이유는 키보드를 꾹누르고있으면 원래는 한번가는데
                    #이걸하면은 쭉누르면 쭉갑니다
                    y-=30
                    msg="up"
                    client.sendall(msg.encode()) #클라이언트에게 내가내린명령전송
                elif event.key == pygame.K_DOWN:
                    pyautogui.keyUp('down')
                    y+=30
                    msg="down"
                    client.sendall(msg.encode())
                elif event.key == pygame.K_RIGHT:
                    pyautogui.keyUp('right')
                    x+=30
                    msg="right"
                    client.sendall(msg.encode())
                elif event.key == pygame.K_LEFT:
                    pyautogui.keyUp('left')
                    x-=30
                    msg="left"
                    client.sendall(msg.encode())


        if img.get_size()[0]+x >= width: #x좌표조절
            x=width-img.get_size()[0]
        elif x <= 0:
            x=0
        if img.get_size()[1]+y >= height: #y좌표조절(스크린에서 안나가게끔)
            y=height-img.get_size()[1]
        elif y <= 0:
            y=0

        if enemy_img.get_size()[0]+enex >= width: #위와같습니다
            enex=width-enemy_img.get_size()[0]
        elif enex <= 0:
            enex=0
        if enemy_img.get_size()[1]+eney >= height:
            eney=height-enemy_img.get_size()[1]
        elif eney <= 0:
            eney=0
            
        screen.blit(img,(x,y)) #이미지그리기
        screen.blit(enemy_img,(enex,eney)) #이미지그리기

        pygame.display.update() #디스플레이 업데이트
        fps.tick(60) #fps는 60


if __name__ == '__main__':
    acceptC() 
    GameMain()

 

 

[[[   클라이언트   ]]]

 

import pygame
import pyautogui
import sys
import socket
import threading


pygame.init()
pygame.display.set_caption('helloworld')
height=960
width=1200


enemy_img = pygame.image.load('dd.png')
imgw=enemy_img.get_size()[0]
imgh=enemy_img.get_size()[1]
enex=0
eney=imgw

def consoles():
    global eney,enex
    while True:
        msg=client.recv(1024)
        if(msg.decode()=='up'):
            eney-=30
        elif(msg.decode()=='down'):
            eney+=30
        elif(msg.decode()=='right'):
            enex+=30
        elif(msg.decode()=='left'):
            enex-=30


def acceptC():
    global client
    client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    client.connect(('서버아이피주소',8080))

    thr=threading.Thread(target=consoles,args=())
    thr.Daemon=True
    thr.start()



def GameMain():
    global eney,enex
    screen = pygame.display.set_mode((width,height))
    fps = pygame.time.Clock()

    img = pygame.image.load('dd.png')
    imgh=img.get_size()[1]
    imgw=img.get_size()[0]
    x=0
    y=imgw


    while True:
        screen.fill((255,255,255))

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                    pyautogui.keyUp('up')
                    y-=30
                    msg="up"
                    client.sendall(msg.encode())
                elif event.key == pygame.K_DOWN:
                    pyautogui.keyUp('down')
                    y+=30
                    msg="down"
                    client.sendall(msg.encode())
                elif event.key == pygame.K_RIGHT:
                    pyautogui.keyUp('right')
                    x+=30
                    msg="right"
                    client.sendall(msg.encode())
                elif event.key == pygame.K_LEFT:
                    pyautogui.keyUp('left')
                    x-=30
                    msg="left"
                    client.sendall(msg.encode())


        if img.get_size()[0]+x >= width:
            x=width-img.get_size()[0]
        elif x <= 0:
            x=0
        if img.get_size()[1]+y >= height:
            y=height-img.get_size()[1]
        elif y <= 0:
            y=0

        if enemy_img.get_size()[0]+enex >= width:
            enex=width-enemy_img.get_size()[0]
        elif enex <= 0:
            enex=0
        if enemy_img.get_size()[1]+eney >= height:
            eney=height-enemy_img.get_size()[1]
        elif eney <= 0:
            eney=0
            
            
        screen.blit(img,(x,y))
        screen.blit(enemy_img,(enex,eney))

        pygame.display.update()
        fps.tick(60)


if __name__ == '__main__':
    acceptC()
    GameMain()

 

 

사실 상,,, 클라이언트도 서버와 게임 인터페이스 부분은 동일하지만,

소켓 쪽만 다릅니다~

 

그리고 여기서쓰인사진 "dd.png"은(는) 밑에다가 첨부해놓겠습니다~

dd.png
0.00MB

728x90

 

 


 

[[[   시연 영상   ]]]

 

 

 

 


 

 

그럼 봐주셔서 감사합니다~!!!

모르는 부분 있으면 댓글로 질문 주세요~~!!! 제발..ㅠㅠ!!!!!!

728x90

댓글