运用Python——劳拉下棋_四连环游戏_重力四子棋游戏(代码与游戏判定)

article/2025/7/11 4:40:49

导航

·运用Python——爬虫_网易云音乐热评
·运用Python——游戏_四子棋_劳拉下棋

文章目录

  • 导航
  • 1.游戏规则
  • 2.玩法分析
  • 3.部分详解
    • 第一部分:初始化
    • 第二部分:棋盘显示
    • 第三部分:玩家输入
    • 第四部分:运行
    • 第五部分:胜利判断
  • 4.完整代码
  • 5.游戏截图

新手学习Python,写第一个Python小游戏——四连环(重力四子棋)

1.游戏规则

在这里插入图片描述
棋盘为8*6

玩家输入列号与电脑下四子棋,棋会随着重力下降

胜利方式是一行/一列/左右斜线连四颗棋子

2.玩法分析

拆分成了这几个部分,用自定义函数封装,便于修改:
·初始化
·棋盘显示
·玩家输入
·游戏运行
·判断胜利

引用库:random

3.部分详解

第一部分:初始化

def init():global board			#棋盘,二维列表global rest_num			#每一列剩余棋子数,一维整型列表global a				#先手判定,整型global reminded_line	#未被填满列的记录,一维整型列表global symbol0			#执棋方记录1,字典global symbol1			#执棋方记录2,字典symbol1 = {"O": "玩家","X": "电脑"}symbol0 = {"X": "玩家","O": "电脑"}a = random.randint(0,2)reminded_line = [0,1,2,3,4,5,6,7]board = [["-"] * 8 for i in range(6)]rest_num = [6 for i in range(8)]show(board)

这里初始化定义了一些之后用得到的变量

第二部分:棋盘显示

def show(board):for i in range(6):for j in range(8):print(board[i][j],end=" ")print()

用索引下标的方式遍历棋盘并打印

第三部分:玩家输入

def playerInput(rest_num):while True:inp = int(input()) - 1		#注意:列表起始于list[0]if inp in range(0,8):		#符合8列if rest_num[inp] > 0:	#该列有空余return inpelse:print("输入错误")else:print("输入错误")

输入用While True循环,直到输入正确
要判定输入的列号是否在1-8列内,且该列有空余!

第四部分:运行

先后手问题在主函数内用 if 判断初始化内全局变量a来执行不同顺序

四子棋的前三个回合不会分出胜负,因此拆分成前三个回合和剩余回合
这里可以算多此一举吧,前三次只是少了判断胜负
用 round3_0、round4_0 和 round3_1、round4_1 区分

游戏运行使用for次数循环,胜利提前结束即可

def round3_0():round_cout = 0			#回合计数for i in range(3):round_cout += 1			#回合+1print("\n===回合数"+str(round_cout)+"===")print("\n电脑")			#常规的面板绘制#电脑下棋的列号 #这里用从列表随机是为了不会出现该列已满无法下棋的情况robot_line = random.sample(reminded_line,1)[0]#电脑下棋的行号,记得要-1#因为重力下落,这里行号就是空余数量-1robot_height = rest_num[robot_line] - 1#电脑下棋board[robot_height][robot_line] = "O"#该列剩余-1rest_num[robot_line] -= 1show(board)			#显示棋盘print("\n轮到你了:")player_line = playerInput(rest_num)player_height = rest_num[player_line] - 1board[player_height][player_line] = "X"rest_num[player_line] -= 1show(board)def round3_1():			#同上,只是先后手顺序改变round_cout = 0for i in range(3):round_cout += 1print("\n===回合数"+str(round_cout)+"===")print("\n轮到你了:")player_line = playerInput(rest_num)player_height = rest_num[player_line] - 1board[player_height][player_line] = "O"rest_num[player_line] -= 1show(board)print("\n电脑")robot_line = random.sample(reminded_line,1)[0]robot_height = rest_num[robot_line] - 1board[robot_height][robot_line] = "X"rest_num[robot_line] -= 1show(board)def round4_0():round_cout = 3				#回合计数for i in range(3,24):		#共48个棋子,24个回合round_cout += 1print("\n===回合数"+str(round_cout)+"===")print("\n电脑")robot_line = random.sample(reminded_line,1)[0]robot_height = rest_num[robot_line] - 1board[robot_height][robot_line] = "O"rest_num[robot_line] -= 1#如果该列已满,则在剩余列编号列表中移除,排除随机到该列if rest_num[robot_line] == 0:reminded_line.remove(robot_line)show(board)#!胜负判定!IsWinning(board,"O",symbol0)print("\n轮到你了:")player_line = playerInput(rest_num)player_height = rest_num[player_line] - 1board[player_height][player_line] = "X"rest_num[player_line] -= 1if rest_num[robot_line] == 0:reminded_line.remove(robot_line)show(board)IsWinning(board, "X", symbol0)print("平局!")		#最后分不出胜负就是平局def round4_1():round_cout = 3for i in range(3, 24):round_cout += 1print("\n===回合数"+str(round_cout)+"===")print("\n轮到你了:")player_line = playerInput(rest_num)player_height = rest_num[player_line] - 1board[player_height][player_line] = "O"rest_num[player_line] -= 1if rest_num[player_line] == 0:reminded_line.remove(player_line)show(board)IsWinning(board, "O", symbol1)print("\n电脑")robot_line = random.sample(reminded_line,1)[0]robot_height = rest_num[robot_line] - 1board[robot_height][robot_line] = "X"rest_num[robot_line] -= 1if rest_num[robot_line] == 0:reminded_line.remove(robot_line)show(board)IsWinning(board, "X", symbol1)print("平局!")

第五部分:胜利判断

详细解释判定条件

胜利有四种情况:横4、竖4、左斜4、右斜4
因此继续封装成两种形式:直线、斜线进行判定

因为左斜和右斜是关于棋盘左右对称的
这里board_s就是对称棋盘
用 [::-1] 进行倒序

传入三个参数:棋盘、棋子类型(X/O)、执棋方记录

def IsWinning(board,chess_type,symbol):rowIsWinning(board,chess_type,symbol)leftSlashIsWinning(board,chess_type,symbol)board_s = []for i in board:board_s.append(i[::-1])		#左右对称leftSlashIsWinning(board_s, chess_type, symbol)

========
直线判定:

def rowIsWinning(board,chess_type,symbol):#竖4for line_no in range(8):for height_no in range(3):if board[height_no][line_no] == \board[height_no + 1][line_no] == \board[height_no + 2][line_no] == \board[height_no + 3][line_no] == \chess_type:print("\n游戏结束!获胜的是:" + symbol[chess_type])exit(0)#横4for height_no in range(6):for line_no in range(5):if board[height_no][line_no] == \board[height_no][line_no + 1] == \board[height_no][line_no + 2] == \board[height_no][line_no + 3] == \chess_type:print("\n游戏结束!获胜的是:" + symbol[chess_type])exit(0)

首先下标索引遍历每一列
然后在每一列判定是否包含4个相同棋子
每一列得到前三行的棋子,之后再通过列下标不变,行下标递增获得四个棋子的坐标

横4的判断同理
在这里插入图片描述

========
难点
斜线判定:

斜线分左斜和右斜,左右是对称的,因此只用一种方法而将另一种判定换成将棋盘对称的操作

棋盘也是关于对角线可以对称的,也可以左右 + 对角线对称,从而转换成一种判定方式(棋盘左对角线左方左斜的情况),对棋盘操作统统化成一种

以下以左斜线判定为例子:
在这里插入图片描述
蓝色部分无法构成斜线,无需考虑

斜线有一个重要性质:坐标行号列号均相差正整数

因此只需要表示出下方绿色区域的棋子坐标就可以表示所有斜线:
(还有一种特殊情况)

在这里插入图片描述
只要循环表示出绿色区域内的坐标 通过行列递增即可表示斜线:
在这里插入图片描述

对于左上区域的坐标可以发现:
行号是1-3,而列号是1 ~ 行号
对于右下区域:
行号是4-6,列号是(行号+2) ~ 8

因此可以使用嵌套for循环表示

def leftSlashIsWinning(board,chess_type,symbol):#表示左上绿色部分for init_height in range(3):for init_line in range(init_height + 1):if board[init_height][init_line] == \board[init_height + 1][init_line + 1] == \board[init_height + 2][init_line + 2] == \board[init_height + 3][init_line + 3] == \chess_type:print("\n游戏结束!获胜的是:" + symbol[chess_type])exit(0)#表示右下绿色部分for init_height in range(3,6):for init_line in range(init_height+2,8):if board[init_height][init_line] == \board[init_height - 1][init_line - 1] == \board[init_height - 2][init_line - 2] == \board[init_height - 3][init_line - 3] == \chess_type:print("\n游戏结束!获胜的是:" + symbol[chess_type])exit(0)#中间特殊情况for init_height in range(3):init_line = init_height +1if board[init_height][init_line] == \board[init_height + 1][init_line + 1] == \board[init_height + 2][init_line + 2] == \board[init_height + 3][init_line + 3] == \chess_type:print("\n游戏结束!获胜的是:" + symbol[chess_type])exit(0)

4.完整代码

import randomdef init():global boardglobal rest_numglobal aglobal reminded_lineglobal symbol0global symbol1symbol1 = {"O": "玩家","X": "电脑"}symbol0 = {"X": "玩家","O": "电脑"}a = random.randint(0,2)reminded_line = [0,1,2,3,4,5,6,7]board = [["-"] * 8 for i in range(6)]rest_num = [6 for i in range(8)]show(board)def show(board):for i in range(6):for j in range(8):print(board[i][j],end=" ")print()def IsWinning(board,chess_type,symbol):rowIsWinning(board,chess_type,symbol)leftSlashIsWinning(board,chess_type,symbol)board_s = []for i in board:board_s.append(i[::-1])leftSlashIsWinning(board_s, chess_type, symbol)def rowIsWinning(board,chess_type,symbol):for line_no in range(8):for height_no in range(3):if board[height_no][line_no] == \board[height_no + 1][line_no] == \board[height_no + 2][line_no] == \board[height_no + 3][line_no] == \chess_type:print("\n游戏结束!获胜的是:" + symbol[chess_type])exit(0)for height_no in range(6):for line_no in range(5):if board[height_no][line_no] == \board[height_no][line_no + 1] == \board[height_no][line_no + 2] == \board[height_no][line_no + 3] == \chess_type:print("\n游戏结束!获胜的是:" + symbol[chess_type])exit(0)def leftSlashIsWinning(board,chess_type,symbol):for init_height in range(3):for init_line in range(init_height + 1):if board[init_height][init_line] == \board[init_height + 1][init_line + 1] == \board[init_height + 2][init_line + 2] == \board[init_height + 3][init_line + 3] == \chess_type:print("\n游戏结束!获胜的是:" + symbol[chess_type])exit(0)for init_height in range(3,6):for init_line in range(init_height+2,8):if board[init_height][init_line] == \board[init_height - 1][init_line - 1] == \board[init_height - 2][init_line - 2] == \board[init_height - 3][init_line - 3] == \chess_type:print("\n游戏结束!获胜的是:" + symbol[chess_type])exit(0)for init_height in range(3):init_line = init_height +1if board[init_height][init_line] == \board[init_height + 1][init_line + 1] == \board[init_height + 2][init_line + 2] == \board[init_height + 3][init_line + 3] == \chess_type:print("\n游戏结束!获胜的是:" + symbol[chess_type])exit(0)def playerInput(rest_num):while True:inp = int(input()) - 1if inp in range(0,8):if rest_num[inp] > 0:return inpelse:print("输入错误")else:print("输入错误")def round3_0():round_cout = 0for i in range(3):round_cout += 1print("\n===回合数"+str(round_cout)+"===")print("\n电脑")robot_line = random.sample(reminded_line,1)[0]robot_height = rest_num[robot_line] - 1board[robot_height][robot_line] = "O"rest_num[robot_line] -= 1show(board)print("\n轮到你了:")player_line = playerInput(rest_num)player_height = rest_num[player_line] - 1board[player_height][player_line] = "X"rest_num[player_line] -= 1show(board)def round3_1():round_cout = 0for i in range(3):round_cout += 1print("\n===回合数"+str(round_cout)+"===")print("\n轮到你了:")player_line = playerInput(rest_num)player_height = rest_num[player_line] - 1board[player_height][player_line] = "O"rest_num[player_line] -= 1show(board)print("\n电脑")robot_line = random.sample(reminded_line,1)[0]robot_height = rest_num[robot_line] - 1board[robot_height][robot_line] = "X"rest_num[robot_line] -= 1show(board)def round4_0():round_cout = 3for i in range(3,24):round_cout += 1print("\n===回合数"+str(round_cout)+"===")print("\n电脑")robot_line = random.sample(reminded_line,1)[0]robot_height = rest_num[robot_line] - 1board[robot_height][robot_line] = "O"rest_num[robot_line] -= 1if rest_num[robot_line] == 0:reminded_line.remove(robot_line)show(board)IsWinning(board,"O",symbol0)print("\n轮到你了:")player_line = playerInput(rest_num)player_height = rest_num[player_line] - 1board[player_height][player_line] = "X"rest_num[player_line] -= 1if rest_num[robot_line] == 0:reminded_line.remove(robot_line)show(board)IsWinning(board, "X", symbol0)print("平局!")def round4_1():round_cout = 3for i in range(3, 24):round_cout += 1print("\n===回合数"+str(round_cout)+"===")print("\n轮到你了:")player_line = playerInput(rest_num)player_height = rest_num[player_line] - 1board[player_height][player_line] = "O"rest_num[player_line] -= 1if rest_num[player_line] == 0:reminded_line.remove(player_line)show(board)IsWinning(board, "O", symbol1)print("\n电脑")robot_line = random.sample(reminded_line,1)[0]robot_height = rest_num[robot_line] - 1board[robot_height][robot_line] = "X"rest_num[robot_line] -= 1if rest_num[robot_line] == 0:reminded_line.remove(robot_line)show(board)IsWinning(board, "X", symbol1)print("平局!")#程序入口
if __name__ == "__main__":init()if a == 1:round3_1()round4_1()else:round3_0()round4_0()

5.游戏截图

在这里插入图片描述

如果有更好的方法欢迎在评论区交流
感谢浏览


http://chatgpt.dhexx.cn/article/IeDttd9N.shtml

相关文章

ISME | 热液微生物群落揭示了喷口区的生物地理学和嗜热性的进化历史

Auka热液喷口区的微生物群落揭示了喷口区的生物地理学和嗜热性的进化历史 Microbial community of recently discovered Auka vent field sheds light on vent biogeography and evolutionary history of thermophily Article The ISME Journal, [IF 10.3] DOI:10.…

S32K1xx 固件更新

1 介绍 随着当前技术的进步,车辆变得更加电子化而不是机械化。车辆中的电子创新不断增加。因此,车辆中的软件也在增加,因此存在潜在错误的风险。 每次发现软件错误时,都需要进行召回过程来更新软件。这些召回代表了汽车制造商的…

萤火虫算法综述

1.萤火虫算法概述 萤火虫闪烁的光芒在热带和温带地区的夏季天空中是一道令人惊叹的风景。大约有两千种萤火虫,大多数萤火虫会发出短暂而有节奏的闪光。闪光的模式对于特定物种来说往往是独一无二的。闪光是由生物发光过程产生的,这种信号系统的真正功能仍…

《闪》(霹雳战狗 bolt)电影感悟

when you stuck your head, relax, turn and pull. 有时候做人做事要转换一下方式,否则还是会卡住头。Because all around the planet, there are animals who feel like they cannot, like a little hamster, who once spends his day in the vehicle park dreamin…

大学英语四新视野 课后习题+答案翻译 Unit1~Unit8

Unit 1 Text A: Words in use 2022年6月16日 20:57 1 As the gender barriers crumbled, the number of women working as lawyers, doctors, or bankers began to increase significantly from the mid-20th century. 随着性别障碍的消除,从20世纪中期开始&am…

拉勾网爬虫

源代码:https://github.com/carlblocking/xxw-for-public/tree/master/LaGouSpider 前几天写了一个知乎网的爬虫并爬取了一些数据,然而新鲜感消失的很快。于是,大概2天前开始试着爬取拉勾网上的数据。 在解析数据的过程中,知乎爬…

爬虫实战(三) 用Python爬取拉勾网

0、前言 最近博主面临着选方向的困难(唉,选择困难症患者 >﹏<),所以希望了解一下目前不同岗位的就业前景 这时,就不妨写个小爬虫,爬取一下 拉勾网 的职位数据,并用图形…

python爬取拉勾网公司信息(您操作太频繁,请稍后访问)

最近爬取拉勾网上的公司信息碰到了很多问题,但是都一一解决了。作为一个招聘网站,他的反爬措施做的还是很好的。 为了调查招聘网站上有多少公司,以及公司信息,并把公司信息存入MongoDB数据库中。 先上运行成功代码: …

2022年爬取拉勾网详情页面地址信息

众所周知,拉勾网的反爬机制一直做的很好,前些年还可以通过找到网页源代码找到岗位详情页面的地址,而现在拉勾网的详情页面地址直接没了,这就很奇怪,那么鼠标点击他又是如何跳转到别的页面 点开源代码中,每一…

django+拉勾网招聘数据可视化

django拉勾网招聘数据可视化,此系统有详细的录屏,下面只是部门截图,需要看完整录屏联系博主 系统开发语言python,框架为django,数据库mysql,分为爬虫和可视化分析

Python爬虫实战:爬取拉勾网并对其进行数据分析

###整体的 思路 是采用 selenium 模拟浏览器的行为,具体的步骤如下: 初始化爬取数据,这里分为两个部分:一是爬取网页数据,二是进行翻页操作保存数据,将数据保存到文件中数据可视化 ###整体的 代码结构 如…

什么你还不知道招聘信息,小唐来教你——最新2021爬取拉勾网招聘信息(二)

文章目录 前言一、准备我们的库二、数据清洗三、核密度图及词云制作四、完整代码五、扩展 上一篇:什么你还不知道招聘信息,小唐来教你——最新2021爬取拉勾网招聘信息(一) 下一篇:没有拉! 前言 既然我们上…

No.4 拉勾网职位搜索信息爬取

一、简介 网址:https://www.lagou.com/jobs/list_/p-city_0?&clfalse&fromSearchtrue&labelWords&suginput 效果:信息 使用框架:requests 难度系数:✩✩✩ 二、教程 今天我们要为我们的工作写爬虫&#xf…

什么你还不知道招聘信息,小唐来教你——最新2021爬取拉勾网招聘信息(一)

文章目录 前言一、准备我们的库二、分析分析三、 代码四、数据展示小唐的心路历程 上一篇:没有啦! 下一篇:什么你还不知道招聘信息,小唐来教你——最新2021爬取拉勾网招聘信息(二) 前言 有是小唐的数据分析…

拉勾网的反爬介绍和解决方法(更新时间:2019/2/20)

拉勾网的反爬介绍和解决方法(更新时间:2019/2/20) 目录直达: 文章目录 拉勾网的反爬介绍和解决方法(更新时间:2019/2/20)1. 前言2. 简述3. 反爬介绍3.1、对于职位的详情页和公司的详情页的反爬…

应对反爬如何爬取拉勾网信息(非常详细)

目录 前期准备请求头Cookies问题手动提取Cookies和自动Cookies相结合自动提取Cookies实现 手动提取Cookies实现 页面分析代码实现 前期准备 我们知道百度其实就是一个爬虫,但是对方的服务器是没有对百度进行反爬的,所以为了防止对方服务器的反爬&#x…

【Python】模拟登陆并抓取拉勾网信息(selenium+phantomjs)

环境 python3.5pip install seleniumphantomjs-2.1.1pip install pyquery 代码 # -*- coding:utf-8 -*-# 防止print中文出错 import time import sys import io sys.stdout io.TextIOWrapper(sys.stdout.buffer, encodinggb18030)from pyquery import PyQuery as pq from se…

Python爬虫实战,requests模块,Python实现拉勾网求职信息数据分析与可视化

前言 利用requests爬取拉勾网求职信息数据分析与可视化,废话不多说。 让我们愉快地开始吧~ 开发工具 **Python版本:**3.6.4 相关模块: requests模块; re模块; os模块 jieba模块; pandas模块 num…

爬虫学习之17:爬取拉勾网网招聘信息(异步加载+Cookie模拟登陆)

很多网站需要通过提交表单来进行登陆或相应的操作,可以用requests库的POST方法,通过观测表单源代码和逆向工程来填写表单获取网页信息。本代码以获取拉勾网Python相关招聘职位为例作为练习。打开拉钩网,F12进入浏览器开发者工具,可…

python成功爬取拉勾网——初识反爬(一个小白真实的爬取路程,内容有点小多)

python成功爬取拉勾网(一个小白的心里路程) 最开始想爬取拉钩是因为半年前上python实验课的时候,老师给了两个任务,一个时爬取糗百的笑话内容,另一个时爬取拉勾网的职位信息,当时因为课时紧张的缘故&#…