社会专题
靓丽女人 黑白社会 硬件网络 天下军事 教育咨询 星新一代 汽车电子 幽默笑话 农村特色 有书有道 软件技术 玄幻奇幻 办公达人 便民服务 免费资源 代码效果 美文园地 寻医问药 健康保健 时尚酷玩 天文地理 科技科幻 美食天下 游山玩水 历史天空 制作教程
FLASH频道
女生游戏 益智游戏 有声艺术 有声故事 电脑运用 休闲游戏 MTV类 运动游戏
聚划算
商旅游玩 装潢装饰 家电家具 服装服饰 健康保健 二手特色 生活必备 数码产品
映讯频道
喜剧片 国内片 情感片 动作片 战争片 纪录之窗 欧美剧集 明星云集 动漫片 港澳台剧 大陆剧 科幻片 恐怖片 浓缩电影 教育教学 艺术无界 一技之长 邻国热剧
下载中心
音体美合 信息社政 英语外语 科学自然 常用软件 语文数学 手机软件 红绿软件
图片中心
制作美图 生活图片 美女欣赏 实物图片 艺术欣赏 风景欣赏
领券购
热销女装 热血男装 生活必须 电子电器 手机电脑 旅游出行 学习艺术 吃货优选
新闻中心
一语惊人 奇闻趣事 热点专栏 曝光台 消费警示 今日观察 IT业界 消费主张 动态备忘 专利之窗
关闭
当前位置:首页社会专题硬件网络
100行python代码实现五子棋

五子棋是是一种两人对弈的纯策略型棋类游戏。

五子棋有两种玩法。玩法一:双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜。玩法二:自己形成五子连线就替换对方任意一枚棋子。被替换的棋子可以和对方交换棋子。最后以先出完所有棋子的一方为胜。

案例展示

pygame模块

游戏采用pygame模块需要先安装

pip install pygame

窗口启动

import pygame

pygame.init()
pygame.display.set_caption('五子棋-IT入门') # 改标题
# pygame.display.set_mode()表示建立个窗口,左上角为坐标原点,往右为x正向,往下为y轴正向
screen = pygame.display.set_mode((640,640))

绘制棋子

需要说一下的是画棋子,因为没找到什么合适的棋子图片,所以只要自己来画棋子。

我们用pygame.draw.circle

绘制棋盘

# 定义棋盘这个类
class RenjuBoard(object):

   def __init__(self):
       # self._board = board = [[EMPTY] * 15 for _ in range(15)]
       # 将棋盘每一个交叉点都看作列表的一个元素位,一共有15*15共225个元素
       self._board = [[]] * 15
       self.reset()
   #重置棋盘
   def reset(self):
       for row in range(len(self._board)):
           self._board[row] = [EMPTY] * 15
   #定义棋盘上的下棋函数,row表示行,col表示列,is_black表示判断当前点位该下黑棋,还是白棋
   def move(self, row, col, is_black):
       if self._board[row][col] == EMPTY:
           self._board[row][col] = BLACK if is_black else WHITE
           return True
       return False
   # 给棋盘定义一个函数将自己在screen上面画出来,使用pygame.draw()函数。并且顺便将下了的棋子也画出来
   def draw(self, screen):
       for h in range(1, 16):
           pygame.draw.line(screen, black_color,
                            [40, h * 40], [600, h * 40], 1)
           pygame.draw.line(screen, black_color,
                            [h * 40,40], [h * 40, 600], 1)
       # 给棋盘加一个外框,使美观
       pygame.draw.rect(screen, black_color, [36, 36, 568, 568], 3)

       # 在棋盘上标出,天元以及另外4个特殊点位
       pygame.draw.circle(screen, black_color, [320, 320], 5, 0)
       pygame.draw.circle(screen, black_color, [160, 160], 3, 0)
       pygame.draw.circle(screen, black_color, [160, 480], 3, 0)
       pygame.draw.circle(screen, black_color, [480, 160], 3, 0)
       pygame.draw.circle(screen, black_color, [480, 480], 3, 0)
       #做2次for循环取得棋盘上所有交叉点的坐标
       for row in range(len(self._board)):
           for col in range(len(self._board[row])):
               # 将下在棋盘上的棋子画出来
               if self._board[row][col] != EMPTY:
                   ccolor = black_color \
                       if self._board[row][col] == BLACK else white_color
                   # 取得这个交叉点下的棋子的颜色,并将棋子画出来
                   pos = [40 * (col + 1), 40 * (row + 1)]
                   # 画出棋子
                   pygame.draw.circle(screen, ccolor, pos, 18, 0)

全部代码

import pygame
# 导入pygame模块
print(pygame.ver)
# 检查pygame的版本,检查pygame有没有导入成功

EMPTY = 0
BLACK = 1
WHITE = 2
# 定义三个常量函数,用来表示白棋,黑棋,以及 空

black_color = [0, 0, 0]
# 定义黑色(黑棋用,画棋盘)
white_color = [255, 255, 255]
# 定义白色(白棋用)

# 定义棋盘这个类
class RenjuBoard(object):

   def __init__(self):
       # self._board = board = [[EMPTY] * 15 for _ in range(15)]
       # 将棋盘每一个交叉点都看作列表的一个元素位,一共有15*15共225个元素
       self._board = [[]] * 15
       self.reset()
   #重置棋盘
   def reset(self):
       for row in range(len(self._board)):
           self._board[row] = [EMPTY] * 15
   #定义棋盘上的下棋函数,row表示行,col表示列,is_black表示判断当前点位该下黑棋,还是白棋
   def move(self, row, col, is_black):
       if self._board[row][col] == EMPTY:
           self._board[row][col] = BLACK if is_black else WHITE
           return True
       return False
   # 给棋盘定义一个函数将自己在screen上面画出来,使用pygame.draw()函数。并且顺便将下了的棋子也画出来
   def draw(self, screen):
       for h in range(1, 16):
           pygame.draw.line(screen, black_color,
                            [40, h * 40], [600, h * 40], 1)
           pygame.draw.line(screen, black_color,
                            [h * 40,40], [h * 40, 600], 1)
       # 给棋盘加一个外框,使美观
       pygame.draw.rect(screen, black_color, [36, 36, 568, 568], 3)

       # 在棋盘上标出,天元以及另外4个特殊点位
       pygame.draw.circle(screen, black_color, [320, 320], 5, 0)
       pygame.draw.circle(screen, black_color, [160, 160], 3, 0)
       pygame.draw.circle(screen, black_color, [160, 480], 3, 0)
       pygame.draw.circle(screen, black_color, [480, 160], 3, 0)
       pygame.draw.circle(screen, black_color, [480, 480], 3, 0)
       #做2次for循环取得棋盘上所有交叉点的坐标
       for row in range(len(self._board)):
           for col in range(len(self._board[row])):
               # 将下在棋盘上的棋子画出来
               if self._board[row][col] != EMPTY:
                   ccolor = black_color \
                       if self._board[row][col] == BLACK else white_color
                   # 取得这个交叉点下的棋子的颜色,并将棋子画出来
                   pos = [40 * (col + 1), 40 * (row + 1)]
                   # 画出棋子
                   pygame.draw.circle(screen, ccolor, pos, 18, 0)

# 定义函数,传入当前棋盘上的棋子列表,输出结果,不管黑棋白棋胜,都是传回False,未出结果则为True
def is_win(board):
   for n in range(15):
       # 判断垂直方向胜利
       flag = 0
       # flag是一个标签,表示是否有连续以上五个相同颜色的棋子
       for b in board._board:
           if b[n] == 1:
               flag += 1
               if flag == 5:
                   print('黑棋胜')
                   return False
           else:
           # else表示此时没有连续相同的棋子,标签flag重置为0
               flag = 0

       flag = 0
       for b in board._board:
           if b[n] == 2:
               flag += 1
               if flag == 5:
                   print('白棋胜')
                   return False
           else:
               flag = 0

       # 判断水平方向胜利
       flag = 0
       for b in board._board[n]:
           if b == 1:
               flag += 1
               if flag == 5:
                   print('黑棋胜')
                   return False
           else:
               flag = 0

       flag = 0
       for b in board._board[n]:
           if b == 2:
               flag += 1
               if flag == 5:
                   print('白棋胜')
                   return False
           else:
               flag = 0

       # 判断正斜方向胜利

       for x in range(4, 25):
           flag = 0
           for i,b in enumerate(board._board):
               if 14 >= x - i >= 0 and b[x - i] == 1:
                   flag += 1
                   if flag == 5:
                       print('黑棋胜')
                       return False
               else:
                   flag = 0

       for x in range(4, 25):
           flag = 0
           for i,b in enumerate(board._board):
               if 14 >= x - i >= 0 and b[x - i] == 2:
                   flag += 1
                   if flag == 5:
                       print('白棋胜')
                       return False
               else:
                   flag = 0

       #判断反斜方向胜利
       for x in range(11, -11, -1):
           flag = 0
           for i,b in enumerate(board._board):
               if 0 <= x + i <= 14 and b[x + i] == 1:
                   flag += 1
                   if flag == 5:
                       print('黑棋胜')
                       return False
               else:
                   flag = 0

       for x in range(11, -11, -1):
           flag = 0
           for i,b in enumerate(board._board):
               if 0 <= x + i <= 14 and b[x + i] == 2:
                   flag += 1
                   if flag == 5:
                       print('白棋胜')
                       return False
               else:
                   flag = 0

   return True


def main():
   # 创建棋盘对象
   board = RenjuBoard()
   # 用于判断是下黑棋还是白棋
   is_black = True
   # pygame初始化函数,固定写法
   pygame.init()
   pygame.display.set_caption('五子棋-IT入门') # 改标题
   # pygame.display.set_mode()表示建立个窗口,左上角为坐标原点,往右为x正向,往下为y轴正向
   screen = pygame.display.set_mode((640,640))
   # 给窗口填充颜色,颜色用三原色数字列表表示
   screen.fill([125,95,24])
   board.draw(screen)  # 给棋盘类发命令,调用draw()函数将棋盘画出来
   pygame.display.flip()  # 刷新窗口显示

   running = True
   # while 主循环的标签,以便跳出循环
   while running:
       # 遍历建立窗口后发生的所有事件,固定写法
       for event in pygame.event.get():
           # 根据事件的类型,进行判断
           if event.type == pygame.QUIT:
               running = False

           elif event.type == pygame.KEYUP:
               pass
           # pygame.MOUSEBUTTONDOWN表示鼠标的键被按下
           elif event.type == pygame.MOUSEBUTTONDOWN and \
                   event.button == 1:# button表示鼠标左键
               x, y = event.pos  # 拿到鼠标当前在窗口上的位置坐标
               # 将鼠标的(x, y)窗口坐标,转化换为棋盘上的坐标
               row = round((y - 40) / 40)    
               col = round((x - 40) / 40)
               if board.move(row, col, is_black):
                   is_black = not is_black
                   screen.fill([125, 95, 24])
                   board.draw(screen)
                   pygame.display.flip()
                   # 调用判断胜负函数
                   if not is_win(board):
                       #break
                       running = False



   pygame.quit()



if __name__ == '__main__':
   main()
提示:输入修改代码都可运行!
4
酒精度
67
顶一下
相关阅读
内容加载中……