五子棋程序
代码如下

import sys
import pygame
from collections import namedtuple
from collections import deque
import randomPosition = namedtuple('Position', ['x', 'y'])class Renju(object):background_filename = 'chessboard.png'white_chessball_filename = 'white_chessball.png'black_chessball_filename = 'black_chessball.png'top, left, space, lines = (20, 20, 36, 15)  # 棋盘格子位置相关???color = (0, 0, 0)  # 棋盘格子线颜色black_turn = True  # 黑子先手ball_coord = []  # 记录黑子和白子逻辑位置def init(self):try:self._chessboard = pygame.image.load(self.background_filename)self._white_chessball = pygame.image.load(self.white_chessball_filename).convert_alpha()self._black_chessball = pygame.image.load(self.black_chessball_filename).convert_alpha()self.font = pygame.font.SysFont('arial', 16)self.ball_rect = self._white_chessball.get_rect()self.points = [[] for i in range(self.lines)]for i in range(self.lines):for j in range(self.lines):self.points[i].append(Position(self.left + i*self.space, self.top + j*self.space))self._draw_board()except pygame.error as e:print(e)sys.exit()def chessboard(self):return self._chessboard# 在(i,j)位置落子def drop_at(self, i, j):pos_x = self.points[i][j].x - int(self.ball_rect.width/2)pos_y = self.points[i][j].y - int(self.ball_rect.height/2)ball_pos = {'type': 0 if self.black_turn else 1, 'coord': Position(i, j)}if self.black_turn:  # 轮到黑子下self._chessboard.blit(self._black_chessball, (pos_x, pos_y))else:self._chessboard.blit(self._white_chessball, (pos_x, pos_y))self.ball_coord.append(ball_pos)  # 记录已落子信息self.black_turn = not self.black_turn  # 切换黑白子顺序# 画棋盘上的格子线,如果棋盘背景图做的足够精确,可省略此步骤def _draw_board(self):# 画坐标数字for i in range(1, self.lines):coord_text = self.font.render(str(i), True, self.color)self._chessboard.blit(coord_text, (self.points[i][0].x-round(coord_text.get_width()/2), self.points[i][0].y-coord_text.get_height()))self._chessboard.blit(coord_text, (self.points[0][i].x-coord_text.get_width(), self.points[0][i].y-round(coord_text.get_height()/2)))for x in range(self.lines):# 画横线pygame.draw.line(self._chessboard, self.color,self.points[0][x], self.points[self.lines-1][x])# 画竖线pygame.draw.line(self._chessboard, self.color,self.points[x][0], self.points[x][self.lines-1])# 判断是否已产生胜方def check_over(self):if len(self.ball_coord) > 8:  # 只有黑白子已下4枚以上才判断direct = [(1, 0), (0, 1), (1, 1), (1, -1)]  # 横、竖、斜、反斜 四个方向检查for d in direct:if self._check_direct(d):return Truereturn False# 判断最后一个棋子某个方向是否连成5子,direct:(1,0),(0,1),(1,1),(1,-1)def _check_direct(self, direct):dt_x, dt_y = directlast = self.ball_coord[-1]line_ball = []  # 存放在一条线上的棋子for ball in self.ball_coord:if ball['type'] == last['type']:x = ball['coord'].x - last['coord'].xy = ball['coord'].y - last['coord'].yif dt_x == 0:if x == 0:line_ball.append(ball['coord'])continueif dt_y == 0:if y == 0:line_ball.append(ball['coord'])continueif x*dt_y == y*dt_x:line_ball.append(ball['coord'])if len(line_ball) >= 5:  # 只有5子及以上才继续判断sorted_line = sorted(line_ball)for i, item in enumerate(sorted_line):index = i+4if index < len(sorted_line):if dt_x == 0:y1 = item.yy2 = sorted_line[index].yif abs(y1-y2) == 4:  # 此点和第5个点比较y值,如相差为4则连成5子return Trueelse:x1 = item.xx2 = sorted_line[index].xif abs(x1-x2) == 4:  # 此点和第5个点比较x值,如相差为4则连成5子return Trueelse:breakreturn False# 检查(i,j)位置是否已占用def check_at(self, i, j):for item in self.ball_coord:if (i, j) == item['coord']:return Falsereturn True# 通过物理坐标获取逻辑坐标def get_coord(self, pos):x, y = posi, j = (0, 0)oppo_x = x - self.leftif oppo_x > 0:i = round(oppo_x / self.space)  # 四舍五入取整oppo_y = y - self.topif oppo_y > 0:j = round(oppo_y / self.space)return (i, j)def main():pygame.init()size = width, height = 544, 544screen = pygame.display.set_mode(size, 0, 32)pygame.display.set_caption('五子棋')clock = pygame.time.Clock()  # 设置时钟game_over = Falserenju = Renju()renju.init()while True:clock.tick(20)  # 设置帧率for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()if event.type == pygame.MOUSEBUTTONDOWN and (not game_over):if event.button == 1:  # 按下的是鼠标左键i, j = renju.get_coord(event.pos)if renju.check_at(i, j):renju.drop_at(i, j)if renju.check_over():  # 已产生胜方text = ''if renju.black_turn:print('白方获胜')else:print('黑方获胜')game_over = Trueelse:print('此位置已占用,不能在此落子')screen.blit(renju.chessboard(), (0, 0))pygame.display.update()pygame.quit()main()

双人五子棋Python相关推荐

  1. 双人五子棋对战(需要EasyX图像库)

    实训要做项目呐.天天坐在电脑面前累死了.最近题刷的少.大多数都挺水.就不挨个编辑发上来了.发发白天写的项目吧.可能好几天更一下.实训结束恢复正常. 这个游戏需要EasyX的图像库.有兴趣的可以下一个图 ...

  2. C语言实践——双人五子棋(简易版)

    双人五子棋 前言 一.五子棋的元素 二.五子棋规则(简单) 三.主要功能的设计 1.头文件和宏定义 2.初始化棋盘 3.打印棋盘 4.判断输赢 5.辅助函数 6.主函数 四.程序结果展示 前言 五子棋 ...

  3. c++ 双人五子棋(可直接复制)

    今天,我给大家带来一个五子棋的代码,希望大家喜欢. 下面是代码: #include <iostream> #include <conio.h> using namespace ...

  4. Win32 双人五子棋

    Win32 双人五子棋思路 一.实现要求: 绘制一个14乘14的棋盘格,然后黑白两种棋子依次下棋,会判断谁先连成5子. 二.运行环境: Visual C++6.0 基于Windows应用程序的基本框架 ...

  5. C++实现图形界面双人五子棋游戏

    C++实现图形界面双人五子棋游戏 设计思路 定义一个Chess类,用16*16的二维数组的来表示一方棋手在棋局上的落子状态. 通过控制键盘←↑→↓来选择落点,getch()函数可获得用户的键盘输入,用 ...

  6. C语言实践——双人五子棋(进阶版)

    双人五子棋 前言 一.棋盘的美化 二.棋子的美化 三.棋盘的打印 四.控制台修改颜色 五.五子棋源代码 前言  上一篇文章讲了如何用C语言写一个简易的双人五子棋小游戏,但是存在一些缺陷,比如棋盘太&q ...

  7. 基于opencv与MFC实现的双人五子棋

    之所以给他取名双人五子棋,是因为这个程序实现的功能并不具备AI(人机对弈)功能,只能由两个玩家自己操作,棋盘显示部分是基于opencv实现的. 其实只是一个很简单的程序,如果说有些难度的话,就是在棋盘 ...

  8. Unity 简单联网游戏(双人五子棋)开发(二)

    前言:之前我们尝试开发了一个两个比拼分数的不像游戏的超简单的弱数据联网游戏,主要是想让一些没开发过联网游戏的人了解一下最基础的流程:不过有人仍然有人私信我表示看不懂,所以这次我们再开发一个类似的游戏, ...

  9. 用python做双人五子棋_基于python的socket实现单机五子棋到双人对战

    基于python的socket实现单机五子棋到双人对战,供大家参考,具体内容如下 本次实验使用python语言.通过socket进行不同机器见的通信,具体可以分为以下四步:1.创建ServerSock ...

  10. Python Socket联机自动匹配双人五子棋(含登录注册系统与界面,数据库连接,可作结课作业,可用于学习)

    1.前言 首先,关于源码的获取,本人提供了三种方式: 直接从文章里面Ctrl+C,Ctrl+V,然后按照我已给的文件结构搞一下即可: 通过积分下载上传到CSDN的资源: 点开本人的主页,点击" ...

最新文章

  1. Windows7 连接Windows Server服务器时提示:计算机无法连接到远程计算机上的另一个控制台会话。...
  2. Shell输入输出重定向:Shell Here Document,/dev/null文件
  3. 使用SAT跟踪监控从浏览器打开的SAP应用的性能和调用栈
  4. c#做端口转发程序支持正向连接和反向链接
  5. 函数的结束条件和返回值 — return
  6. LBS移动网络基站定位
  7. js和php中几种生成验证码的方式
  8. Centos66 编译 Freeswitch mod_shout mp3录音模块
  9. smtp邮件服务器配置,配置电子邮件通知和指定 SMTP 服务器
  10. SpringBoot+Querydsl 框架,大大简化复杂查询操作
  11. C++里中文转拼音那点事
  12. 抖音iOS基础技术大揭秘!
  13. 学习Android开发只要这些东西,Android篇
  14. html5 3d 签到墙,签到小程序/微信签到/扫码签到/3D签到墙
  15. 微信小程序如何获取高清用户头像
  16. Oracle dual表详解(zzl)
  17. 网吧服务器用户锁怎么办,如何进行网吧安全模式的锁定与解除
  18. IT大牛的数据挖掘算法到架构师等的职业进化
  19. 隐空间与高斯超球面相关概念
  20. 第十四届中国大学生服务外包创新创业大赛 #40道赛题 #保研加分 #教育部榜单赛事

热门文章

  1. 整理百度SEO指南2.0
  2. 【退役文】Always Challenge Miracle ---- 记我的ACM生涯
  3. android组件化管理单例,Pigeon——支持增量编译和组件化开发的路由框架
  4. 一张图理解栈顶指针加加减减的问题
  5. Spring-IoCDI
  6. Jmeter性能测试实践--登录场景设计
  7. 企业全面移动化实践指南
  8. excel筛选中文或者筛选数字
  9. 8.13.2020 excel表格筛选按钮位置设置
  10. WIN7重装系统之缺少所需的CD/DVD驱动器设备驱动程序