600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > python井字棋游戏开发(人人对战 人机对战 包含源码 逻辑思维流程图)

python井字棋游戏开发(人人对战 人机对战 包含源码 逻辑思维流程图)

时间:2018-07-17 08:12:25

相关推荐

python井字棋游戏开发(人人对战 人机对战 包含源码 逻辑思维流程图)

需求分析

井字棋是比较便捷休闲娱乐的一种迷你棋,玩法比较简单,只需要一个九宫格棋盘就可以实现两人对战,规则为谁先连成三个棋子的一条线即可获胜。本游戏,需要满足两个主要功能:1.能实现玩家对战;2.能实现玩家和电脑对战。而玩家和电脑对战又需要有两个模式:1.对战高级电脑;2.对战低级电脑。设定高级电脑模式不会输给玩家(玩家只会输给电脑,或者和电脑平局),低级电脑模式电脑随机落子。游戏的主界面用于根据用户选择,而决定游戏进入什么模式,如果玩家不想玩了,即可通过主界面退出游戏。程序需要即时对每一次对战的每一步做出判断:首先,落子的位置是否合理,如果已经有棋子则不能落子。其次,如果成功落子,则场面上是否有已经获胜的玩家,如果已经有获胜的玩家则停止落子,反馈已经胜利的玩家,同时返回主页面等待用户的下一次输入。

系统设计

1.总体流程

2.高级电脑的算法设计

流程图:

说明:开局前两步必输的情况为,先手方先落中,而后手方落子在中干部分,此情况后手方必输。正确做法是后手方落子在斜对角的位置。

电脑判断落子设计:

3.玩家对玩家算法设计

4.玩家对低级电脑

5.棋盘落子后的更新显示,是否能落子,场上空棋位,胜利判断的算法的设计

棋盘的显示:

说明:棋盘的显示是根据传入的dic决定的,dic是字典1~9所对应的值。每次落子成功后都会改变dic的值,初始时dic1~9所对应的值全是‘ ’,当玩家1(X),落子后会将该点对应的值改为X;当玩家2(O)落子成功后会将该点的值改为O。

是否能落子:

说明:dic是根据用户输入实时更新的,通过while循环,使得只有用户正确输入后才能跳出循环。空的棋位其dic对应的值应为‘ ’,如此才能输入有效。

场上的空棋位:

说明:dic_value是根据用户的输入而改变的,初始时,dic_value 0~9的值都为0,如dic_value[4] = 0。当玩家1(X)落子成功后会改变该位置的dic_value为1,如dic_value[4] = 1;而当玩家2(O)落子成功后会改变该位置的dic_value为2,如dic_value[4] = 2。如此我们便可以根据dic_value来分别每个位置对应的是哪个玩家的落点。而那些dic_value值为0的便是空位置,此函数就可以返回那些空位置。

胜利判断:

说明:该游戏能连成线的方式只有8种,即

,所以我们需要判断这几条线路的情况即可。如果某一条线的dic_value全是1,则他的各部分乘积就是1,说明玩家1获胜,同时返回1;如果某一条线的dic_value全是2,则他的乘积就是8,说明玩家2获胜,同时返回1;其余情况就是没有全是同一类型的棋子,也就是该条线没有三子成线,则返回0。根据返回的1和0我们决定程序是否继续执行,已经有胜利产生我们便不再继续执行程序,则宣布本局结束。

源码 :

//名称:井字棋游戏开发//ps:棋盘展示适用于jupyterimport randomdef print_show(dic):print('%s┃%s┃%s'%(dic[1],dic[2],dic[3]))print('━╋━╋━')print('%s┃%s┃%s'%(dic[4],dic[5],dic[6]))print('━╋━╋━')print('%s┃%s┃%s'%(dic[7],dic[8],dic[9]))return dicdef for_E():print('提示:')print(' 1┃ 2┃ 3')print('━╋━╋━')print(' 4┃ 5┃ 6')print('━╋━╋━')print(' 7┃ 8┃ 9')def input_step(dic):while(1):try:step_p = int(eval(input()))if step_p >= 1 and step_p <= 9:if dic[step_p] == ' ':breakelse:print('已经下过了哎,你个憨憨!')else:print('别乱输啊,小心我打你!')except:print('别乱输啊,小心我打你!')return step_pdef judge(dic_value,choice):s1 = '玩家1获胜!'s2 = '玩家2获胜!'letters = ['123','456','789','147','258','369','159','357']value = 0for letter in letters:x1 = int(letter[0])x2 = int(letter[1])x3 = int(letter[2])value = dic_value[x1]*dic_value[x2]*dic_value[x3]if value == 1:if choice == 1:print(s1)return 1if value == 8:if choice == 1:print(s2)return 1return 0 def the_surplus(dic_value):#判断场上哪几个位置是空的,返回空的位置surplus = []i = 0while(1):i = i + 1if dic_value[i] == 0:surplus.append(i)if i == 9:return surplusdef judge_now(dic_value,i):#判断此时,是否有即将成三子的棋路,i == 1 or i == 4letters = ['123','456','789','147','258','369','159','357']for letter in letters:x1 = int(letter[0])x2 = int(letter[1])x3 = int(letter[2])value = dic_value[x1]*dic_value[x2]if value == i and dic_value[x3] == 0:return x3value = dic_value[x1]*dic_value[x3]if value == i and dic_value[x2] == 0:return x2value = dic_value[x2]*dic_value[x3]if value == i and dic_value[x1] == 0:return x1return 0def p_to_m(dic,dic_value,choice):#智慧版机器!人机对战电脑不输!if choice == '1':#choice==1 ,玩家先手print('让你先,你是不可能赢我的!')for_E()i = 0#知晓目前是第几步while(1):print('该你了!')step_p1 = input_step(dic)dic[step_p1] = dic['p1']dic_value[step_p1] = 1i = i + 1# print('第%d子,你下的是这儿~'%i)print_show(dic)about_now = judge(dic_value,0)if about_now == 1:print('你赢了!')#一行不可能执行的代码breakif i == 9:#最后一步由先手玩家结束,所以if要放到此处print('平局,看来不分伯仲!')break if i == 1:#第一步中间,必须走角落,不然必输!此if只针对玩家第一步就走中间if step_p1 == 5:step_p2 = random.choice([1,3,7,9]) #随机数dic[step_p2] = dic['p2']dic_value[step_p2] = 2i = i + 1print('挺会玩嘛,那我下这儿!')print_show(dic)continue surplus = the_surplus(dic_value)benefit = judge_now(dic_value,4)#判断自己是否能成if benefit != 0:#如果自己马上能成step_p2 = benefitdic[step_p2] = dic['p2']dic_value[step_p2] = 2i = i + 1print('不好意思,我赢了~~')print('这都没看到?就这?就这?')print_show(dic)breakelse:#正常情况随机下dangers = judge_now(dic_value,1)#判断对方是否有即将成的if dangers != 0:step_p2 = dangersdic[step_p2] = dic['p2']dic_value[step_p2] = 2i = i + 1print('差点让你成了,我堵!')print_show(dic)about_now = judge(dic_value,0)if about_now == 1:print('不好意思,我赢了')break else: if dic_value[5] == 0:#是否抢中step_p2 = 5dic[step_p2] = dic['p2']dic_value[step_p2] = 2i = i + 1print('那我先抢中!')print_show(dic)continuestep_p2 = random.choice(surplus)dic[step_p2] = dic['p2']dic_value[step_p2] = 2i = i + 1print('嘿嘿,那我下这儿~')print_show(dic)about_now = judge(dic_value,0)if about_now == 1:print('不好意思,我赢了')breakelse:#机器先下print('那我就不客气了!!!')for_E()i = 0#知晓目前是第几步while(1):#此if用于判断前两步必输局面if dic_value[5] == 2 and (dic_value[2]+dic_value[4]+dic_value[6]+dic_value[8]) == 1 and (dic_value[1] + dic_value[3] + dic_value[7] + dic_value[9]) ==0 :print('不下了,自己琢磨琢磨,你已经输了!')breaksurplus = the_surplus(dic_value)benefit = judge_now(dic_value,4)#判断自己是否能成if benefit != 0:#如果自己马上能成step_p2 = benefitdic[step_p2] = dic['p2']dic_value[step_p2] = 2i = i + 1print('不好意思,我赢了~~')print('这都没看到?就这?就这?')print_show(dic)breakelse:#正常情况随机下dangers = judge_now(dic_value,1)#判断对方是否有即将成的if dangers != 0:step_p2 = dangersdic[step_p2] = dic['p2']dic_value[step_p2] = 2i = i + 1print('差点让你成了,我堵!')print_show(dic)about_now = judge(dic_value,0)if about_now == 1:print('不好意思,我赢了')break else: if dic_value[5] == 0:#是否抢中step_p2 = 5dic[step_p2] = dic['p2']dic_value[step_p2] = 2i = i + 1print('那我先抢中!')print_show(dic)continueif i != 1:#防止上一个continue让电脑输入两次step_p2 = random.choice(surplus)dic[step_p2] = dic['p2']dic_value[step_p2] = 2i = i + 1print('嘿嘿,那我下这儿~')print_show(dic)about_now = judge(dic_value,0)if about_now == 1:print('不好意思,我赢了')breakif i == 9:#最后一步由先手玩家结束,所以if要放到此处print('平局,看来不分伯仲!')breakprint('该你了!')step_p1 = input_step(dic)dic[step_p1] = dic['p1']dic_value[step_p1] = 1i = i + 1# print('你下的是这儿~')print_show(dic)about_now = judge(dic_value,0)if about_now == 1:print('你赢了!')breakdef p_to_msb(dic,dic_value,choice):if choice == '1':print('来嘛,你先~')for_E()i = 0#知晓目前是第几步while(1):print('该你了!')step_p1 = input_step(dic)dic[step_p1] = dic['p1']dic_value[step_p1] = 1i = i + 1# print('第%d子,你下的是这儿~'%i)print_show(dic)about_now = judge(dic_value,0)if about_now == 1:print('玩家获胜!')breakif i == 9:#最后一步由先手玩家结束,所以if要放到此处print('平局,看来不分伯仲!')breaksurplus = the_surplus(dic_value)step_p2 = random.choice(surplus)#电脑直接随机下任意空出来的位置dic[step_p2] = dic['p2']dic_value[step_p2] = 2i = i + 1print('嘿嘿,那我下这儿~')print_show(dic)about_now = judge(dic_value,0)if about_now == 1:print('电脑获胜!')breakelse:print('那就我先~')for_E()i = 0#知晓目前是第几步while(1):surplus = the_surplus(dic_value)step_p2 = random.choice(surplus)#电脑直接随机下任意空出来的位置dic[step_p2] = dic['p2']dic_value[step_p2] = 2i = i + 1print('嘿嘿,那我下这儿~')print_show(dic)about_now = judge(dic_value,0)if about_now == 1:print('电脑获胜!')breakif i == 9:#最后一步由先手玩家结束,所以if要放到此处print('平局,看来不分伯仲!')breakprint('该你了!')step_p1 = input_step(dic)dic[step_p1] = dic['p1']dic_value[step_p1] = 1i = i + 1# print('第%d子,你下的是这儿~'%i)print_show(dic)about_now = judge(dic_value,0)if about_now == 1:print('玩家获胜!')break def p_to_p(dic,dic_value):#人人对战for_E()#提示下棋方式i = 0#知晓目前是第几步while(1):print('玩家1请下棋:')step_p1= input_step(dic)dic[step_p1] = dic['p1']#对用户输入进行判断,赋值,显示dic_value[step_p1] = 1print_show(dic)i = i + 1about_now = judge(dic_value,1)#对整体局面进行判断if about_now == 1:breakif i == 9:print('平局,看来不分伯仲!')break print('玩家2请下棋(○)')step_p2 = input_step(dic)dic[step_p2] = dic['p2']dic_value[step_p2] = 2print_show(dic)i = i + 1about_now = judge(dic_value,1)if about_now == 1:break def main():while(1):dic = {1:' ',2:' ',3:' ',4:' ',5:' ',6:' ',7:' ',8:' ',9:' ','p1':'×','p2':'○'}dic_value = {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0,9:0}print('请选择模式:')print('1.和你的身旁小伙伴玩')print('2.和高级人机玩')print('3.和低级人机玩')print('4.不玩了!')inputdex = input()if inputdex == '1':print('进入人人对抗!')p_to_p(dic,dic_value)continueif inputdex == '2':print('和高级人机玩')print('你先手请按 1,按任意键电脑先手!')inputdex = input()p_to_m(dic,dic_value,inputdex)continueif inputdex == '3':print('和低级人机玩')print('你先手请按 1,按任意键电脑先手!')inputdex = input()p_to_msb(dic,dic_value,inputdex)continueif inputdex == '4':print('退出游戏!')breakmain()

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。