Skip to content

Instantly share code, notes, and snippets.

@ejherran
Created August 26, 2017 04:51
Show Gist options
  • Save ejherran/48b84d2e5524ed10c059339ca9eaf891 to your computer and use it in GitHub Desktop.
Save ejherran/48b84d2e5524ed10c059339ca9eaf891 to your computer and use it in GitHub Desktop.
Astucia naval, con arreglos. Concepto
import random as rnd
class Naval():
def __init__(self):
self.tabM = Naval.createBoard(8, 8, "·") # Tableros
self.tabJ = Naval.createBoard(8, 8, "·")
self.barM = [] # Barcos
self.barJ = []
self.disM = [] # Disparos
self.disJ = []
self.punM = 0 # Puntos
self.punJ = 0
self.ulti = [] # Ultima coordenada exitosa
self.posi = [] # Posibles coordenadas de los barcos
self.modo = 0 # Modo de escaneo
def createBoard(zH, zW, ini): # zH = Filas, zW = Columnas
res = []
for i in range(zH):
tmp = []
for j in range(zW):
tmp.append(ini)
res.append(tmp)
return res
def drawBoard(mat):
tags = "ABCDEFGH"
ccol = []
for i in range(1, 9):
ccol.append(str(i))
print(" "+" ".join(ccol))
for i in range(8):
print(tags[i]+" "+" ".join(mat[i]))
def coorToIndex(c):
tags = "ABCDEFGH"
r = tags.index(c[0])
c = int(c[1])-1
return (r,c)
def indexToCoor(i):
tags = "ABCDEFGH"
r = tags[i[0]]
c = str(i[1]+1)
return r+c
def inLine(arr):
flr = True
flc = True
inr = arr[0][0]
inc = arr[0][1]
for c in arr:
if(inr != c[0]):
flr = False
if(inc != c[1]):
flc = False
flag = True
if(flr): # Horizontal
for k in range(len(arr)-1):
ant = Naval.coorToIndex(arr[k])
sig = Naval.coorToIndex(arr[k+1])
dif = abs(sig[1]-ant[1])
if(dif != 1):
flag = False
break
elif(flc): # Vertical
for k in range(len(arr)-1):
ant = Naval.coorToIndex(arr[k])
sig = Naval.coorToIndex(arr[k+1])
dif = abs(sig[0]-ant[0])
if(dif != 1):
flag = False
break
else:
flag = False
return flag
def noCollide(o, d, s, u): # d = 1 -> Arriba, d = 2 -> Derecha, d = 3 -> Abajo, d = 4 -> Izquierda
r = o[0]
c = o[1]
flag = True
if(d == 1 and not( r-s+1 >= 0 )):
return False
elif(d == 2 and not( c+s-1 <= 7 )):
return False
elif(d == 3 and not( r+s-1 <= 7 )):
return False
elif(d == 4 and not( c-s+1 >= 0 )):
return False
else:
for k in range(1, s):
if(d == 1):
tmp = Naval.indexToCoor( (r-k, c) )
if(tmp in u):
flag = False
break
elif(d == 2):
tmp = Naval.indexToCoor( (r, c+k) )
if(tmp in u):
flag = False
break
elif(d == 3):
tmp = Naval.indexToCoor( (r+k, c) )
if(tmp in u):
flag = False
break
elif(d == 4):
tmp = Naval.indexToCoor( (r, c-k) )
if(tmp in u):
flag = False
break
return flag
def evalHit(r, c, s, mat, bar):
fin = False # Si golpee
fun = False # Si Hundio
if(mat[r][c] == "#"):
mat[r][c] = "o"
fin = True
for i in range(len(bar)):
try:
ind = bar[i].index(s)
del(bar[i][ind])
if(len(bar[i]) == 0):
fun = True
except:
pass
else:
mat[r][c] = "x"
return (fin, fun)
def disPlayer(self):
sec = [4, 3, 3, 2]
while(True):
try:
cc = 0
repe = []
gru = []
#data = input("Please locate your boats: ")
data = "A1 A2 A3 A4 F7 F6 F5 C3 C4 C5 B6 B7"
data = data.upper()
data = data.split(" ")
ant = 0
for s in sec:
tmp = data[ant:ant+s]
if(Naval.inLine(tmp)):
flag = True
for c in tmp:
ind = Naval.coorToIndex(c)
if( not( (ind[0] >= 0 and ind[0] <= 7) and (ind[1] >= 0 and ind[1] <= 7) ) ):
if( c in repe ):
flag = False
break
if(flag):
repe = repe+tmp
gru.append(tmp)
cc = cc+s
else:
break
else:
break
ant = ant + s
if(cc == 12):
self.barJ = gru
for c in repe:
ind = Naval.coorToIndex(c)
self.tabJ[ ind[0] ][ ind[1] ] = "#"
break
except:
pass
def disMachine(self):
sec = [4, 3, 3, 2]
cs = 0
cc = 0
repe = []
gru = []
while(cc < 12):
r = rnd.randint(0, 7)
c = rnd.randint(0, 7)
tmp = [Naval.indexToCoor( (r,c) )]
flag = True
if( not( Naval.indexToCoor( (r,c) ) in repe ) ):
d = rnd.randint(1, 4)
lim = sec[cs]
if(d == 1):
if( (r-lim+1 >= 0) and Naval.noCollide( (r,c), d, lim, repe ) ):
for k in range(1, lim):
tmp.append(Naval.indexToCoor( (r-k, c) ))
else:
flag = False
elif(d == 2):
if( (c+lim-1 <= 7) and Naval.noCollide( (r,c), d, lim, repe ) ):
for k in range(1, lim):
tmp.append(Naval.indexToCoor( (r, c+k) ))
else:
flag = False
elif(d == 3):
if( (r+lim-1 <= 7) and Naval.noCollide( (r,c), d, lim, repe ) ):
for k in range(1, lim):
tmp.append(Naval.indexToCoor( (r+k, c) ))
else:
flag = False
elif(d == 4):
if( (c-lim+1 <= 7) and Naval.noCollide( (r,c), d, lim, repe ) ):
for k in range(1, lim):
tmp.append(Naval.indexToCoor( (r, c-k) ))
else:
flag = False
else:
flag = False
if(flag):
repe = repe + tmp
gru.append(tmp)
cc = cc + sec[cs]
cs = cs+1
self.barM = gru
for c in repe:
ind = Naval.coorToIndex(c)
self.tabM[ ind[0] ][ ind[1] ] = "#"
def shootMachine(self):
if( self.modo > 0):
if(self.modo == 1):
i = rnd.randint(0, len(self.posi)-1)
o = self.posi[i]
del(self.posi[i])
s = Naval.indexToCoor(o)
self.disM.append(s)
est = Naval.evalHit(o[0], o[1], s, self.tabJ, self.barJ)
if(est[0]):
self.punM = self.punM + 1
self.ulti.append(o)
self.generateCoor(o[0], o[1])
if(est[1]):
print("Sunken Ship")
self.ulti = []
self.posi = []
if(len(self.ulti) == 2):
self.generateCoorInLine()
self.modo = 2
if(len(self.posi) == 0):
self.modo = 0
elif(self.modo == 2):
o = self.posi[0]
del(self.posi[0])
s = Naval.indexToCoor(o)
self.disM.append(s)
est = Naval.evalHit(o[0], o[1], s, self.tabJ, self.barJ)
if(est[0]):
self.punM = self.punM + 1
self.ulti[1] = o
self.generateCoor(o[0], o[1])
self.generateCoorInLine()
if(est[1]):
print("Sunken Ship")
self.posi = []
if(len(self.posi) == 0):
self.ulti = []
self.modo = 0
else: # Ataque aleatorio
while(True):
r = rnd.randint(0, 7)
c = rnd.randint(0, 7)
s = Naval.indexToCoor( (r,c) )
if( not(s in self.disM) ):
self.disM.append(s)
est = Naval.evalHit(r, c, s, self.tabJ, self.barJ)
if(est[0]): # Si golpee
self.punM = self.punM + 1
self.ulti.append( (r,c) )
self.generateCoor(r, c)
self.modo = 1
if(est[1]): # Si hundi
print("Sunken Ship!")
self.posi = []
self.ulti = []
self.modo = 0
break
def generateCoor(self, r, c):
opts = [ (r-1, c), (r, c+1), (r+1, c), (r, c-1) ]
for o in opts:
if( ( o[0] >= 0 and o[0] <=7 ) and ( o[1] >= 0 and o[1] <=7 ) ):
if( not( Naval.indexToCoor( o ) in self.disM ) and not( o in self.posi ) ):
self.posi.append(o)
def generateCoorInLine(self):
opts = []
if(self.ulti[0][0] == self.ulti[1][0]): # Filas iguales, Horizontal
if(self.ulti[0][1] > self.ulti[1][1]):
opts.append( (self.ulti[0][0], self.ulti[0][1]+1) )
opts.append( (self.ulti[1][0], self.ulti[1][1]-1) )
else:
opts.append( (self.ulti[1][0], self.ulti[1][1]+1) )
opts.append( (self.ulti[0][0], self.ulti[0][1]-1) )
elif(self.ulti[0][1] == self.ulti[1][1]): # Columnas iguales, Vertical
if(self.ulti[0][0] > self.ulti[1][0]):
opts.append( (self.ulti[0][0]+1, self.ulti[0][1]) )
opts.append( (self.ulti[1][0]-1, self.ulti[1][1]) )
else:
opts.append( (self.ulti[1][0]+1, self.ulti[1][1]) )
opts.append( (self.ulti[0][0]-1, self.ulti[0][1]) )
oks = []
for o in opts:
if( ( o[0] >= 0 and o[0] <=7 ) and ( o[1] >= 0 and o[1] <=7 ) ):
if( not( Naval.indexToCoor( o ) in self.disM )):
oks.append(o)
if(o in self.posi):
ind = self.posi.index(o)
del(self.posi[ind])
for o in oks:
self.posi = [o]+self.posi
n = Naval()
n.disPlayer()
n.disMachine()
while(n.punJ < 12 and n.punM < 12):
print("MACHINE:", n.punM, "PLAYER:", n.punJ)
Naval.drawBoard(n.tabM)
print("=================")
Naval.drawBoard(n.tabJ)
while(True):
at = input("Ataque?: ")
at = at.upper()
ind = Naval.coorToIndex(at)
if( ( ind[0] >= 0 and ind[0] <=7 ) and ( ind[1] >= 0 and ind[1] <=7 ) ):
if(not(at in n.disJ)):
n.disJ.append(at)
break
est = Naval.evalHit(ind[0], ind[1], at, n.tabM, n.barM)
if(est[0]):
n.punJ = n.punJ+1
if(est[1]):
print("Sunken Ship")
n.shootMachine()
Naval.drawBoard(n.tabM)
print("=================")
Naval.drawBoard(n.tabJ)
if(n.punJ == 12):
print("PLAYER WINS")
else:
print("PLAYER LOSSES")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment