-
Notifications
You must be signed in to change notification settings - Fork 0
/
CFour.py
76 lines (66 loc) · 2.24 KB
/
CFour.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#!/bin/env python3
# Das Spiel "Vier Gewinnt" programmiert in Python.
# Diese Version ist funktional programmiert.
WIDTH = 7
HEIGHT = 6
H1 = HEIGHT + 1
H2 = HEIGHT + 2
SIZE = HEIGHT * WIDTH
TOP1 = 283691315109952
SIGNS = ('x', 'o', ' ')
LFs = 40 * "\n"
def move(v_row):
# Einen Spielstein in den Slot 'v_row' einwerfen.
bbs[count & 1] ^= bare[v_row] # XOR
bare[v_row] <<= 1
lock[v_row] = bare[v_row] & TOP1
def has_won(bb):
# Hat bb eine Gewinnposition?
hori = bb & (bb >> H1)
vert = bb & (bb >> 1)
diag1 = bb & (bb >> HEIGHT)
diag2 = bb & (bb >> H2)
a = (hori & (hori >> 2*H1))
b = (vert & (vert >> 2))
c = (diag1 & (diag1 >> 2*HEIGHT))
d = (diag2 & (diag2 >> 2*H2))
return a | b | c | d
def grid(topline=False):
# Gib das aktuelle Spielfeld als Textgrafik zurück
x_grid = range(0, WIDTH, 1)
y_grid = range(H1, 0, -1) if topline else range(HEIGHT, 0, -1)
txt = '┌' + ((WIDTH - 1) * '───┬') + '───┐' + "\n"
for y in y_grid:
txt += '│'
for x in x_grid:
filter = 1 << (x * H1) + (y - 1)
sign = SIGNS[2]
sign = SIGNS[0] if bbs[0] & filter else sign
sign = SIGNS[1] if bbs[1] & filter else sign
txt += ' ' + sign + ' │'
txt += "\n├"+((WIDTH-1)*'───┼')+'───┤'+"\n" if y > 1 else ''
txt += "\n└"+((WIDTH-1)*'───┴')+'───┘'+"\n"
txt += (str().join(map(lambda x: ' '+str(x), x_grid)))[1::]
return txt
bbs = [0, 0]
bare = [(1 << x) for x in [0, 7, 14, 21, 28, 35, 42]]
lock = [0 for x in range(7)]
names = ["GELB", "ROT"]
count = 0
while(count < SIZE):
playables = [x for x in range(WIDTH) if not lock[x]]
txt = LFs + "VIER GEWINNT\n============\n" + grid()
txt += "\n"+names[count & 1]+" ("+SIGNS[count & 1]+") ist am Zug."
txt += "\nMögliche Slots: " + str(playables) + ": "
txt = input(txt)
if txt in ['e', 'E']:
break
if txt in [str(x) for x in playables]:
move(int(txt))
if (has_won(bbs[count & 1])):
print(LFs + "VIER GEWINNT\n============\n" + grid())
input(names[count & 1] + " hat gewonnen...")
break
count += 1
else:
input("\nFehleingabe...")