mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-24 20:10:15 -08:00
First draft of Python port source code.
This commit is contained in:
136
56_Life_for_Two/python/LIFE2.py
Normal file
136
56_Life_for_Two/python/LIFE2.py
Normal file
@@ -0,0 +1,136 @@
|
||||
# Variable Initialisation
|
||||
gn, gk, ga, gx, gy = [], [], [], [], []
|
||||
gk = [3, 102, 103, 120, 130, 121, 112, 111, 12, 21, 30, 1020, 1030, 1011, 1021, 1003, 1002, 1012]
|
||||
ga = [-1, 0, 1, 0, 0, -1, 0, 1, -1, -1, 1, -1, -1, 1, 1, 1]
|
||||
m2, m3 = 0, 0
|
||||
|
||||
# Initialise the board
|
||||
for j in range(6):
|
||||
gn[j] = []
|
||||
for k in range(6):
|
||||
gn[j][k] = 0
|
||||
|
||||
# Helper Functions
|
||||
def tab(number) -> str:
|
||||
t = ""
|
||||
while len(t) < number:
|
||||
t += " "
|
||||
return t
|
||||
|
||||
def display_header() -> None:
|
||||
print("{}LIFE2\n".format(tab(33)))
|
||||
print("{}CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n\n\n\n".format(tab(15)))
|
||||
print("{}U.B. LIFE GAME".format(tab(10)))
|
||||
|
||||
# Board Functions
|
||||
def setup_board() -> None:
|
||||
# Players add symbols to initially setup the board
|
||||
for b in range(1, 3):
|
||||
p1 = 30 if b == 2 else 3
|
||||
print("\n\nPLAYER {} - 3 LIVE PIECES.".format(b))
|
||||
for k1 in range(1, 3):
|
||||
query_player(b)
|
||||
gn[gx[b]][gy[b]] = p1
|
||||
|
||||
def modify_board() -> None:
|
||||
# Players take turns to add symbols and modify the board
|
||||
for b in range(1, 3):
|
||||
print("\n\nPLAYER {} ".format(b))
|
||||
query_player(b)
|
||||
if b == 99:
|
||||
break
|
||||
if b <= 2:
|
||||
gn[gx[1]][gy[1]] = 100
|
||||
gn[gx[2]][gy[2]] = 1000
|
||||
|
||||
def simulate_board() -> None:
|
||||
# Simulate the board for one step
|
||||
for j in range(1, 6):
|
||||
for k in range(1, 6):
|
||||
if gn[j][k] > 99:
|
||||
b = 1 if gn[j][k] <= 999 else 10
|
||||
for o1 in range(1, 16, 2):
|
||||
gn[j + ga[o1]][k + ga[o1 + 1]] = gn[j + ga[o1]][k + ga[o1 + 1]] + b
|
||||
|
||||
def display_board() -> None:
|
||||
# Draws the board with all symbols
|
||||
m2, m3 = 0, 0
|
||||
for j in range(7):
|
||||
print("\n")
|
||||
for k in range(7):
|
||||
if j == 0 or j == 6:
|
||||
if k != 6:
|
||||
print(" " + str(k) + " ")
|
||||
else:
|
||||
print(" 0 ")
|
||||
if k == 0 or k == 6:
|
||||
if j != 6:
|
||||
print(" " + str(j) + " ")
|
||||
else:
|
||||
print(" 0\n")
|
||||
else:
|
||||
if gn[j][k] < 3:
|
||||
gn[j][k] = 0
|
||||
print(" ")
|
||||
else:
|
||||
for o1 in range(19):
|
||||
if gn[j][k] == gk[o1]:
|
||||
if o1 > 9:
|
||||
gn[j][k] = 1000
|
||||
m3 += 1
|
||||
print(" # ")
|
||||
else:
|
||||
gn[j, k] = 100
|
||||
m2 += 1
|
||||
print(" * ")
|
||||
gn[j][k] = 0
|
||||
print(" ")
|
||||
|
||||
# Player Functions
|
||||
def query_player(b) -> None:
|
||||
# Query player for symbol placement coordinates
|
||||
while True:
|
||||
print("X,Y\nXXXXXX\n$$$$$$\n&&&&&&\n")
|
||||
x_ = input("")
|
||||
y_ = input(" ")
|
||||
x_ = [int(num) for num in x_.split() if num.isdigit()][0]
|
||||
y_ = [int(num) for num in y_.split() if num.isdigit()][0]
|
||||
gx[b], gy[b] = x_, y_
|
||||
if gx[b] in range(1, 6) and gy[b] in range(1, 6) and gn[gx[b]][gy[b]] != 0:
|
||||
break
|
||||
print("ILLEGAL COORDS. RETYPE\n")
|
||||
if b != 1:
|
||||
if gx[1] == gx[2] and gy[1] == gy[2]:
|
||||
print("SAME COORD. SET TO 0")
|
||||
gn[gx[b] + 1][gy[b] + 1] = 0
|
||||
b = 99
|
||||
|
||||
# Game Functions
|
||||
def check_winner(m2, m3) -> None:
|
||||
# Check if the game has been won
|
||||
if m2 == 0 and m3 == 0:
|
||||
print("\nA DRAW\n")
|
||||
return
|
||||
if m3 == 0:
|
||||
print("\nPLAYER 1 IS THE WINNER\n")
|
||||
return
|
||||
if m2 == 0:
|
||||
print("\nPLAYER 2 IS THE WINNER\n")
|
||||
return
|
||||
|
||||
# Program Flow
|
||||
def main() -> None:
|
||||
display_header()
|
||||
|
||||
setup_board()
|
||||
display_board()
|
||||
|
||||
while True:
|
||||
print("\n")
|
||||
simulate_board()
|
||||
display_board()
|
||||
check_winner()
|
||||
modify_board()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,57 +1,140 @@
|
||||
"""
|
||||
Life for Two
|
||||
|
||||
From: BASIC Computer Games (1978),
|
||||
Edited by David H. Ahl.
|
||||
|
||||
BASIC program written by Brian Wyvill of Bradford University in Yorkshire, England.
|
||||
|
||||
Python port created by Sajid Al Sanai, 2022.
|
||||
"""
|
||||
|
||||
def tab(spaces):
|
||||
out = ""
|
||||
for i in range(spaces):
|
||||
out += " "
|
||||
return out
|
||||
|
||||
na = []
|
||||
ka = [, 3, 102, 103, 120, 130, 121, 112, 111, 12, 21, 30, 1020, 1030, 1011, 1021, 1003, 1002, 1012]
|
||||
aa = [, -1, 0, 1, 0, 0, -1, 0, 1, -1, -1, 1, -1, -1, 1, 1, 1]
|
||||
xa = []
|
||||
ya = []
|
||||
j, k, m2, m3 = 0, 0, 0, 0
|
||||
|
||||
def main():
|
||||
print(tab(33) + "LIFE2\n")
|
||||
print(tab(15) + "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n")
|
||||
print("\n\n\n")
|
||||
print(tab(10) + "U.B. LIFE GAME\n")
|
||||
m2 = 0
|
||||
m3 = 0
|
||||
for j in range(7):
|
||||
na[j] = []
|
||||
for k in range(7):
|
||||
na[j].append(0)
|
||||
for b in range(1, 3):
|
||||
p1 = 30 if (b == 2) else 3
|
||||
print("\n")
|
||||
print("PLAYER {} - 3 LIVE PIECES.\n".format(b))
|
||||
for k1 in range(1, 4):
|
||||
while 1:
|
||||
print("X,Y\n")
|
||||
str_ = input()
|
||||
ya[b] = int(str_)
|
||||
xa[b] = #int(str_.substr() + 1)
|
||||
if xa[b] > 0 and xa[b] < 6 and ya[b] > 0 and ya[b] < 5 and na[xa[b]][ya[b]] == 0:
|
||||
break
|
||||
print("ILLEGAL COORDS. RETYPE\n")
|
||||
if b != 1:
|
||||
if xa[1] == xa[2] and ya[1] == ya[2]:
|
||||
print("SAME COORD. SET TO 0\n")
|
||||
na[xa[b] + 1][ya[b] + 1] = 0
|
||||
b = 99
|
||||
na[xa[b]][ya[b]] = p1
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
# Variable Initialisation
|
||||
gn, gk, ga, gx, gy = [], [], [], [], []
|
||||
gk = [3, 102, 103, 120, 130, 121, 112, 111, 12, 21, 30, 1020, 1030, 1011, 1021, 1003, 1002, 1012]
|
||||
ga = [-1, 0, 1, 0, 0, -1, 0, 1, -1, -1, 1, -1, -1, 1, 1, 1]
|
||||
m2, m3 = 0, 0
|
||||
|
||||
# Initialise the board
|
||||
for j in range(6):
|
||||
gn.append([])
|
||||
for k in range(6):
|
||||
gn[j].append(0)
|
||||
|
||||
for i in range(3):
|
||||
gx.append(0)
|
||||
gy.append(0)
|
||||
|
||||
# Helper Functions
|
||||
def tab(number) -> str:
|
||||
t = ""
|
||||
while len(t) < number:
|
||||
t += " "
|
||||
return t
|
||||
|
||||
def display_header() -> None:
|
||||
print("{}LIFE2".format(tab(33)))
|
||||
print("{}CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n\n\n".format(tab(15)))
|
||||
print("{}U.B. LIFE GAME".format(tab(10)))
|
||||
|
||||
# Board Functions
|
||||
def setup_board() -> None:
|
||||
# Players add symbols to initially setup the board
|
||||
for b in range(1, 3):
|
||||
p1 = 30 if b == 2 else 3
|
||||
print("\nPLAYER {} - 3 LIVE PIECES.".format(b))
|
||||
for k1 in range(1, 3):
|
||||
query_player(b)
|
||||
gn[gx[b]][gy[b]] = p1
|
||||
|
||||
def modify_board() -> None:
|
||||
# Players take turns to add symbols and modify the board
|
||||
for b in range(1, 3):
|
||||
print("\n\nPLAYER {} ".format(b))
|
||||
query_player(b)
|
||||
if b == 99:
|
||||
break
|
||||
if b <= 2:
|
||||
gn[gx[1]][gy[1]] = 100
|
||||
gn[gx[2]][gy[2]] = 1000
|
||||
|
||||
def simulate_board() -> None:
|
||||
# Simulate the board for one step
|
||||
for j in range(1, 6):
|
||||
for k in range(1, 6):
|
||||
if gn[j][k] > 99:
|
||||
b = 1 if gn[j][k] <= 999 else 10
|
||||
for o1 in range(1, 16, 2):
|
||||
gn[j + ga[o1]][k + ga[o1 + 1]] = gn[j + ga[o1]][k + ga[o1 + 1]] + b
|
||||
|
||||
def display_board() -> None:
|
||||
# Draws the board with all symbols
|
||||
m2, m3 = 0, 0
|
||||
for j in range(7):
|
||||
print("\n")
|
||||
for k in range(7):
|
||||
if j == 0 or j == 6:
|
||||
if k != 6:
|
||||
print(" " + str(k) + " ")
|
||||
else:
|
||||
print(" 0 ")
|
||||
if k == 0 or k == 6:
|
||||
if j != 6:
|
||||
print(" " + str(j) + " ")
|
||||
else:
|
||||
print(" 0\n")
|
||||
else:
|
||||
if gn[j][k] < 3:
|
||||
gn[j][k] = 0
|
||||
print(" ")
|
||||
else:
|
||||
for o1 in range(19):
|
||||
if gn[j][k] == gk[o1]:
|
||||
if o1 > 9:
|
||||
gn[j][k] = 1000
|
||||
m3 += 1
|
||||
print(" # ")
|
||||
else:
|
||||
gn[j, k] = 100
|
||||
m2 += 1
|
||||
print(" * ")
|
||||
gn[j][k] = 0
|
||||
print(" ")
|
||||
|
||||
# Player Functions
|
||||
def query_player(b) -> None:
|
||||
# Query player for symbol placement coordinates
|
||||
while True:
|
||||
print("X,Y\nXXXXXX\n$$$$$$\n&&&&&&")
|
||||
x_ = input("??")
|
||||
y_ = input("???")
|
||||
x_ = [int(num) for num in x_.split() if num.isdigit()][0]
|
||||
y_ = [int(num) for num in y_.split() if num.isdigit()][0]
|
||||
gx[b], gy[b] = y_, x_
|
||||
if gx[b] in range(1, 6) and gy[b] in range(1, 6) and gn[gx[b]][gy[b]] != 0:
|
||||
break
|
||||
print("ILLEGAL COORDS. RETYPE")
|
||||
if b != 1:
|
||||
if gx[1] == gx[2] and gy[1] == gy[2]:
|
||||
print("SAME COORD. SET TO 0")
|
||||
gn[gx[b] + 1][gy[b] + 1] = 0
|
||||
b = 99
|
||||
|
||||
# Game Functions
|
||||
def check_winner(m2, m3) -> None:
|
||||
# Check if the game has been won
|
||||
if m2 == 0 and m3 == 0:
|
||||
print("\nA DRAW\n")
|
||||
return
|
||||
if m3 == 0:
|
||||
print("\nPLAYER 1 IS THE WINNER\n")
|
||||
return
|
||||
if m2 == 0:
|
||||
print("\nPLAYER 2 IS THE WINNER\n")
|
||||
return
|
||||
|
||||
# Program Flow
|
||||
def main() -> None:
|
||||
display_header()
|
||||
|
||||
setup_board()
|
||||
display_board()
|
||||
|
||||
while True:
|
||||
print("\n")
|
||||
simulate_board()
|
||||
display_board()
|
||||
check_winner()
|
||||
modify_board()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
Reference in New Issue
Block a user