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

本文介绍了一款井字棋游戏的开发,涉及玩家对战、电脑对手的两种模式设计,高级电脑算法确保玩家难觅胜机,低级电脑随机落子。着重讲解了电脑判断、落子策略以及胜利条件的实现,包括棋盘显示、空位判断和游戏流程图。
摘要由CSDN通过智能技术生成
  1. 需求分析

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

  1. 系统设计

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()    

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值