- 需求分析
井字棋是比较便捷休闲娱乐的一种迷你棋,玩法比较简单,只需要一个九宫格棋盘就可以实现两人对战,规则为谁先连成三个棋子的一条线即可获胜。本游戏,需要满足两个主要功能: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:棋盘展示适用于jupyter
import random
def 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 dic
def 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] == ' ':
break
else:
print('已经下过了哎,你个憨憨!')
else:
print('别乱输啊,小心我打你!')
except:
print('别乱输啊,小心我打你!')
return step_p
def judge(dic_value,choice):
s1 = '玩家1获胜!'
s2 = '玩家2获胜!'
letters = ['123','456','789','147','258','369','159','357']
value = 0
for 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 1
if value == 8:
if choice == 1:
print(s2)
return 1
return 0
def the_surplus(dic_value):#判断场上哪几个位置是空的,返回空的位置
surplus = []
i = 0
while(1):
i = i + 1
if dic_value[i] == 0:
surplus.append(i)
if i == 9:
return surplus
def judge_now(dic_value,i):#判断此时,是否有即将成三子的棋路,i == 1 or i == 4
letters = ['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 x3
value = dic_value[x1]*dic_value[x3]
if value == i and dic_value[x2] == 0:
return x2
value = dic_value[x2]*dic_value[x3]
if value == i and dic_value[x1] == 0:
return x1
return 0
def 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] = 1
i = i + 1
# print('第%d子,你下的是这儿~'%i)
print_show(dic)
about_now = judge(dic_value,0)
if about_now == 1:
print('你赢了!')#一行不可能执行的代码
break
if 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] = 2
i = i + 1
print('挺会玩嘛,那我下这儿!')
print_show(dic)
continue
surplus = the_surplus(dic_value)
benefit = judge_now(dic_value,4)#判断自己是否能成
if benefit != 0:#如果自己马上能成
step_p2 = benefit
dic[step_p2] = dic['p2']
dic_value[step_p2] = 2
i = i + 1
print('不好意思,我赢了~~')
print('这都没看到?就这?就这?')
print_show(dic)
break
else:#正常情况随机下
dangers = judge_now(dic_value,1)#判断对方是否有即将成的
if dangers != 0:
step_p2 = dangers
dic[step_p2] = dic['p2']
dic_value[step_p2] = 2
i = i + 1
print('差点让你成了,我堵!')
print_show(dic)
about_now = judge(dic_value,0)
if about_now == 1:
print('不好意思,我赢了')
break
else:
if dic_value[5] == 0:#是否抢中
step_p2 = 5
dic[step_p2] = dic['p2']
dic_value[step_p2] = 2
i = i + 1
print('那我先抢中!')
print_show(dic)
continue
step_p2 = random.choice(surplus)
dic[step_p2] = dic['p2']
dic_value[step_p2] = 2
i = i + 1
print('嘿嘿,那我下这儿~')
print_show(dic)
about_now = judge(dic_value,0)
if about_now == 1:
print('不好意思,我赢了')
break
else:#机器先下
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('不下了,自己琢磨琢磨,你已经输了!')
break
surplus = the_surplus(dic_value)
benefit = judge_now(dic_value,4)#判断自己是否能成
if benefit != 0:#如果自己马上能成
step_p2 = benefit
dic[step_p2] = dic['p2']
dic_value[step_p2] = 2
i = i + 1
print('不好意思,我赢了~~')
print('这都没看到?就这?就这?')
print_show(dic)
break
else:#正常情况随机下
dangers = judge_now(dic_value,1)#判断对方是否有即将成的
if dangers != 0:
step_p2 = dangers
dic[step_p2] = dic['p2']
dic_value[step_p2] = 2
i = i + 1
print('差点让你成了,我堵!')
print_show(dic)
about_now = judge(dic_value,0)
if about_now == 1:
print('不好意思,我赢了')
break
else:
if dic_value[5] == 0:#是否抢中
step_p2 = 5
dic[step_p2] = dic['p2']
dic_value[step_p2] = 2
i = i + 1
print('那我先抢中!')
print_show(dic)
continue
if i != 1:#防止上一个continue让电脑输入两次
step_p2 = random.choice(surplus)
dic[step_p2] = dic['p2']
dic_value[step_p2] = 2
i = i + 1
print('嘿嘿,那我下这儿~')
print_show(dic)
about_now = judge(dic_value,0)
if about_now == 1:
print('不好意思,我赢了')
break
if i == 9:#最后一步由先手玩家结束,所以if要放到此处
print('平局,看来不分伯仲!')
break
print('该你了!')
step_p1 = input_step(dic)
dic[step_p1] = dic['p1']
dic_value[step_p1] = 1
i = i + 1
# print('你下的是这儿~')
print_show(dic)
about_now = judge(dic_value,0)
if about_now == 1:
print('你赢了!')
break
def 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] = 1
i = i + 1
# print('第%d子,你下的是这儿~'%i)
print_show(dic)
about_now = judge(dic_value,0)
if about_now == 1:
print('玩家获胜!')
break
if i == 9:#最后一步由先手玩家结束,所以if要放到此处
print('平局,看来不分伯仲!')
break
surplus = the_surplus(dic_value)
step_p2 = random.choice(surplus)#电脑直接随机下任意空出来的位置
dic[step_p2] = dic['p2']
dic_value[step_p2] = 2
i = i + 1
print('嘿嘿,那我下这儿~')
print_show(dic)
about_now = judge(dic_value,0)
if about_now == 1:
print('电脑获胜!')
break
else:
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] = 2
i = i + 1
print('嘿嘿,那我下这儿~')
print_show(dic)
about_now = judge(dic_value,0)
if about_now == 1:
print('电脑获胜!')
break
if i == 9:#最后一步由先手玩家结束,所以if要放到此处
print('平局,看来不分伯仲!')
break
print('该你了!')
step_p1 = input_step(dic)
dic[step_p1] = dic['p1']
dic_value[step_p1] = 1
i = 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] = 1
print_show(dic)
i = i + 1
about_now = judge(dic_value,1)#对整体局面进行判断
if about_now == 1:
break
if i == 9:
print('平局,看来不分伯仲!')
break
print('玩家2请下棋(○)')
step_p2 = input_step(dic)
dic[step_p2] = dic['p2']
dic_value[step_p2] = 2
print_show(dic)
i = i + 1
about_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)
continue
if inputdex == '2':
print('和高级人机玩')
print('你先手请按 1,按任意键电脑先手!')
inputdex = input()
p_to_m(dic,dic_value,inputdex)
continue
if inputdex == '3':
print('和低级人机玩')
print('你先手请按 1,按任意键电脑先手!')
inputdex = input()
p_to_msb(dic,dic_value,inputdex)
continue
if inputdex == '4':
print('退出游戏!')
break
main()