• Python(四):数字连珠2


    对上次的代码作了一些修改。在码的过程中发现,最核心的部分是在横向、竖向和两个对角方向上找到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('
    ')
     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             break
    103         else:
    104             slr += str(chpad[x+i][y+i])
    105     
    106     # from right-top to left-buttom
    107     for i in range(1,x):
    108         if x-i <= 0 or y+i >= ColNum:
    109             break
    110         else:
    111             srl += str(chpad[x-i][y+i])
    112     srl[::-1]  # reverse
    113     
    114     for i in range(RowNum-x):
    115         if x+i > RowNum-1 or y-i < 0:
    116             break
    117         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('
    -------------------GAME------------------
    ')
    124     pad = chesspad_init()
    125     
    126     while 1:
    127         n = 1
    128         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("
    
    GAME OVER!")
    135                     exit()
    136                 n += 1
    137             if n > 3:
    138                 break
    139         print('
    ')    
    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]实现更简洁。

  • 相关阅读:
    protobuf 协议 windows 下 C++ 环境搭建
    protobuf 协议 windows 下 java 环境搭建
    ProtocolBuffers (二) android与PC,C#与Java 利用protobuf 进行无障碍通讯【Socket】
    C++ ofstream和ifstream详细用法
    C# 关于out和ref的问题
    java 解析office文件 大全
    Ezhuang
    IOS
    Android Client and PHP Server
    一个IM开源项目LiteTalk
  • 原文地址:https://www.cnblogs.com/py520ziyi/p/5579367.html
Copyright © 2020-2023  润新知