Python五子棋

文章目录


前言

五月一了,今天,我们来做一个小游戏——五子棋。


一、五子棋

五子棋起源于中国,全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏。双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连珠者获胜。

五子棋容易上手,老少皆宜,而且趣味横生,引人入胜。它不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。

1.导入库:
 

import pygame
import sys
from pygame.locals import QUIT, KEYDOWN
import numpy as np

2.初始化pygame:

pygame.init()
screen = pygame.display.set_mode((670, 670))
screen_color = [238, 154, 73]  # 设置画布颜色,[238,154,73]对应为棕黄色
line_color = [0, 0, 0]  # 设置线条颜色,[0,0,0]对应黑色

3.总代码:

import pygame
import sys
from pygame.locals import QUIT, KEYDOWN
import numpy as np
pygame.init()
screen = pygame.display.set_mode((670, 670))
screen_color = [238, 154, 73]  # 设置画布颜色,[238,154,73]对应为棕黄色
line_color = [0, 0, 0]  # 设置线条颜色,[0,0,0]对应黑色


def check_win(over_pos):  
    mp = np.zeros([15, 15], dtype=int)
    for val in over_pos:
        x = int((val[0][0]-27)/44)
        y = int((val[0][1]-27)/44)
        if val[1] == white_color:
            mp[x][y] = 2  
        else:
            mp[x][y] = 1 

    for i in range(15):
        pos1 = []
        pos2 = []
        for j in range(15):
            if mp[i][j] == 1:
                pos1.append([i, j])
            else:
                pos1 = []
            if mp[i][j] == 2:
                pos2.append([i, j])
            else:
                pos2 = []
            if len(pos1) >= 5:  
                return [1, pos1]
            if len(pos2) >= 5:
                return [2, pos2]

    for j in range(15):
        pos1 = []
        pos2 = []
        for i in range(15):
            if mp[i][j] == 1:
                pos1.append([i, j])
            else:
                pos1 = []
            if mp[i][j] == 2:
                pos2.append([i, j])
            else:
                pos2 = []
            if len(pos1) >= 5:
                return [1, pos1]
            if len(pos2) >= 5:
                return [2, pos2]
    for i in range(15):
        for j in range(15):
            pos1 = []
            pos2 = []
            for k in range(15):
                if i+k >= 15 or j+k >= 15:
                    break
                if mp[i+k][j+k] == 1:
                    pos1.append([i+k, j+k])
                else:
                    pos1 = []
                if mp[i+k][j+k] == 2:
                    pos2.append([i+k, j+k])
                else:
                    pos2 = []
                if len(pos1) >= 5:
                    return [1, pos1]
                if len(pos2) >= 5:
                    return [2, pos2]
    for i in range(15):
        for j in range(15):
            pos1 = []
            pos2 = []
            for k in range(15):
                if i+k >= 15 or j-k < 0:
                    break
                if mp[i+k][j-k] == 1:
                    pos1.append([i+k, j-k])
                else:
                    pos1 = []
                if mp[i+k][j-k] == 2:
                    pos2.append([i+k, j-k])
                else:
                    pos2 = []
                if len(pos1) >= 5:
                    return [1, pos1]
                if len(pos2) >= 5:
                    return [2, pos2]
    return [0, []]


def find_pos(x, y): 
    for i in range(27, 670, 44):
        for j in range(27, 670, 44):
            L1 = i-22
            L2 = i+22
            R1 = j-22
            R2 = j+22
            if x >= L1 and x <= L2 and y >= R1 and y <= R2:
                return i, j
    return x, y


def check_over_pos(x, y, over_pos): 
    for val in over_pos:
        if val[0][0] == x and val[0][1] == y:
            return False
    return True 


flag = False
tim = 0

over_pos = []
white_color = [255, 255, 255]  
black_color = [0, 0, 0] 

while True: 

    for event in pygame.event.get():  
        if event.type in (QUIT, KEYDOWN):
            sys.exit()

    screen.fill(screen_color)  
    for i in range(27, 670, 44):
        
        if i == 27 or i == 670-27:  
            pygame.draw.line(screen, line_color, [i, 27], [i, 670-27], 4)
        else:
            pygame.draw.line(screen, line_color, [i, 27], [i, 670-27], 2)
        
        if i == 27 or i == 670-27:  
            pygame.draw.line(screen, line_color, [27, i], [670-27, i], 4)
        else:
            pygame.draw.line(screen, line_color, [27, i], [670-27, i], 2)

    pygame.draw.circle(screen, line_color, [27+44*7, 27+44*7], 8, 0)

    for val in over_pos: 
        pygame.draw.circle(screen, val[1], val[0], 20, 0)

 
    res = check_win(over_pos)
    if res[0] != 0:
        for pos in res[1]:
            pygame.draw.rect(screen, [238, 48, 167], [
                             pos[0]*44+27-22, pos[1]*44+27-22, 44, 44], 2, 1)
        pygame.display.update() 
        continue  
    
    x, y = pygame.mouse.get_pos()

    x, y = find_pos(x, y)
    if check_over_pos(x, y, over_pos): 
        pygame.draw.rect(screen, [0, 229, 238], [x-22, y-22, 44, 44], 2, 1)

    keys_pressed = pygame.mouse.get_pressed() 

    if keys_pressed[0] and tim == 0:
        flag = True
        if check_over_pos(x, y, over_pos): 
            if len(over_pos) % 2 == 0:  
                over_pos.append([[x, y], black_color])
            else:
                over_pos.append([[x, y], white_color])

    
    if flag:
        tim += 1
    if tim % 50 == 0: 
        flag = False
        tim = 0

    pygame.display.update()  

总结

五月一了,你快乐了吗?

有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值