# game
import pygame
import random
import math
from lib_2048 import *
from socket import *
"""계 획:
소켓을 활용하여 대기실 + 연동돼는 플레이 만들기.
대기실:
미루기.
연동플:
데이터(숫자 배열 1개와 공격 배열)를 받아 적용시키기..
temp
data = cls.recv(1024)
print(data.decode('utf-8'))
"""
# pygame setup
pygame.init()
screen_size = (1720, 1000)
screen = pygame.display.set_mode(screen_size)
clock = pygame.time.Clock()
running = True
curr_state = ''
state = 'lobby'
currpl = 1
box = pygame.Rect(0, 0, 600, 600)
box.center = (1720 / 4, 1000 / 2)
you = [[0 for i in range(4)] for i in range(4)]
other = [[0 for i in range(4)] for i in range(4)]
sp = [2, 2, 2, 2, 2, 2, 2, 2, 2, 4]
myatt = []
normalFont = pygame.font.SysFont(None, 50)
box_color = ["#CCCC77", "#DDDD88", "#EEEE99", "#FFFFAA", "#FFFFBB", "#FFFFCC", "#FFFFDD", "#FFFFEE", "#FFFFFF",
"#777777", "#666666", "#555555", "#444444", "#333333", "#222222", "#111111", "#000000", "#FFEEFF",
"#FFFFFF"]
text_color = ["#000000", "#000000", "#000000", "#000000", "#000000", "#000000", "#000000", "#000000", "#000000",
"#FFFFFF", "#FFFFFF", "#FFFFFF", "#FFFFFF", "#FFFFFF", "#FFFFFF", "#FFFFFF", "#FFFFFF", "#FF55FF",
"#999999"]
key_hold = 0
# socket
yclisoc = socket(AF_INET,SOCK_STREAM)
HOST = '127.0.0.1'
cls = ''
con_ip = ''
con_port = ''
host_port = ''
PORT = 15785
user_name = ''
max_pl = 4
ec = ''
addr = ''
# #def draw(who,vs1):
# p_rect = ((1720/4 - 300 + 10) + 146 * j, (1000/2 - 300 + 10) + 146 * i, 142, 142)
# if who[i][j] == 0:
# pygame.draw.rect(screen, "#EEEEAA", p_rect, 0, 5)
# else:
# if who[i][j] < 0:
# pygame.draw.rect(screen, "#888888", p_rect, 0, 5)
# text = normalFont.render("%d" % who[i][j], True, "#444444")
# else:
# if who[i][j] > 262144:
# pygame.draw.rect(screen, box_color[19 - 1], p_rect, 0, 5)
# else:
# pygame.draw.rect(screen, box_color[int(math.log2(who[i][j]) - 1)], p_rect, 0, 5)
# if who[i][j] > 262144:
# text = normalFont.render("%d" % who[i][j], True, text_color[19 - 1])
# elif who[i][j] == 262144:
# text = normalFont.render("Max", True, text_color[int(math.log2(who[i][j]) - 1)])
# else:
# text = normalFont.render("%d" % who[i][j], True, text_color[int(math.log2(who[i][j]) - 1)])
# text_r = text.get_rect()
# cen = (211+146*j,242+146*i)
# text_r.center = cen
# screen.blit(text, text_r)
errorResulted = False
errorMsg = ''
client_freeze = False
def Lose(who):
v = False
for i in range(4):
for j in range(4):
if j != 3 and (who[i][j] == who[i][j + 1] or who[i][j + 1] == 0):
v = True
if j != 0 and (who[i][j] == who[i][j - 1] or who[i][j - 1] == 0):
v = True
if i != 3 and (who[i][j] == who[i + 1][j] or who[i + 1][j] == 0):
v = True
if i != 0 and (who[i][j] == who[i - 1][j] or who[i - 1][j] == 0):
v = True
return v
def events(event):
global running
if event.type == pygame.QUIT:
running = False
def gamestart():
for i in range(2):
randomSpawn(you)
def drawtext(font,size,text,color,center):
main_text = pygame.font.SysFont(font, size).render(text, True, color)
mtc = main_text.get_rect()
mtc.center = center
screen.blit(main_text, mtc)
def drawrect(color,x,y,sizex,sizey,outlineEnable,out_color,Outwidth,brr):
box = pygame.draw.rect(screen, color,(x - sizex / 2, y - sizey / 2, sizex, sizey), 0,brr)
if outlineEnable:
out = pygame.draw.rect(screen, out_color, (x - sizex / 2, y - sizey / 2, sizex, sizey), Outwidth, brr)
return box
"""
state
lobby
connecting_ip/port
ingame
gameStarting
gameEnded
host_port
waiting_room
"""
while running:
# poll for events
# pygame.QUIT event means the user clicked X to close your window
for event in pygame.event.get():
events(event)
if event.type == pygame.KEYDOWN:
#if state == 'Hosting'
if state == 'connecting_ip':
if event.key == pygame.K_ESCAPE:
state = 'lobby'
con_ip = ''
elif event.key == pygame.K_BACKSPACE:
if len(con_ip) > 0:
con_ip = con_ip[:-1]
elif event.key == pygame.K_RETURN:
state = 'connecting_port'
client_freeze = True
elif len(con_ip) < 50:
con_ip += event.unicode
elif state == 'connecting_port':
if not client_freeze:
if event.key == pygame.K_ESCAPE:
state = 'connecting_ip'
con_port = ''
elif event.key == pygame.K_BACKSPACE:
if len(con_port) > 0:
con_port = con_port[:-1]
elif event.key == pygame.K_RETURN and len(con_port) > 0:
state = 'connecting_name'
elif len(con_port) < 5:
con_port += event.unicode
if not con_port.isdigit():
con_port = con_port[:-1]
else:
client_freeze = False
elif state == 'connecting_name':
if event.key == pygame.K_ESCAPE:
state = 'connecting_port'
user_name = ''
elif event.key == pygame.K_BACKSPACE:
if len(user_name) > 0:
con_port = con_port[:-1]
elif event.key == pygame.K_RETURN and len(user_name) > 0:
try:
yclisoc.connect((con_ip, int(con_port)))
state = 'waiting_room'
curr_state = 'cilent'
except ConnectionRefusedError:
state = 'lobby'
curr_state = ''
con_ip = ''
con_port = ''
errorResulted = True
errorMsg = 'Invaild Ip or Port or host not opened room'
elif len(user_name) < 50:
user_name += event.unicode
if state == 'host_port':
if event.key == pygame.K_ESCAPE:
state = 'lobby'
host_port = ''
elif event.key == pygame.K_BACKSPACE:
if len(host_port) > 0:
host_port = host_port[:-1]
elif event.key == pygame.K_RETURN:
#try:
yclisoc.bind(('',int(host_port)))
curr_state = 'host'
state = 'waiting_room'
#except:
elif len(host_port) < 5:
host_port += event.unicode
if not host_port.isdigit():
host_port = host_port[:-1]
if state == 'ingame':
w1 = banghyang(event.key, you, cls)
if not w1:
randomSpawn(you, sp)
screen.fill("#DDDD77")
if state == 'ingame':
att = cls.recv(1024)
print(att)
if att < 0:
myatt.append(att)
if len(att) > 0 and not full(you):
randomAttack(you, myatt)
v = Lose(you)
# fill the screen with a color to wipe away anything from last frame
pygame.draw.rect(screen, "#FFFFAA", box, 0, 10)
for i in range(4):
for j in range(4):
draw(you)
# flip() the display to put your work on screen
if not v:
t = pygame.font.SysFont("Lucida Console", 140).render("Defeat", True, (0, 0, 0))
t_r = t.get_rect()
t_r.center = (1720/2,1000/2)
screen.blit(t, t_r)
else:
if state == 'lobby':
if errorResulted:
drawtext(None,55,errorMsg,(0,0,0),(1720/2,800))
drawtext("britannic",75,"tmc 2048",(0,0,0),(1720/2,100))
#connect
cn_box = drawrect((255,255,255),1720/2,1000/2-100,600,75,True,(0,0,0),4,10)
drawtext(None,45,"connect",(0,0,0),(1720/2,1000/2-100))
if cn_box.collidepoint(pygame.mouse.get_pos()):
if pygame.mouse.get_pressed()[0] == 1:
errorResulted = False
state = 'connecting_ip'
#Host
hs_box = drawrect((255, 255, 255), 1720 / 2, 1000 / 2 + 25, 600, 75, True, (0, 0, 0), 4,10)
drawtext(None, 45, "Host", (0, 0, 0), (1720 / 2, 1000 / 2 + 25))
if hs_box.collidepoint(pygame.mouse.get_pos()):
if pygame.mouse.get_pressed()[0] == 1:
errorResulted = False
state = 'host_port'
if state == 'wating_room' and curr_state == 'host':
#att = yclisoc.recv(1024)
drawrect("#CCCC66",1720/2,1000/2,700,600,True,"#AAAA55",3,0)
drawtext(None,45,"players","#000000",(1720/2-400,1000/2-290))
elif curr_state == 'cilent' and state == 'waiting_room':
#att = yclisoc.recv(1024)
drawrect("#CCCC66",1720/2,1000/2,700,600,True,"#AAAA55",3,0)
drawtext(None,45,"players","#000000",(1720/2-400,1000/2-290))
if state == 'connecting_ip':
text_input_ip = drawrect((255,255,255),1720/2,1000/2 - 100,800,75,True,(0,0,0),10,0)
drawtext(None,55,"Enter Host Ip",(0,0,0),(1720/2,1000/2))
drawtext(None,45,con_ip,(0,0,0),(1720/2,1000/2-100))
elif state == 'connecting_port':
text_input_port = drawrect((255, 255, 255), 1720 / 2, 1000 / 2 - 100, 800, 75, True, (0, 0, 0), 10, 0)
drawtext(None, 55, "Enter Host port", (0, 0, 0), (1720 / 2, 1000 / 2))
drawtext(None, 45, con_port, (0, 0, 0), (1720 / 2, 1000 / 2 - 100))
elif state == 'connecting_name':
text_input_port = drawrect((255, 255, 255), 1720 / 2, 1000 / 2 - 100, 800, 75, True, (0, 0, 0), 10, 0)
drawtext(None, 55, "Enter your display name", (0, 0, 0), (1720 / 2, 1000 / 2))
drawtext('굴림', 45, user_name, (0, 0, 0), (1720 / 2, 1000 / 2 - 100))
if state == 'host_port':
text_input_host = drawrect((255, 255, 255), 1720 / 2, 1000 / 2 - 100, 800, 75, True, (0, 0, 0), 10, 0)
drawtext(None, 55, "Enter port", (0, 0, 0), (1720 / 2, 1000 / 2))
drawtext(None, 45, host_port, (0, 0, 0), (1720 / 2, 1000 / 2 - 100))
#if state == 'gameEnded':
# cls.close()
pygame.display.flip()
clock.tick(60) # limits FPS to 60
pygame.quit()
import pygame
import random
import math
import socket
from socket import *
HOST = '127.0.0.1'
PORT = 15785
"""계 획:
소켓을 활용하여 대기실 + 연동돼는 플레이 만들기.
대기실:
미루기.
연동플:
데이터(숫자 배열 1개와 공격 배열)를 받아 적용시키기..
temp
data = cls.recv(1024)
print(data.decode('utf-8'))
"""
# pygame setup
pygame.init()
box = pygame.Rect(0, 0, 600, 600)
box.center = (1720 / 4, 1000 / 2)
you = [[0 for i in range(4)] for i in range(4)]
other = [[0 for i in range(4)] for i in range(4)]
normalFont = pygame.font.SysFont(None, 50)
box_color = ["#CCCC77", "#DDDD88", "#EEEE99", "#FFFFAA", "#FFFFBB", "#FFFFCC", "#FFFFDD", "#FFFFEE", "#FFFFFF",
"#777777", "#666666", "#555555", "#444444", "#333333", "#222222", "#111111", "#000000", "#FFEEFF",
"#FFFFFF"]
text_color = ["#000000", "#000000", "#000000", "#000000", "#000000", "#000000", "#000000", "#000000", "#000000",
"#FFFFFF", "#FFFFFF", "#FFFFFF", "#FFFFFF", "#FFFFFF", "#FFFFFF", "#FFFFFF", "#FFFFFF", "#FF55FF",
"#999999"]
def randomSpawn(who,sp):
y = random.randrange(0, 4)
x = random.randrange(0, 4)
if who[y][x] == 0:
who[y][x] = random.choice(sp) * 32
else:
return randomSpawn(who)
def full(who):
v = True
for i in range(4):
for j in range(4):
if who[i][j] == 0:
v = False
return v
def attm(who):
for i in range(4):
for j in range(4):
if who[i][j] < 0:
who[i][j] += 1
def draw(who,screen, vs1):
for i in range(4):
for j in range(4):
if vs1:
p_rect = ((1720* (3/4) - 300 + 10) + 146 * j, (1000 / 2 - 300 + 10) + 146 * i, 142, 142)
else:
p_rect = ((1720 / 4 - 300 + 10) + 146 * j, (1000 / 2 - 300 + 10) + 146 * i, 142, 142)
if who[i][j] == 0:
pygame.draw.rect(screen, "#EEEEAA", p_rect, 0, 5)
else:
if who[i][j] < 0:
pygame.draw.rect(screen, "#888888", p_rect, 0, 5)
text = normalFont.render("%d" % who[i][j], True, "#444444")
else:
if who[i][j] > 262144:
pygame.draw.rect(screen, box_color[19 - 1], p_rect, 0, 5)
else:
pygame.draw.rect(screen, box_color[int(math.log2(who[i][j]) - 1)], p_rect, 0, 5)
if who[i][j] > 262144:
text = normalFont.render("%d" % who[i][j], True, text_color[19 - 1])
elif who[i][j] == 262144:
text = normalFont.render("Max", True, text_color[int(math.log2(who[i][j]) - 1)])
else:
text = normalFont.render("%d" % who[i][j], True, text_color[int(math.log2(who[i][j]) - 1)])
text_r = text.get_rect()
cen = (211 + 146 * j, 242 + 146 * i)
text_r.center = cen
screen.blit(text, text_r)
def randomAttack(victim, att):
y = random.randrange(0, 4)
x = random.randrange(0, 4)
if victim[y][x] == 0:
victim[y][x] = -att[0]
att.pop(0)
else:
return randomAttack(victim, att)
def banghyang(bv, who, stats, send):
x = 6
bl = True
for i in range(4):
for j in range(3):
if bv == pygame.K_UP or bv == pygame.K_w:
if who[j][i] != 0:
for k in range(3 - j):
if who[j + (k + 1)][i] == who[j][i]:
who[j][i] *= 2
who[j + (k + 1)][i] = 0
bl = False
if who[j][i] > 64:
if stats == 'client':
send.send(sangsae(who,(math.log2(who[j][i])+x)).encode('utf-8'))
break
elif who[j + (k + 1)][i] != 0:
break
if bv == pygame.K_DOWN or bv == pygame.K_s:
if who[3 - j][i] != 0:
for k in range(j + 1, 4):
if who[3 - k][i] == who[3 - j][i]:
who[3 - j][i] *= 2
who[3 - k][i] = 0
bl = False
if who[3 - j][i] > 64:
if stats == 'client':
send.send(sangsae(who,(math.log2(who[3 - j][i]) + x)).encode('utf-8'))
break
elif who[3 - k][i] != 0:
break
if bv == pygame.K_LEFT or bv == pygame.K_a:
if who[i][j] != 0:
for k in range(3 - j):
if who[i][j + (k + 1)] == who[i][j]:
who[i][j] *= 2
who[i][j + (k + 1)] = 0
bl = False
if who[i][j] > 64:
if stats == 'client':
send.send(sangsae(who,(math.log2(who[i][j])+x)).encode('utf-8'))
break
elif who[i][j + (k + 1)] != 0:
break
if bv == pygame.K_RIGHT or bv == pygame.K_d:
if who[i][3 - j] != 0:
for k in range(j + 1, 4):
if who[i][3 - k] == who[i][3 - j]:
who[i][3 - j] *= 2
who[i][3 - k] = 0
bl = False
if who[i][3 - j] > 64:
if stats == 'client':
send.send(sangsae(who,(math.log2(who[i][3 - j])+x)).encode('utf-8'))
break
elif who[i][3 - k] != 0:
break
if not bl:
attm(who)
sort(who,bv,bl)
return bl
def sort(who,bv,bl):
for i in range(4):
for j in range(3):
if bv == pygame.K_UP or bv == pygame.K_w:
if who[j][i] == 0:
for k in range(j + 1, 4):
if who[k][i] != 0:
who[j][i] = who[k][i]
who[k][i] = 0
bl = False
break
if bv == pygame.K_DOWN or bv == pygame.K_s:
if who[3 - j][i] == 0:
for k in range(j + 1, 4):
if who[3 - k][i] != 0:
who[3 - j][i] = who[3 - k][i]
who[3 - k][i] = 0
bl = False
break
if bv == pygame.K_LEFT or bv == pygame.K_a:
if who[i][j] == 0:
for k in range(j + 1, 4):
if who[i][k] != 0:
who[i][j] = who[i][k]
who[i][k] = 0
bl = False
break
if bv == pygame.K_RIGHT or bv == pygame.K_d:
if who[i][3 - j] == 0:
for k in range(j + 1, 4):
if who[i][3 - k] != 0:
who[i][3 - j] = who[i][3 - k]
who[i][3 - k] = 0
bl = False
break
return bl
def sangsae(w,n):
for i in range(4):
for j in range(4):
if w[i][j] < 0 and n!=0:
if w[i][j] + n >= 0:
n += w[i][j]
else:
w[i][j] += n
return 0
return n
def Lose(who):
v = False
for i in range(4):
for j in range(4):
if j != 3 and (who[i][j] == who[i][j + 1] or who[i][j + 1] == 0):
v = True
if j != 0 and (who[i][j] == who[i][j - 1] or who[i][j - 1] == 0):
v = True
if i != 3 and (who[i][j] == who[i + 1][j] or who[i + 1][j] == 0):
v = True
if i != 0 and (who[i][j] == who[i - 1][j] or who[i - 1][j] == 0):
v = True
return v
def gamestart():
for i in range(2):
randomSpawn(you)