python实现五子棋小游戏


Posted in Python onMarch 25, 2020

本文实例为大家分享了python实现五子棋小游戏的具体代码,供大家参考,具体内容如下

暑假学了十几天python,然后用pygame模块写了一个五子棋的小游戏,代码跟有缘人分享一下。

import numpy as np
import pygame
import sys
import traceback
import copy
from pygame.locals import *


pygame.init()
pygame.mixer.init()

#颜色
background=(201,202,187)
checkerboard=(80,80,80)
button=(52,53,44)



#音乐
play_chess_sound = pygame.mixer.Sound("music/play_chess.wav")
play_chess_sound.set_volume(0.2)
button_sound = pygame.mixer.Sound("music/button.wav")
button_sound.set_volume(0.2)
victor_sound = pygame.mixer.Sound("music/victory.wav")
victor_sound.set_volume(0.2)

#绘制棋盘
def Draw_a_chessboard(screen): 
 #填充背景色
 screen.fill(background)
 Background=pygame.image.load("background.jpg").convert_alpha()
 screen.blit(Background,(0,0))
 #画棋盘
 for i in range(21):
 pygame.draw.line(screen, checkerboard, (40*i+3, 3), (40*i+3, 803)) 
 pygame.draw.line(screen, checkerboard, (3, 40*i+3), (803, 40*i+3))
 #画边线
 pygame.draw.line(screen, checkerboard, (3, 3), (803, 3),5) 
 pygame.draw.line(screen, checkerboard, (3, 3), (3, 803),5) 
 pygame.draw.line(screen, checkerboard, (803, 3), (803, 803),5) 
 pygame.draw.line(screen, checkerboard, (3, 803), (803, 803),5) 
 
 #画定位点
 pygame.draw.circle(screen, checkerboard, (163, 163), 6) 
 pygame.draw.circle(screen, checkerboard, (163, 643), 6) 
 pygame.draw.circle(screen, checkerboard, (643, 163), 6) 
 pygame.draw.circle(screen, checkerboard, (643, 643), 6) 
 pygame.draw.circle(screen, checkerboard, (403, 403), 6) 
 
 #画‘悔棋'‘重新开始'跟‘退出'按钮
 pygame.draw.rect(screen,button,[900,350,120,100],5)
 pygame.draw.rect(screen,button,[900,500,200,100],5)
 pygame.draw.rect(screen,button,[900,650,200,100],5)
 s_font=pygame.font.Font('font.ttf',40)
 text1=s_font.render("悔棋",True,button)
 text2=s_font.render("重新开始",True,button)
 text3=s_font.render("退出游戏",True,button)
 screen.blit(text1,(920,370))
 screen.blit(text2,(920,520))
 screen.blit(text3,(920,670))

#绘制棋子(横坐标,纵坐标,屏幕,棋子颜色(1代表黑,2代表白))
def Draw_a_chessman(x,y,screen,color): 
 if color==1: 
 Black_chess=pygame.image.load("Black_chess.png").convert_alpha()
 screen.blit(Black_chess,(40*x+3-15,40*y+3-15))
 if color==2:
 White_chess=pygame.image.load("White_chess.png").convert_alpha()
 screen.blit(White_chess,(40*x+3-15,40*y+3-15))

#绘制带有棋子的棋盘
def Draw_a_chessboard_with_chessman(map,screen): 
 screen.fill(background)
 Draw_a_chessboard(screen)
 for i in range(24):
 for j in range(24):
 Draw_a_chessman(i+1,j+1,screen,map[i][j])



#定义存储棋盘的列表,
#列表为24列24行是因为判断是否胜利函数里的索引会超出19
#列表大一点不会对游戏有什么影响
map=[]
for i in range(24):
 map.append([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])

#清零map列表
def clear():
 global map
 for i in range(24):
 for j in range(24):
 map[i][j]=0

#判断是否胜利
def win(i, j):
 k = map[i][j]
 p=[]
 for a in range(20):
 p.append(0)
 for i3 in range(i-4,i+5):
 for j3 in range(j-4,j+5):
 if (map[i3][j3] == k and i3 - i == j3 - j and i3 <= i and j3 <= j):
 p[0]+=1
 if (map[i3][j3] == k and j3 == j and i3 <= i and j3 <= j):
 p[1]+=1
 if (map[i3][j3] == k and i3 == i and i3 <= i and j3 <= j):
 p[2]+=1
 if (map[i3][j3] == k and i3 - i == j3 - j and i3 >= i and j3 >= j):
 p[3]+=1
 if (map[i3][j3] == k and j3 == j and i3 >= i and j3 >= j):
 p[4]+=1
 if (map[i3][j3] == k and i3 == i and i3 >= i and j3 >= j):
 p[5]+=1
 if (map[i3][j3] == k and i - i3 == j3 - j and i3 <= i and j3 >= j):
 p[6]+=1
 if (map[i3][j3] == k and i3 - i == j - j3 and i3 >= i and j3 <= j):
 p[7]+=1
 if (map[i3][j3] == k and j - j3 == i - i3 and i3 <= i + 1 and i3 >= i - 3 and j3 <= j + 1 and j3 >= j - 3):
 p[8]+=1
 if (map[i3][j3] == k and j == j3 and i3 <= i + 1 and i3 >= i - 3 and j3 <= j + 1 and j3 >= j - 3):
 p[9]+=1
 if (map[i3][j3] == k and i == i3 and i3 <= i + 1 and i3 >= i - 3 and j3 <= j + 1 and j3 >= j - 3):
 p[10]+=1
 if (map[i3][j3] == k and j - j3 == i - i3 and i3 >= i - 1 and i3 <= i + 3 and j3 >= j - 1 and j3 <= j + 3):
 p[11]+=1
 if (map[i3][j3] == k and j == j3 and i3 >= i - 1 and i3 <= i + 3 and j3 >= j - 1 and j3 <= j + 3):
 p[12]+=1
 if (map[i3][j3] == k and i == i3 and i3 >= i - 1 and i3 <= i + 3 and j3 >= j - 1 and j3 <= j + 3):
 p[13]+=1
 if (map[i3][j3] == k and i - i3 == j3 - j and i3 <= i + 1 and i3 >= i - 3 and j3 >= j - 1 and j3 <= j + 3):
 p[14]+=1
 if (map[i3][j3] == k and i3 - i == j - j3 and i3 >= i - 1 and i3 <= i + 3 and j3 <= j + 1 and j3 >= j - 3):
 p[15]+=1
 if (map[i3][j3] == k and j - j3 == i - i3 and i3 <= i + 2 and i3 >= i - 2 and j3 <= j + 2 and j3 >= j - 2):
 p[16]+=1
 if (map[i3][j3] == k and j == j3 and i3 <= i + 2 and i3 >= i - 2 and j3 <= j + 2 and j3 >= j - 2):
 p[17]+=1
 if (map[i3][j3] == k and i == i3 and i3 <= i + 2 and i3 >= i - 2 and j3 <= j + 2 and j3 >= j - 2):
 p[18]+=1
 if (map[i3][j3] == k and i - i3 == j3 - j and i3 <= i + 2 and i3 >= i - 2 and j3 <= j + 2 and j3 >= j - 2):
 p[19]+=1
 for b in range(20):
 if p[b]==5:
 return True
 return False

#绘制提示器(类容,屏幕,字大小)
def text(s,screen,x):
 #先把上一次的类容用一个矩形覆盖
 pygame.draw.rect(screen,background,[850,100,1200,100])
 #定义字体跟大小
 s_font=pygame.font.Font('font.ttf',x)
 #定义类容,是否抗锯齿,颜色
 s_text=s_font.render(s,True,button)
 #将字放在窗口指定位置
 screen.blit(s_text,(880,100))
 pygame.display.flip()

#用于控制顺序
t=True

#用于结束游戏后阻止落子
running=True

#主函数
def main():
 #将 t,map,running设置为可改的
 global t,map,running,maps,r,h
 #将map置零
 clear()
 #定义储存所有棋盘状态的列表(用于悔棋)
 map2=copy.deepcopy(map)
 maps=[map2]

 
 #定义窗口
 screen = pygame.display.set_mode([1200,806])
 
 #定义窗口名字
 pygame.display.set_caption("五子棋")
 
 #在窗口画出棋盘,提示器以及按钮
 Draw_a_chessboard(screen)
 pygame.display.flip()
 clock=pygame.time.Clock()
 while True:
 #只有running为真才能落子,主要用于游戏结束后防止再次落子
 if running:
 if t:
 color=1
 text('黑棋落子',screen,54)
 else:
 color=2
 text('白棋落子',screen,54)
 
 for event in pygame.event.get():
 #点击x则关闭窗口
 if event.type ==pygame.QUIT:
 pygame.quit()
 sys.exit()
 
 #点击窗口里面类容则完成相应指令
 elif event.type == MOUSEBUTTONDOWN:
 if event.button == 1:
 x,y=event.pos[0],event.pos[1]
 for i in range(19):
 for j in range(19):
 #点击棋盘相应位置
 if i*40+3+20<x<i*40+3+60 and j*40+3+20<y<j*40+3+60 and not map[i][j] and running:
 #在棋盘相应位置落相应颜色棋子
 Draw_a_chessman(i+1,j+1,screen,color)
 #播放音效
 play_chess_sound.play(0)
 #在map里面记录落子位置
 map[i][j]=color

 #将map存入maps
 map3=copy.deepcopy(map)
 maps.append(map3)

 #判断落子后是否有五子一线
 if win(i,j):
  if t:
  text('黑棋胜利,请重新游戏',screen,30)
  else:
  text('白棋胜利,请重新游戏',screen,30)
  #播放音效
  victor_sound.play(0)
  #阻止再往棋盘落子
  running=False
 pygame.display.flip()
 t=not t
 #如果点击‘重新开始'
 if 900<x<1100 and 500<y<600:
 #取消阻止
 running=True
 #播放音效
 button_sound.play(0)
 #重新开始
 main()
 
 #点击‘退出游戏',退出游戏
 elif 900<x<1100 and 650<y<750:
 #播放音效
 button_sound.play(0)
 pygame.quit()
 sys.exit()
 
 #点击‘悔棋'
 elif 900<x<1020 and 350<y<450 and len(maps)!=1:
 #播放音效
 button_sound.play(0)
 #删除maps里最后一个元素
 del maps[len(maps)-1] 
 #再将最后一个元素copy给map
 map=copy.deepcopy(maps[len(maps)-1])
 #切换顺序
 t=not t
 #将map显示出来
 Draw_a_chessboard_with_chessman(map,screen)
 #悔棋完成,阻止再次悔棋
 x,y=0,0
 clock.tick(60)
if __name__ == "__main__":
 try:
 main()
 except SystemExit:
 pass
 except:
 traceback.print_exc()
 pygame.quit()
 input()

实现效果图如下:

python实现五子棋小游戏

更多关于python游戏的精彩文章请点击查看以下专题:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现博客文章爬虫示例
Feb 26 Python
Python面向对象编程中的类和对象学习教程
Mar 30 Python
python使用fileinput模块实现逐行读取文件的方法
Apr 29 Python
Python栈类实例分析
Jun 15 Python
Python实现简单的四则运算计算器
Nov 02 Python
Python实现Youku视频批量下载功能
Mar 14 Python
Python获取CPU、内存使用率以及网络使用状态代码
Feb 08 Python
使用python获取(宜宾市地震信息)地震信息
Jun 20 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
Sep 05 Python
Python集合基本概念与相关操作实例分析
Oct 30 Python
Python多线程获取返回值代码实例
Feb 17 Python
python如何保存文本文件
Jun 07 Python
PyQt5实现五子棋游戏(人机对弈)
Mar 24 #Python
Python制作exe文件简单流程
Jan 24 #Python
PyQt5实现类似别踩白块游戏
Jan 24 #Python
实例讲解Python脚本成为Windows中运行的exe文件
Jan 24 #Python
python随机在一张图像上截取任意大小图片的方法
Jan 24 #Python
Python爬虫实战之12306抢票开源
Jan 24 #Python
python+pyqt5实现24点小游戏
Jan 24 #Python
You might like
php 更新数据库中断的解决方法
2009/06/05 PHP
php 无限分类的树类代码
2009/12/03 PHP
PHP清除数组中所有字符串两端空格的方法
2014/10/20 PHP
php生成txt文件实例代码介绍
2016/04/28 PHP
javascript function、指针及内置对象
2009/02/19 Javascript
cookie在javascript中的使用技巧以及隐私在服务器端的设置
2012/12/03 Javascript
js调用图片隐藏&amp;显示实现代码
2013/09/13 Javascript
jquery限定文本框只能输入数字即整数和小数
2013/11/29 Javascript
javascript二维数组转置实例
2015/01/22 Javascript
jQuery实现的网页左侧在线客服效果代码
2015/10/23 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
jquery事件绑定解绑机制源码解析
2016/09/19 Javascript
树结构之JavaScript
2017/01/24 Javascript
Angular2 组件通信的实例代码
2017/06/23 Javascript
NodeJS链接MySql数据库的操作方法
2017/06/27 NodeJs
VueJs单页应用实现微信网页授权及微信分享功能示例
2017/07/26 Javascript
Vue.JS项目中5个经典Vuex插件
2017/11/28 Javascript
详解JS函数stack size计算方法
2018/06/18 Javascript
Element ui 下拉多选时新增一个选择所有的选项
2019/08/21 Javascript
vue项目打包后提交到git上为什么没有dist这个文件的解决方法
2020/09/16 Javascript
微信小程序使用前置摄像头拍照
2020/10/22 Javascript
Python实现抓取网页并且解析的实例
2014/09/20 Python
Python3通过Luhn算法快速验证信用卡卡号的方法
2015/05/14 Python
Python实现注册登录系统
2017/08/08 Python
python3 pillow生成简单验证码图片的示例
2017/09/19 Python
dataframe设置两个条件取值的实例
2018/04/12 Python
python 读取文件并把矩阵转成numpy的两种方法
2019/02/12 Python
python 同时读取多个文件的例子
2019/07/16 Python
python 单线程和异步协程工作方式解析
2019/09/28 Python
python实现人脸签到系统
2020/04/13 Python
使用Keras建立模型并训练等一系列操作方式
2020/07/02 Python
Amara美国站:英国高端家居礼品网站,世界各地的奢侈家具品牌
2017/07/26 全球购物
一套C++笔试题面试题
2012/06/06 面试题
关于Nginx中虚拟主机的一些冷门知识小结
2022/03/03 Servers
Java的Object类的九种方法
2022/04/13 Java/Android
MySQL 条件查询的常用操作
2022/04/28 MySQL