简单四子棋程序

 AI 就忽略吧, 这个版本的程序还没做出来。。。。。。

import copy
import random

situation = []
row = 7
column = 5
situation = [[0 for j in range(column)] for i in range(row)]
situation[-1] = [3 for j in range(column)]


class bcolors:
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    OKGREEN = '\033[92m'
    WARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'
    BOLD = '\033[1m'
    UNDERLINE = '\033[4m'


def play(time, max_column=column):  # 落子
    global times
    if time % 2 == 0:
        player = 2
    else:
        player = 1
    while 1:
        while 1:  # inputing
            try:
                column = int(input('PLZ INPUT column'))
                if -1 < column < max_column:
                    break
                else:
                    print(bcolors.FAIL+'IndexError: list index out of range'+bcolors.ENDC)
            except:
                print(bcolors.FAIL+'wrong input'+bcolors.ENDC)
                column = int(input('PLZ INPUT column'))

        try:
            for i in range(row):
                if situation[i][column] == 3:
                    situation[i][column] = player
                    break
            break
        except:
            print('index error')

    times = time+1


class AI():
    def detect_will_win(row=row, column=column):  # ——检测
        Win = False
        winner = None
        type = None
        row_win = None
        win_column = None
        for i in range(row):
            for j in range(column-2):
                counter1 = 0
                counter2 = 0
                for increment in range(3):
                    if situation[i][j+increment]==1:
                        counter1+=1
                    if situation[i][j+increment]==2:
                        counter2+=1
                if counter1 == 3:
                    Win=True
                    winner = 1
                    type = 'horizontal'
                    row_win, win_column = i, j
                if counter2 == 3:
                    Win=True
                    winner = 2
                    type = 'horizontal'
                    row_win, win_column = i, j


        for i in range(row-2):  # | 检测
            for j in range(column):
                counter1 = 0
                counter2 = 0
                for increment in range(3):
                    if situation[i+increment][j]==1:
                        counter1+=1
                    if situation[i+increment][j]==2:
                        counter2+=1
                if counter1 == 3:
                    Win=True
                    winner = 1
                    type = 'verticle'
                    row_win, win_column = i, j
                if counter2 == 3:
                    Win=True
                    winner = 2
                    type = 'verticle'
                    row_win, win_column = i, j


        for i in range(row-2):  # / 检测
            for j in range(2,column):
                counter1 = 0
                counter2 = 0
                for increment in range(3):
                    if situation[i+increment][j-increment]==1:
                        counter1+=1
                    if situation[i+increment][j-increment]==2:
                        counter2+=1
                if counter1 == 3:
                    Win=True
                    winner = 1
                    type = 'left oblique'
                    row_win, win_column = i, j
                if counter2 == 3:
                    Win=True
                    winner = 2
                    type = 'left oblique'  
                    row_win, win_column = i, j  


        for i in range(row-2):  # \ 检测
            for j in range(column-2):
                counter1 = 0
                counter2 = 0
                for increment in range(3):
                    if situation[i+increment][j+increment]==1:
                        counter1+=1
                    if situation[i+increment][j+increment]==2:
                        counter2+=1
                if counter1 == 3:
                    Win=True
                    winner = 1
                    type = 'right oblique'
                    row_win, win_column = i, j
                if counter2 == 3:
                    Win=True
                    winner = 2 
                    type = 'right oblique'
                    row_win, win_column = i, j
        return Win, winner, type, row_win, win_column
    

    def predict_play(time , column2, max_column=column):  # 落子_fake
        if time % 2 == 0:
            player = 2
        else:
            player = 1

        for i in range(row):
            try:
                if situation2[i][column2] == 3:
                    situation2[i][column2] = player
                    opperation.append([i,column2])

            except IndexError:
                print(i, column2)


    def predict_detect_space(row=row, column=column):  # 模拟检测
        find = False
        for j in range(column):
            for i in range(row):
                if situation2[i][j] == 1 or situation2[i][j] == 2:
                    try:
                        situation2[i-1][j]= 3
                        find=True
                        break
                    except IndexError:
                        break
        if find==False:
            return find, j


    def AI_predict(row=row, column=column):
        global situation2
#        situation2 = copy.deepcopy(situation)
#        times2 = 0
#        Win_1 = False
#        times_predict = 100
#        win_list = []
#        for i in range(times_predict):
#            oppertion = []
#            situation2 = copy.deepcopy(situation)
#            for i2 in range(100):
#                column1 = random.randint(0,column-1)
#                AI.predict_play(times2, column1)
#                times2 += 1
#                AI.predict_detect_space()
#                fakewin, fake_winner = AI.detect_win()
#
#                if fakewin:
#                    win_list.append(opperation)
#                    break
#        print(win_list)
        # 3子检测
        win_column = None
        Win_will, winner_will, type, win_row, win_column = AI.detect_will_win()
        if Win_will:
            if winner_will == 2 or winner_will == 1:
                try:
                    print('要赢', type)                            
                    win_row, win_column = AI.detect_if_can_win(type, win_row, win_column)
                except Exception as e:
                    print(e)
                    win_column = random.randint(0, column)
        return win_column

    def detect_if_can_win(type, win_row, win_column):
        if type == 'horizontal':
            if situation[win_row][win_column-1] == 3:
                return win_row, win_column-1
            if situation[win_row][win_column+3] == 3:
                return win_row, win_column+3

        if type == 'verticle':
            if situation[win_row-1][win_column] == 3:
                return win_row-1, win_column  
            if situation[win_row+3][win_column] == 3:
                return win_row+3, win_column

        if type == 'left oblique':
            if situation[win_row-1][win_column+1] == 3:
                return win_row-1, win_column-1 
            if situation[win_row+3][win_column-3] == 3:
                return win_row+3, win_column-3         

        if type == 'right oblique':
            if situation[win_row-1][win_column-1] == 3:
                return win_row-1, win_column+3 
            if situation[win_row+3][win_column+3] == 3:
                return win_row+1, win_column+3  

    def AI_play():
        final_column = AI.AI_predict()
        if final_column == None:
            final_column = random.randint(0,column-1)
            print('random choosing')
        player = 2
        error_counter = 0
        for i in range(100):

            try:
                for i in range(row):
                    if situation[i][final_column] == 3:
                        situation[i][final_column] = player
                        break
            except:
                error_counter += 1
                final_column = random.randint(0, column)
        if error_counter > 99:
            print('已满,平局')


    def detect_win(row=row, column=column):  # ——检测
        Win = False
        winner = None
        for i in range(row):
            for j in range(column-3):
                counter1 = 0
                counter2 = 0
                for increment in range(4):
                    if situation[i][j+increment]==1:
                        counter1+=1
                    if situation[i][j+increment]==2:
                        counter2+=1
                if counter1 == 4:
                    Win=True
                    winner = 1
                if counter2 == 4:
                    Win=True
                    winner = 2


        for i in range(row-3):  # | 检测
            for j in range(column):
                counter1 = 0
                counter2 = 0
                for increment in range(4):
                    if situation[i+increment][j]==1:
                        counter1+=1
                    if situation[i+increment][j]==2:
                        counter2+=1
                if counter1 == 4:
                    Win=True
                    winner = 1
                if counter2 == 4:
                    Win=True
                    winner = 2


        for i in range(row-3):  # / 检测
            for j in range(3,column):
                counter1 = 0
                counter2 = 0
                for increment in range(4):
                    if situation[i+increment][j-increment]==1:
                        counter1+=1
                    if situation[i+increment][j-increment]==2:
                        counter2+=1
                if counter1 == 4:
                    Win=True
                    winner = 1
                if counter2 == 4:
                    Win=True
                    winner = 2    


        for i in range(row-3):  # \ 检测
            for j in range(column-3):
                counter1 = 0
                counter2 = 0
                for increment in range(4):
                    if situation[i+increment][j+increment]==1:
                        counter1+=1
                    if situation[i+increment][j+increment]==2:
                        counter2+=1
                if counter1 == 4:
                    Win=True
                    winner = 1
                if counter2 == 4:
                    Win=True
                    winner = 2 
        return Win, winner


def detect_space(row=row, column=column):  # 检测可落子区域
    find = False
    for j in range(column):
        for i in range(row):
            if situation[i][j] == 1 or situation[i][j] == 2:
                try:
                    situation[i-1][j]= 3
                    find=True
                    break
                except IndexError:
                    print(j, '已经满了')
                    break
    if find==False:
        return find, j
def virtualise():
    for row in situation:
        for column in row:
            if column == 1:
                print(bcolors.HEADER + str(column) +bcolors.ENDC, end='  ')
            elif column == 2:
                print(bcolors.FAIL + str(column) +bcolors.ENDC, end='  ')
            else:
                print(column,end='  ')
        print('')
    print('\n')


def detect_win(row=row, column=column):  # ——检测
    Win = False
    winner = None
    for i in range(row):
        for j in range(column-3):
            counter1 = 0
            counter2 = 0
            for increment in range(4):
                if situation[i][j+increment]==1:
                    counter1+=1
                if situation[i][j+increment]==2:
                    counter2+=1
            if counter1 == 4:
                Win=True
                winner = 1
            if counter2 == 4:
                Win=True
                winner = 2


    for i in range(row-3):  # | 检测
        for j in range(column):
            counter1 = 0
            counter2 = 0
            for increment in range(4):
                if situation[i+increment][j]==1:
                    counter1+=1
                if situation[i+increment][j]==2:
                    counter2+=1
            if counter1 == 4:
                Win=True
                winner = 1
            if counter2 == 4:
                Win=True
                winner = 2


    for i in range(row-3):  # / 检测
        for j in range(3,column):
            counter1 = 0
            counter2 = 0
            for increment in range(4):
                if situation[i+increment][j-increment]==1:
                    counter1+=1
                if situation[i+increment][j-increment]==2:
                    counter2+=1
            if counter1 == 4:
                Win=True
                winner = 1
            if counter2 == 4:
                Win=True
                winner = 2    
    

    for i in range(row-3):  # \ 检测
        for j in range(column-3):
            counter1 = 0
            counter2 = 0
            for increment in range(4):
                if situation[i+increment][j+increment]==1:
                    counter1+=1
                if situation[i+increment][j+increment]==2:
                    counter2+=1
            if counter1 == 4:
                Win=True
                winner = 1
            if counter2 == 4:
                Win=True
                winner = 2 
    return Win, winner



Win = False
times = 1
mode = int(input('Do you want to play with machine? \n if yes please input 1 ,no input 0\n'))
opperation = []
situation2 = []
while Win != True and mode == 0:
    play(times)
    detect_space()
    Win, winner = detect_win()
    virtualise()



print('congradulation! Winner is '+bcolors.WARNING + str(winner) + bcolors.UNDERLINE)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值