LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 729|回复: 0

学习python,制作了一个人机对战的跳棋游戏,欢迎大家品尝.

[复制链接]
发表于 2004-12-31 10:11:14 | 显示全部楼层 |阅读模式

  1. ##    This program is free software; you can redistribute it and/or modify
  2. ##    it under the terms of the GNU General Public License as published by
  3. ##    the Free Software Foundation; either version 2 of the License, or
  4. ##    (at your option) any later version.
  5. ##
  6. ##    This program is distributed in the hope that it will be useful,
  7. ##    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. ##    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9. ##    GNU General Public License for more details.
  10. ##
  11. ##    You should have received a copy of the GNU General Public License
  12. ##    along with this program; if not, write to the Free Software
  13. ##    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

  14. ##    Welcome to [email]rujingli@163.com[/email] with any suggestion

  15. import random,sys

  16. #paneldef is the pan def.
  17. #is 121 structs of
  18. #    0=(x,y)=pos
  19. #    1=(n1,n2...n6)=ML,MR,TR,BL,TL,BR  M=middle L=Left R=Right T=Top B=buttom
  20. #    2=curvalue  0=Empty 1..6=Group1..Group6

  21. paneldef = [[] for i in range(121)]
  22. Battle=[0 for i in range(121)]
  23. MyGroup  = [0,1,2,3,4,5,6,7,8,9]
  24. YourGroup = [111,112,113,114,115,116,117,118,119,120]
  25. Dirs={'ML':0,'MR':1,'TR':2,'BL':3,'TL':4,'BR':5}
  26. MaxFindWay=100

  27. #*********The code below used to create the pan def********************
  28. def CreatePan():
  29.     ad=[1,2,3,4,13,12,11,10,9,10,11,12,13,4,3,2,1]
  30.     curnum=0
  31.     for n in range(0,17):
  32.         if ad[n] % 2 == 0:
  33.             for z in range(0,ad[n]):
  34.                  X= 13+(z-ad[n]/2)*2+1;
  35.                  paneldef[curnum].append([(X,n),[255,255,255,255,255,255]])
  36.                  curnum=curnum+1
  37.         else :
  38.             for z in range(0,ad[n]):
  39.                  X= 14 - ad[n] + 2 * z;
  40.                  paneldef[curnum].append([(X,n),[255,255,255,255,255,255]])
  41.                  curnum=curnum+1
  42.     return
  43. #************************************************************************

  44. ##Function Used to print the pan state
  45. def PrintPanel(abattle):
  46.     strs=[]
  47.     for n in range(0,17):
  48.         strs[1:1]=['                         ']
  49.     for n in range(0,121):
  50.         strs[paneldef[n][0][0][1]]= strs[paneldef[n][0][0][1]][:paneldef[n][0][0][0]] + chr(abattle[n]) + strs[paneldef[n][0][0][1]][paneldef[n][0][0][0]+1:]
  51.     for n in range(0,17):
  52.         print strs[n]
  53.     return

  54. ##Function Use to Calc the ML..BR index***************
  55. def CalcRelation():
  56.     for index in range(0,121):
  57.         for ckindex in range(0,121):
  58.             #check ML
  59.             if (paneldef[ckindex][0][0][0] == paneldef[index][0][0][0] - 2) and (paneldef[ckindex][0][0][1] == paneldef[index][0][0][1]) :
  60.                 paneldef[index][0][1][0] = ckindex
  61.             #check MR
  62.             if (paneldef[ckindex][0][0][0] == paneldef[index][0][0][0] + 2) and (paneldef[ckindex][0][0][1] == paneldef[index][0][0][1]) :
  63.                 paneldef[index][0][1][1] = ckindex
  64.             #check TR
  65.             if (paneldef[ckindex][0][0][0] == paneldef[index][0][0][0] + 1) and (paneldef[ckindex][0][0][1] == paneldef[index][0][0][1] - 1) :
  66.                 paneldef[index][0][1][2] = ckindex
  67.             #check BL
  68.             if (paneldef[ckindex][0][0][0] == paneldef[index][0][0][0] - 1) and (paneldef[ckindex][0][0][1] == paneldef[index][0][0][1] + 1) :
  69.                 paneldef[index][0][1][3] = ckindex
  70.             #check TL
  71.             if (paneldef[ckindex][0][0][0] == paneldef[index][0][0][0] - 1) and (paneldef[ckindex][0][0][1] == paneldef[index][0][0][1] - 1) :
  72.                 paneldef[index][0][1][4] = ckindex
  73.             #check BR
  74.             if (paneldef[ckindex][0][0][0] == paneldef[index][0][0][0] + 1) and (paneldef[ckindex][0][0][1] == paneldef[index][0][0][1] + 1) :
  75.                 paneldef[index][0][1][5] = ckindex
  76.     return
  77. #******************************************************

  78. ##Function used to Get Relation of one***************
  79. def relation(Index):
  80.     return paneldef[Index][0][1]
  81. ##******************************************************

  82. ##Function used to init one battle*************************************
  83. def initBattle():
  84.     for n in range(0,10):
  85.         Battle[n] = ord('*')
  86.     for n in range(10,111):
  87.         Battle[n] = ord('-')
  88.     for n in range(111,121):
  89.         Battle[n] = ord('0') + n - 111
  90.     MyGroup  = [0,1,2,3,4,5,6,7,8,9]
  91.     YourGroup = [111,112,113,114,115,116,117,118,119,120]
  92.     return
  93. ##********************************************************************

  94. def DirValue(index,dir):
  95.     if Dirs.has_key(dir):
  96.         return paneldef[index][0][1][Dirs[dir]]
  97.     else:
  98.         return -1

  99. def Move(index,dir,abattle):
  100.     if Dirs.has_key(dir):
  101.         dv = DirValue(index,dir)
  102.         if dv != 255:
  103.             if chr(abattle[dv]) in ('~','%','#','$','a','-','='):
  104.                 return (False,DirValue(index,dir))
  105.             else :
  106.                 dv2 = DirValue(dv,dir)
  107.                 if dv2 != 255:
  108.                     if chr(abattle[dv2]) in ('~','%','#','$','a','-','='):
  109.                         return (True,dv2)
  110.     return (False,-1)

  111. def DoYouMove(cmds):
  112.     CurIndex = YourGroup[int(cmds[0])]
  113.     JumpHis  = [CurIndex]
  114.     abattle=[]
  115.     abattle[0:0]=Battle
  116.     for n in range(1,len(cmds)):
  117.         dest = Move(CurIndex,cmds[n],abattle)
  118.         if dest[1] != -1 and (dest[0] or (n==1)):
  119.             JumpHis[len(JumpHis):len(JumpHis)] = [dest[1]]
  120.             CurIndex = dest[1]
  121.             abattle[dest[1]] = ord(cmds[0][0])
  122.             abattle[JumpHis[len(JumpHis)-2]] = ord('-')
  123.         else :
  124.             if cmds[n].strip() == "":
  125.                 continue
  126.             print 'Bad Cmd:Unknown Keyword "%s" or Can not jump to "%s". \nUse "H" to help.' % (cmds[n],cmds[n])
  127.             return False
  128.     for n in range(0,len(JumpHis)):
  129.         if n==0 :
  130.             Battle[JumpHis[n]] = ord('~')
  131.         elif n == len(JumpHis)-1 :
  132.             Battle[JumpHis[n]] = ord(cmds[0][0])
  133.             YourGroup[int(cmds[0])] = JumpHis[n]   
  134.         else :
  135.             Battle[JumpHis[n]] = ord('-')
  136.     return True

  137. # this is a loopback function to get all possible move function
  138. def TestMove(Index,Ret,RetIndex,abattle):
  139.     for j in range(0,6):
  140.         if Ret[0]>=MaxFindWay:
  141.             return
  142.         dest = Move(Index,Dirs.keys()[j],abattle)
  143.         if dest[1] != -1:
  144.             if RetIndex == -1:
  145.                 Ret[1][Ret[0]].append(Index)
  146.                 Ret[1][Ret[0]].append(dest[1])
  147.             else:
  148.                 if dest[0] and (not (dest[1] in Ret[1][RetIndex])):
  149.                     Ret[1][Ret[0]][0:0] = Ret[1][RetIndex];
  150.                     Ret[1][Ret[0]].append(dest[1])
  151.                 else :
  152.                     continue
  153.             Ret[0]=Ret[0]+1
  154.             if Ret[0]>=MaxFindWay:
  155.                 return
  156.             else:
  157.                 if dest[0]:
  158.                     TestMove(dest[1],Ret,Ret[0]-1,abattle)   
  159.     return

  160. def RateValueX(X):
  161.     absv = abs(X - 13);
  162.     if absv<5:
  163.         return 0
  164.     else:
  165.         return absv * 9

  166. def RateValueY(Y):
  167.     return Y * 10

  168. def MyTotalRate():
  169.     TotalRate=0
  170.     for n in range(0,10):
  171.         TotalRate += (RateValueY(paneldef[MyGroup[n]][0][0][1]) - RateValueX(paneldef[MyGroup[n]][0][0][0]))
  172.     return TotalRate

  173. def CheckIWin():
  174.     for n in range(0,10):
  175.         if MyGroup[n] < 111:
  176.             return False
  177.     return True


  178. def UpdateMyGroup(oldValue,newValue):
  179.     for n in range(0,10):
  180.         if MyGroup[n] == oldValue:
  181.             MyGroup[n] = newValue
  182.             return True
  183.     return False

  184. def GetMaxRateValue(abattle,level):
  185.     level-=1
  186.     if level<=0:
  187.         return MyTotalRate()
  188.     else:
  189.         path=[[] for i in range(MaxFindWay)]
  190.         ret=[0,path]
  191.         tmpbattle=[]
  192.         tmpbattle[0:0]=abattle
  193.         for n in range(0,10): #MyGroup
  194.             CurIndex = MyGroup[n]
  195.             TestMove(CurIndex,ret,-1,tmpbattle)

  196.         MaxRateValue=0
  197.         RateValue=0
  198.         for n in range(0,ret[0]):
  199.             #RateValue = MyTotalRate() #(RateValueY(paneldef[path[n][len(path[n])-1]][0][0][1]) - RateValueY(paneldef[path[n][0]][0][0][1])) - (RateValueX(paneldef[path[n][len(path[n])-1]][0][0][0]) - RateValueX(paneldef[path[n][0]][0][0][0]))
  200.             #print 'Level %d Index %d Value %d' % (level,n,RateValue)
  201.             tmpbattle[path[n][0]] = ord('-')
  202.             tmpbattle[path[n][len(path[n])-1]] = ord('*')
  203.             UpdateMyGroup(path[n][0],path[n][len(path[n])-1])
  204.             if CheckIWin():
  205.                 UpdateMyGroup(path[n][len(path[n])-1],path[n][0])
  206.                 return sys.maxint
  207.             RateValue = GetMaxRateValue(tmpbattle,level)
  208.             UpdateMyGroup(path[n][len(path[n])-1],path[n][0])
  209.             tmpbattle[path[n][0]] = ord('*')
  210.             tmpbattle[path[n][len(path[n])-1]] = ord('-')

  211.             if RateValue>MaxRateValue:
  212.                 MaxRateValue = RateValue
  213.         return MaxRateValue

  214. def DoMyMove():
  215.     path=[[] for i in range(MaxFindWay)]
  216.     ret=[0,path]
  217.     tmpbattle=[]
  218.     tmpbattle[0:0]=Battle
  219.     for n in range(0,10): #MyGroup
  220.         CurIndex = MyGroup[n]
  221.         TestMove(CurIndex,ret,-1,tmpbattle)   

  222.     SaveMyGroup=[]
  223.     SaveMyGroup[0:0]=MyGroup
  224.     MaxRateValue=0
  225.     MinY=100
  226.     MaxRateIndex=-1
  227.     for n in range(0,ret[0]):
  228.         #RateValue = (RateValueY(paneldef[path[n][len(path[n])-1]][0][0][1]) - RateValueY(paneldef[path[n][0]][0][0][1])) - (RateValueX(paneldef[path[n][len(path[n])-1]][0][0][0]) - RateValueX(paneldef[path[n][0]][0][0][0]))
  229.         #suppose we do this change,what's the next max value we should conside
  230.         tmpbattle[path[n][0]] = ord('-')
  231.         tmpbattle[path[n][len(path[n])-1]] = ord('*')
  232.         UpdateMyGroup(path[n][0],path[n][len(path[n])-1])
  233.         if CheckIWin():
  234.             MaxRateIndex = n
  235.             break
  236.         RateValue = GetMaxRateValue(tmpbattle,2)
  237.         UpdateMyGroup(path[n][len(path[n])-1],path[n][0])
  238.         tmpbattle[path[n][0]] = ord('*')
  239.         tmpbattle[path[n][len(path[n])-1]] = ord('-')
  240.         
  241.         if RateValue>MaxRateValue:
  242.             MaxRateValue = RateValue
  243.             MaxRateIndex = n
  244.         elif RateValue==MaxRateValue:
  245.             if paneldef[path[n][0]][0][0][1] < MinY:
  246.                 MinY = paneldef[path[n][0]][0][0][1]
  247.                 MaxRateIndex = n

  248.     MyGroup[0:] = SaveMyGroup
  249.    
  250.     if MaxRateIndex==-1:
  251.         MaxRateIndex = random.randint(0,ret[0]-1)
  252.     IndexInMyGroup=-1
  253.     for n in range(0,10):
  254.         if MyGroup[n] == path[MaxRateIndex][0]:
  255.             IndexInMyGroup=n
  256.     if IndexInMyGroup==-1:
  257.         print 'Bad Result Path,This is internal error,report to author!'
  258.         Finish = True
  259.     else:
  260.         for n in range(0,len(path[MaxRateIndex])):
  261.             if n==0 :
  262.                 Battle[path[MaxRateIndex][n]] = ord('=')
  263.             elif n == len(path[MaxRateIndex])-1 :
  264.                 Battle[path[MaxRateIndex][n]] = ord('m')
  265.                 MyGroup[IndexInMyGroup] = path[MaxRateIndex][n]   
  266.             else :
  267.                 Battle[path[MaxRateIndex][n]] = ord('-')        
  268.     return

  269. def CheckYouWin():
  270.     for n in range(0,10):
  271.         if YourGroup[n] > 9:
  272.             return False
  273.     return True

  274. def YourTotalRate():
  275.     TotalRate=0
  276.     for n in range(0,10):
  277.         TotalRate += (RateValueY(paneldef[120-YourGroup[n]][0][0][1]) - RateValueX(paneldef[120-YourGroup[n]][0][0][0]))
  278.     return TotalRate

  279. print 'Jump version 0.1 By wesley.wang at [email]rujingli@163.com[/email]'
  280. print '"H" for help\n'

  281. CreatePan()
  282. CalcRelation()
  283. initBattle()

  284. Finish = False

  285. while not Finish :
  286.     PrintPanel(Battle)
  287.     #print 'Your Total Rate Now :',YourTotalRate()
  288.     #print 'My Total Rate Now :',MyTotalRate()
  289.     if MyTotalRate()>=YourTotalRate():
  290.         print 'HeHe...'
  291.     else :
  292.         print 'Oh My God!'

  293.     #erase last round history
  294.     for n in range(0,121):
  295.         if chr(Battle[n]) in ('%','#','$','a','~','=') :
  296.             Battle[n] = ord('-')
  297.         if chr(Battle[n]) == 'm':
  298.             Battle[n] = ord('*')

  299.     Cmd = raw_input('\nYour Turn("Q" to quit):')
  300.     Cmd = Cmd.upper().strip()
  301.     if Cmd[0] == 'Q':
  302.         print "Bye!!"
  303.         break
  304.     elif Cmd[0] == 'H':
  305.         print 'the input should star with "0".."9" followed by Sequence of "ML,MR,TR,BL,TL,BR"'
  306.         print 'ML = Middle Left'
  307.         print 'MR = Middle Right'
  308.         print 'TR = Top Right'
  309.         print 'BL = Buttom Left'
  310.         print 'TL = Top Right'
  311.         print 'BR = Buttom Right'
  312.         print 'For example:0 TL ML'
  313.     else :
  314.         cmds = Cmd.split(' ')
  315.         if len(cmds)<2 or not ord(cmds[0][0]) in range(ord('0'),ord('9')+1) :
  316.             print "Bad Input, 'H' for Help. Try Again!"
  317.         else :
  318.             if DoYouMove(cmds):
  319.                 DoMyMove()
  320.         YouWin=CheckYouWin()
  321.         IWin=CheckIWin()
  322.         Finish = (YouWin or IWin)
  323.         if Finish:
  324.             PrintPanel(Battle)
  325.         if (YouWin and (not IWin)):
  326.             print 'You are so intelligent!'
  327.             print 'You Win!'
  328.         elif (IWin and (not YouWin)):
  329.             print 'Sorry, You lose!'
  330.         elif (YouWin and IWin):
  331.             print 'Hehe, Same time!'

  332. raw_input('Press Return To Quit!')
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表