458 lines
10 KiB
Python
458 lines
10 KiB
Python
|
import os
|
||
|
import time
|
||
|
import random as rand
|
||
|
import msvcrt
|
||
|
import time
|
||
|
|
||
|
os.system("color 17")
|
||
|
os.system("title '玩蛇'")
|
||
|
|
||
|
s_x = 50
|
||
|
s_y = 30
|
||
|
foods = []
|
||
|
ifmpy = 1
|
||
|
players = []
|
||
|
playctl = [["w","a","d","s"],["i","j","l","k"]]
|
||
|
s_playtime = time.clock()
|
||
|
|
||
|
|
||
|
def get_food(s_x,s_y,players,foods):
|
||
|
m_food = {}
|
||
|
ifcorrect = 0;
|
||
|
fx = int(rand.random()*100%(s_x-2) + 1)
|
||
|
fy = int(rand.random()*100%(s_x-2) + 1)
|
||
|
while ifcorrect == 0:
|
||
|
ifcorrect = 1;
|
||
|
fx = int(rand.random()*100%(s_x-2) + 1)
|
||
|
fy = int(rand.random()*100%(s_y-2) + 1)
|
||
|
for player in players:
|
||
|
if player[0]['x'] == fx and player[0]['y'] == fy:
|
||
|
ifcorrect = 0
|
||
|
continue
|
||
|
for item in player[1]:
|
||
|
if item['x'] == fx and item['y'] == fy:
|
||
|
ifcorrect = 0
|
||
|
continue
|
||
|
for food in foods:
|
||
|
if fx == food['x'] and fy == food['y']:
|
||
|
ifcorrect = 0
|
||
|
continue
|
||
|
m_food['x'] = fx
|
||
|
m_food['y'] = fy
|
||
|
return m_food
|
||
|
|
||
|
def build_screen(s_x,s_y,heads,snacks,plyhead,plysnack,foods):
|
||
|
screen = []
|
||
|
for y in range(s_y):
|
||
|
screen.append("")
|
||
|
for x in range(s_x):
|
||
|
ifblank = 1
|
||
|
if x == 0 or x == s_x-1:
|
||
|
screen[y] += '#'
|
||
|
ifblank = 0
|
||
|
elif y == 0 or y == s_y-1:
|
||
|
screen[y] += '#'
|
||
|
ifblank = 0
|
||
|
hdnum = 0
|
||
|
for head in heads:
|
||
|
if y == head['y'] and x == head['x']:
|
||
|
screen[y] += plyhead[hdnum]
|
||
|
ifblank = 0
|
||
|
hdnum += 1
|
||
|
snnum = 0
|
||
|
for snack in snacks:
|
||
|
for item in snack:
|
||
|
if x == item['x'] and y == item['y']:
|
||
|
if ifblank != 0:
|
||
|
screen[y]+=plysnack[snnum]
|
||
|
ifblank = 0
|
||
|
snnum += 1
|
||
|
for food in foods:
|
||
|
if ifblank != 0:
|
||
|
if food['x'] == x and food['y'] == y:
|
||
|
screen[y]+='o'
|
||
|
ifblank = 0
|
||
|
if ifblank == 1:
|
||
|
screen[y] += '.'
|
||
|
return screen
|
||
|
def flash_screen(screen):
|
||
|
for line in screen:
|
||
|
print(line)
|
||
|
|
||
|
def if_eat_food(head,m_foods):
|
||
|
del_foods = []
|
||
|
ifeat = 0
|
||
|
for food in m_foods:
|
||
|
if head['dir'] == 0 and head['y'] -1 == food['y'] and head['x'] == food['x']:
|
||
|
m_foods.remove(food)
|
||
|
del_foods.append(food)
|
||
|
ifeat = 1
|
||
|
if head['dir'] == -1 and head['x'] +1 == food['x'] and head['y'] == food['y']:
|
||
|
m_foods.remove(food)
|
||
|
del_foods.append(food)
|
||
|
ifeat = 1
|
||
|
if head['dir'] == 1 and head['x'] -1 == food['x'] and head['y'] == food['y']:
|
||
|
m_foods.remove(food)
|
||
|
del_foods.append(food)
|
||
|
ifeat = 1
|
||
|
if head['dir'] == -2 and head['y'] +1 == food['y'] and head['x'] == food['x']:
|
||
|
m_foods.remove(food)
|
||
|
del_foods.append(food)
|
||
|
ifeat = 1
|
||
|
|
||
|
if head['y'] == food['y'] and head['x'] == food['x']:
|
||
|
m_foods.remove(food)
|
||
|
del_foods.append(food)
|
||
|
ifeat = 1
|
||
|
return [ifeat,del_foods]
|
||
|
|
||
|
def recover_snack(t_player,players):
|
||
|
ifcorrect = 0
|
||
|
fx = int(rand.random()*100%(s_x-2) + 1)
|
||
|
fy = int(rand.random()*100%(s_x-2) + 1)
|
||
|
while ifcorrect == 0:
|
||
|
ifcorrect = 1;
|
||
|
fx = int(rand.random()*100%(s_x-2) + 1)
|
||
|
fy = int(rand.random()*100%(s_y-2) + 1)
|
||
|
for player in players:
|
||
|
if player != t_player:
|
||
|
if player[0]['x'] == fx and fy - 1 == player[0]['y']:
|
||
|
ifcorrect = 0
|
||
|
continue
|
||
|
if player[0]['x'] == fx and player[0]['y'] == fy:
|
||
|
ifcorrect = 0
|
||
|
continue
|
||
|
for item in player[1]:
|
||
|
if item['x'] == fx and item['y'] == fy:
|
||
|
ifcorrect = 0
|
||
|
continue
|
||
|
if item['x'] == fx and item['y'] == fy - 1:
|
||
|
ifcorrect = 0
|
||
|
continue
|
||
|
for food in foods:
|
||
|
if player[0]['x'] == fx and fy-1 == food['y']:
|
||
|
ifcorrect = 0
|
||
|
continue
|
||
|
if fx == food['x'] and fy == food['y']:
|
||
|
ifcorrect = 0
|
||
|
continue
|
||
|
t_player[0] = {}
|
||
|
t_player[0]['x'] = fx
|
||
|
t_player[0]['y'] = fy
|
||
|
t_player[0]['dir'] = 0
|
||
|
t_player[1] = []
|
||
|
|
||
|
t_player[2] = "ALIVE"
|
||
|
for x in range(2):
|
||
|
t_player[1].append({'x':fx,'y':fy+x})
|
||
|
players.append(t_player)
|
||
|
|
||
|
def if_eat_snack(t_player,players):
|
||
|
head = t_player[0]
|
||
|
for m_player in players:
|
||
|
if m_player != t_player:
|
||
|
for item in m_player[1]:
|
||
|
if head['y'] == item['y'] and head['x'] == item['x']:
|
||
|
return 1
|
||
|
|
||
|
def if_eat_it(head,snack):
|
||
|
for item in snack:
|
||
|
if head['dir'] == 0 and head['y'] -1 == item['y'] and head['x'] == item['x']:
|
||
|
return 1
|
||
|
elif head['dir'] == -1 and head['x'] +1 == item['x'] and head['y'] == item['y']:
|
||
|
return 1
|
||
|
elif head['dir'] == 1 and head['x'] -1 == item['x'] and head['y'] == item['y']:
|
||
|
return 1
|
||
|
elif head['dir'] == -2 and head['y'] +1 == item['y'] and head['x'] == item['x']:
|
||
|
return 1
|
||
|
else:
|
||
|
pass
|
||
|
|
||
|
def if_out(head,s_x,s_y):
|
||
|
ifout = 0
|
||
|
if head['dir'] == 0 and head['y'] <= 1:
|
||
|
head['y'] = s_y-2
|
||
|
ifout = 1
|
||
|
elif head['dir'] == -1 and head['x'] +2 >= s_x:
|
||
|
head['x'] = 1
|
||
|
ifout = 1
|
||
|
elif head['dir'] == 1 and head['x'] <= 1:
|
||
|
head['x'] = s_x-2
|
||
|
ifout = 1
|
||
|
elif head['dir'] == -2 and head['y'] +2 >= s_y:
|
||
|
head['y'] = 1
|
||
|
ifout = 1
|
||
|
else:
|
||
|
pass
|
||
|
return ifout
|
||
|
def eat_food(head,snack,food):
|
||
|
snack.insert(0,{'x':head['x'],'y':head['y']})
|
||
|
head['x'] = food['x']
|
||
|
head['y'] = food['y']
|
||
|
|
||
|
def move(head,snack,speed):
|
||
|
lsnk = len(snack)
|
||
|
for num in range(len(snack)):
|
||
|
d_num = lsnk - num - 1
|
||
|
if d_num == 0:
|
||
|
snack[d_num]['x'] = head['x']
|
||
|
snack[d_num]['y'] = head['y']
|
||
|
else:
|
||
|
snack[d_num]['x'] = snack[d_num-1]['x']
|
||
|
snack[d_num]['y'] = snack[d_num-1]['y']
|
||
|
if head['dir'] == 0:
|
||
|
head['y'] -= speed
|
||
|
elif head['dir'] == -1:
|
||
|
head['x'] += speed
|
||
|
elif head['dir'] == 1:
|
||
|
head['x'] -= speed
|
||
|
elif head['dir'] == -2:
|
||
|
head['y'] += speed
|
||
|
else:
|
||
|
pass
|
||
|
|
||
|
def get_crl(heads,ctls):
|
||
|
doctl = []
|
||
|
line = ""
|
||
|
if msvcrt.kbhit()!=0:
|
||
|
lnnum = 0
|
||
|
if msvcrt.kbhit()!=0:
|
||
|
line = msvcrt.getch()
|
||
|
try:
|
||
|
line = str(line, encoding = "utf-8")
|
||
|
except UnicodeDecodeError:
|
||
|
pass
|
||
|
|
||
|
ispeed = 1
|
||
|
num = 0
|
||
|
for ctl in ctls:
|
||
|
head = heads[num]
|
||
|
if line == ctl[0]:
|
||
|
if head['dir'] != -2:
|
||
|
if head['dir'] == 0 and ifmpy == 0:
|
||
|
ispeed = 2
|
||
|
head['dir'] = 0
|
||
|
elif line == ctl[1]:
|
||
|
if head['dir'] != -1:
|
||
|
if head['dir'] == 1 and ifmpy == 0:
|
||
|
ispeed = 2
|
||
|
head['dir'] = 1
|
||
|
elif line == ctl[2]:
|
||
|
if head['dir'] != 1:
|
||
|
if head['dir'] == -1 and ifmpy == 0:
|
||
|
ispeed = 2
|
||
|
head['dir'] = -1
|
||
|
elif line == ctl[3]:
|
||
|
if head['dir'] != 0:
|
||
|
if head['dir'] == -2 and ifmpy == 0:
|
||
|
ispeed = 2
|
||
|
head['dir'] = -2
|
||
|
else:
|
||
|
pass
|
||
|
num += 1
|
||
|
if line == "r":
|
||
|
s_playtime = time.clock()
|
||
|
doctl.append("STPT")
|
||
|
return doctl
|
||
|
|
||
|
fsnack = []
|
||
|
fhead = []
|
||
|
|
||
|
ssnack = []
|
||
|
shead = []
|
||
|
|
||
|
fplayer = []
|
||
|
fhead = {'x':10,'y':10,'dir':0}
|
||
|
fsnack.append({'x':10,'y':11})
|
||
|
fsnack.append({'x':10,'y':12})
|
||
|
|
||
|
fplayer.append(fhead) #0
|
||
|
fplayer.append(fsnack) #1
|
||
|
fplayer.append("ALIVE") #2
|
||
|
fplayer.append("Player1") #3
|
||
|
fplayer.append(["w","a","d","s"]) #4
|
||
|
fplayer.append("@") #5
|
||
|
fplayer.append("&") #6
|
||
|
|
||
|
splayer = []
|
||
|
shead = {'x':5,'y':5,'dir':0}
|
||
|
ssnack.append({'x':5,'y':6})
|
||
|
ssnack.append({'x':5,'y':7})
|
||
|
splayer.append(shead) #0
|
||
|
splayer.append(ssnack) #1
|
||
|
splayer.append("ALIVE") #2
|
||
|
splayer.append("Player2") #3
|
||
|
splayer.append(["i","j","l","k"]) #4
|
||
|
splayer.append("@") #5
|
||
|
|
||
|
tsnack = []
|
||
|
thead = []
|
||
|
|
||
|
tplayer = []
|
||
|
thead = {'x':15,'y':15,'dir':0}
|
||
|
tsnack.append({'x':15,'y':16})
|
||
|
tsnack.append({'x':15,'y':17})
|
||
|
tplayer.append(thead) #0
|
||
|
tplayer.append(tsnack) #1
|
||
|
tplayer.append("ALIVE") #2
|
||
|
tplayer.append("Player3") #3
|
||
|
tplayer.append(["8","4","6","5"]) #4
|
||
|
tplayer.append("@") #5
|
||
|
tplayer.append("%") #6
|
||
|
|
||
|
splayer.append("$") #6
|
||
|
|
||
|
players.append(fplayer)
|
||
|
players.append(splayer)
|
||
|
#players.append(tplayer)
|
||
|
|
||
|
for x in range(100):
|
||
|
foods.append(get_food(s_x,s_y,players,foods))
|
||
|
|
||
|
plyhed = []
|
||
|
plysnk = []
|
||
|
plyctl = []
|
||
|
plyhead = []
|
||
|
plysnack = []
|
||
|
|
||
|
fp = open("snack.log","a")
|
||
|
fp.write("New Game\n")
|
||
|
fp.write("s_x: "+str(s_x)+" s_y: "+str(s_y)+" ifmpy: "+str(ifmpy)+"\n")
|
||
|
fp.write("food:"+str(foods)+"\n")
|
||
|
fp.close()
|
||
|
|
||
|
ifinit = 0
|
||
|
|
||
|
time.clock()
|
||
|
|
||
|
while True:
|
||
|
jif_eat_food = 0
|
||
|
fp = open("snack.log","w")
|
||
|
flash_t = 0.05
|
||
|
start = time.clock()
|
||
|
gdoctl = get_crl(plyhed,plyctl)
|
||
|
for item in gdoctl:
|
||
|
if item == "STPT":
|
||
|
s_playtime = time.clock()
|
||
|
if ifinit == 0:
|
||
|
ifinit = 1
|
||
|
plyhed = []
|
||
|
plysnk = []
|
||
|
plyctl = []
|
||
|
plyhead = []
|
||
|
plysnack = []
|
||
|
for player in players:
|
||
|
if player[2] != "DEAD":
|
||
|
plyhed.append(player[0])
|
||
|
plysnk.append(player[1])
|
||
|
plyctl.append(player[4])
|
||
|
plyhead.append(player[5])
|
||
|
plysnack.append(player[6])
|
||
|
|
||
|
for player in players:
|
||
|
jif_eat_food = 0
|
||
|
if player[2] == "DEAD":
|
||
|
continue
|
||
|
|
||
|
speed = 1
|
||
|
head = player[0]
|
||
|
snack = player[1]
|
||
|
if if_out(head,s_x,s_y) == 1:
|
||
|
jif_eat_food = 1
|
||
|
|
||
|
if if_eat_it(head,snack) == 1:
|
||
|
player[2] = "DEAD"
|
||
|
fp.write(str(player[3])+" Dead:Eat it\n")
|
||
|
ifinit = 0
|
||
|
for item in player[1]:
|
||
|
foods.append({'x':item['x'],'y':item['y']})
|
||
|
players.remove(player)
|
||
|
recover_snack(player,players)
|
||
|
|
||
|
if if_eat_snack(player,players) == 1:
|
||
|
player[2] = "DEAD"
|
||
|
fp.write(str(player[3])+" Dead:Eat Snack\n")
|
||
|
ifinit = 0
|
||
|
for item in player[1]:
|
||
|
foods.append({'x':item['x'],'y':item['y']})
|
||
|
player[1] = []
|
||
|
player[0] = {}
|
||
|
players.remove(player)
|
||
|
recover_snack(player,players)
|
||
|
|
||
|
frtn = if_eat_food(head,foods)
|
||
|
if frtn[0] == 1:
|
||
|
jif_eat_food = 1
|
||
|
fp.write(str(player[3])+" Eating Foods:\n")
|
||
|
fp.write("Head: "+str(head)+"\n")
|
||
|
for f_item in frtn[1]:
|
||
|
fp.write(" Eat Food:"+str(f_item)+"\n")
|
||
|
fp.write("Eat Foods End Total: "+str(len(frtn[1]))+"\n")
|
||
|
eat_food(head,snack,f_item)
|
||
|
#foods.remove(f_item)
|
||
|
if len(foods) < 10:
|
||
|
foods.append(get_food(s_x,s_y,players,foods))
|
||
|
|
||
|
if jif_eat_food == 0:
|
||
|
move(head,snack,1)
|
||
|
|
||
|
fp.write("Foods: "+str(foods)+"\n")
|
||
|
fp.write(str(player[3])+" Head:"+str(player[0])+"\n")
|
||
|
fp.write(str(player[3])+" Snack:"+str(player[1])+"\n")
|
||
|
|
||
|
if speed == 2:
|
||
|
move(head,snack,1)
|
||
|
if_out(head,s_x,s_y)
|
||
|
if if_eat_it(head,snack) == 1:
|
||
|
player[2] = "DEAD"
|
||
|
if if_eat_food(head,foods) == 1:
|
||
|
eat_food(head,snack)
|
||
|
food = get_food(s_x,s_y,players,foods)
|
||
|
screen = build_screen(s_x,s_y,plyhed,plysnk)
|
||
|
flash_screen(screen)
|
||
|
move(head,snack,1)
|
||
|
flash_t = 0.08
|
||
|
|
||
|
screen = build_screen(s_x,s_y,plyhed,plysnk,plyhead,plysnack,foods)
|
||
|
for line in screen:
|
||
|
fp.write(line+"\n")
|
||
|
|
||
|
end = time.clock()
|
||
|
|
||
|
if end-start < flash_t:
|
||
|
time.sleep(flash_t+start-end)
|
||
|
os.system("cls")
|
||
|
fstart = time.clock()
|
||
|
flash_screen(screen)
|
||
|
maxlen = 0
|
||
|
maxplayer = []
|
||
|
for player in players:
|
||
|
if len(player[1]) > maxlen:
|
||
|
maxplayer = player
|
||
|
maxlen = len(player[1])
|
||
|
print("################")
|
||
|
print("(No1)",maxplayer[3]+": ")
|
||
|
#print("Status:",maxplayer[2])
|
||
|
print("Score(s):",len(maxplayer[1])+1)
|
||
|
print("################")
|
||
|
ifshow = 0
|
||
|
for player in players:
|
||
|
if player != maxplayer and ifshow == 0:
|
||
|
print(player[3]+": ")
|
||
|
#print("Status:",player[2])
|
||
|
print("Score(s):",len(player[1])+1)
|
||
|
ifshow = 1
|
||
|
|
||
|
fend = time.clock()
|
||
|
print("########################")
|
||
|
n_playtime = time.clock()
|
||
|
timer = 180-int(n_playtime-s_playtime)
|
||
|
print("Timer:",timer,"s")
|
||
|
print("Real Flash Hz",1/(fend-start))
|
||
|
fp.close()
|
||
|
if timer <= 0:
|
||
|
print("########################")
|
||
|
print(maxplayer[3],"Win!")
|
||
|
break;
|
||
|
input()
|