对上次的代码作了一些修改。在码的过程中发现,最核心的部分是在横向、竖向和两个对角方向上找到5个以上相同的数字。
自己的思路是将x行y列所在的x行、y列,以及以此为交叉点的两点对角线上的数字,转化成字符串(这部分是程序中get4str()的功能),然后利用字符串相关函数进行处理(待完成)。
最新修改代码如下:
1 import random # for random.randrange() 2 import os # for input() 3 import string # for string.count() 4 5 ballColorNum = 7 # 7 colors 6 RowNum = 6 # chesspad have 10 rows 7 ColNum = 10 # chesspad have 10 cols 8 9 chPad = [] # save chesspad state 10 Scores = 0 # save scores 11 12 class ball(): 13 def __init__(self): 14 self.color = random.randrange(1,ballColorNum) 15 self.x = random.randrange(0,RowNum) 16 self.y = random.randrange(0,ColNum) 17 18 #--------------------------------------- 19 # initial chesspad state, all 0, COL*ROW 20 #--------------------------------------- 21 def chesspad_init(): 22 chPad = [[0 for x in range(ColNum)] for x in range(RowNum)] 23 return chPad 24 #--------------------------------------- 25 # update chesspad with a ball 26 #--------------------------------------- 27 def chesspad_update(chPad, ball): 28 chPad[ball.x][ball.y] = ball.color 29 return chPad 30 #--------------------------------------- 31 # redraw chesspad 32 #--------------------------------------- 33 def chesspad_flush(chPad): 34 for i in range(len(chPad)): 35 for c in chPad[i]: 36 print('%d'%c,end=' ') #for win 37 #print('\33[1;%dm%d'%(30+c,c),end=' ') #for linux 38 print('\n') 39 #--------------------------------------- 40 # count the number of unused spaces in chesspad 41 #--------------------------------------- 42 def countNull(chPad): 43 n = 0 44 for i in range(len(chPad)): 45 for j in range(len(chPad[i])): 46 if chPad[i][j] == 0: 47 n += 1 48 return n 49 #--------------------------------------- 50 # move from x1,y1 to x2,y2 51 #--------------------------------------- 52 def move(chpad,x1,y1,x2,y2): 53 if x1 > RowNum-1 or x2 > RowNum-1 \ 54 or y2 > ColNum-1 or y1 > ColNum-1: 55 print('input error') 56 57 else: 58 chpad[x1][y1],chpad[x2][y2] = \ 59 chpad[x2][y2],chpad[x1][y1] 60 61 #--------------------------------------- 62 # calculate_Score 63 #--------------------------------------- 64 def calculate_Score(chpad): 65 pass 66 67 #--------------------------------------- 68 # find 69 #--------------------------------------- 70 def compare_str(str4dict,x,y): 71 pass 72 #--------------------------------------- 73 # generate 4 strings and return a dict: 74 # FORMART: 75 # {'RW':'...','CL':'...', 76 # 'LR':'...','RL':'...'} 77 # compare with chpad[x][y] which aspears 78 # 5 times 79 #--------------------------------------- 80 def get4str(chpad,x,y): 81 82 sx=sy=slr=srl='' 83 84 # ROW(X) 85 for c in chpad[x]: 86 sx += str(c) 87 88 # COL(Y) 89 for i in range(RowNum): 90 sy += str(chpad[i][y]) 91 92 # from left-top to right-buttom 93 for i in range(x): 94 if x-i <= 0 or y-i <= 0: 95 break 96 else: 97 slr += str(chpad[x-i-1][y-i-1]) 98 slr[::-1] # reverse 99 100 for i in range(RowNum-x):101 if x+i >= RowNum or y+i >= ColNum:102 break103 else:104 slr += str(chpad[x+i][y+i])105 106 # from right-top to left-buttom107 for i in range(1,x):108 if x-i <= 0 or y+i >= ColNum:109 break110 else:111 srl += str(chpad[x-i][y+i])112 srl[::-1] # reverse113 114 for i in range(RowNum-x):115 if x+i > RowNum-1 or y-i < 0:116 break117 else:118 srl += str(chpad[x+i][y-i])119 120 return { 'RW':sx,'CL':sy,'LR':slr,'RL':srl}121 122 def main():123 print('\n-------------------GAME------------------\n')124 pad = chesspad_init()125 126 while 1:127 n = 1128 while 1:129 b = ball()130 if pad[b.x][b.y] == 0:131 print('(%d,%d:%d)'%(b.x, b.y, b.color),end=' ')132 pad = chesspad_update(pad, b)133 if countNull(pad) == 0:134 print("\n\nGAME OVER!")135 exit()136 n += 1137 if n > 3:138 break139 print('\n') 140 141 chesspad_flush(pad)142 143 x1=y1=x2=y2=0 144 a = input('Move (x1,y2) to (x2,y2):').split(' ')145 x1,y1,x2,y2 = int(a[0]),int(a[1]),int(a[2]),int(a[3])146 move(pad,x1,y1,x2,y2 )147 print(get4str(pad, x2, y2))148 149 chesspad_flush(pad)150 151 if __name__=='__main__':152 main()
以上代码后面有修改,98行、112行本来是自己写的一个反转字符串的函数实现,后来才知道用切片str[::-1]实现更简洁。