返回顶部
首页 > 资讯 > 后端开发 > Python >利用Python还原方阵游戏详解
  • 329
分享到

利用Python还原方阵游戏详解

Python还原方阵游戏Python方阵游戏Python游戏 2023-01-04 12:01:57 329人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、前言二、游戏规则三、numpy模块四、第一步:大循环and获取规格五、第二步:初始化棋盘六、第三步:标注矩阵功能(难)七、第四步:查看标注矩阵功能八、第五步:胜利侦测九、第六

一、前言

写这篇文章的灵感来源于我玩游戏的时候(为了避免过不了审就不说是啥游戏了),看见一个大佬在游戏里面建造了“还原方阵游戏”,就感觉很牛掰,就想着python不是有矩阵吗,可不可以还原一下呢?

说干就干,我写的那个蜘蛛纸牌用了一星期,写这玩意儿只用了2小时,估计是有了经验吧。

这篇文章会手把手教你完成这个小游戏,算是新手的numpy练手程序了。写作不易,支持一波~

二、游戏规则

其实这个游戏我也不知道叫啥,就是自己瞎编的名字(bushi。

游戏规则:有一个方阵,里面有的点位有棋子,有的点位没有棋子,我会给出每行每列的棋子个数,请复原这个方阵。注:如果棋子之间有空位就用空格代替。例如这个方阵: 

棋 空 空

棋 空 棋

空 空 棋

第一列里面有两个连续的棋子,那我就给出2。第二列里没有棋子,那我就啥也不给。第三列里有两个连续棋子,那我就给出2。

第一行里有一个棋子,那我就给出1。第二行里有一个棋子,空一格又有一个棋子,那我就给出1 1。第三行里有一个棋子,那我就给出1。

通过给出的信息,请还原方阵。

这个游戏是对逻辑思维的推理。为了方便用户操作,我们给出另一个矩阵,让用户在上面标注,当标注矩阵=正确矩阵就结束游戏。

三、numpy模块

写代码之前,我们先了解一下numpy模块。

numpy模块,就是矩阵模块,其中有很多很多的函数,让我们完成矩阵的相关操作。

安装numpy模块,首先你要有Python,之后要有万能的pip包(没有自己网上查怎么下载)。之后,我们win+R,输入cmd打开熟悉的命令行,输入:

pip install numpy

等一会儿,如果没出现错误就是安装成功了。之后输入:

pip list

来查看pip包所有安装的模块,有numpy就是成功了。

numpy,其实和嵌套列表差不多,但是人家操作十分方便,有许多函数都是嵌套列表做不到的。

numpy可以在很多方面发光发热,因为它不像其他模块那样,专门做游戏,专门做网站,专门爬虫等等啥的,无论是什么方面,都常常遇到矩阵,可以说是个金牌辅助了。我之前那做的那个蜘蛛纸牌游戏也是用的他。

numpy的赋值有很多方法,如果你要给其中一个位置赋值,那就要用二级索引,在numpy里面第一个数字代表第几行,第二个代表第几列。注意要用下标数字哦!例如我们要把一个叫做a的矩阵的第一行第二列变成0,那我们就a[0][1]=0。

接下来,我们就开始写程序吧!

四、第一步:大循环and获取规格

首先,我们设置一个规则:还原矩阵5次时候就胜利了。用while把主体程序套进大框架里面。

为了能调整不同的大小,我们可以获取用户的输入来调整规格。

首先,我们要来帮用户正骨,就用while True和try-except。

为啥要用他俩兄弟呢?首先,try-except的作用是在用户输入不正确或不符合规定时作出处理,while True则是为了作出处理之后让用户重新来输入一遍。

我们现在就规定:规格有4种,让用户3x3输入3,4x4输入4,5x5输入5,6x6输入6。用户的数字就必须在3到6之间。

但是如果用户输入的是其他数字呢?

没事,我们可以用一个条件判断,如果数字不是3~6之间就直接掏出raise,抛出异常,程序转移到except那边。是不是很完美?

别看这样写字多了,这是排除所有其他输入还能正确运行的最佳方案。

那么该怎么退出循环呢?

nonono,不要想太复杂了,只要程序执行完了还没有报错就说明输入正确,直接加break就行了。

win=0#初始化变量
 
while win<=5:#主体程序大循环
    while True:#while True出山
        try:#try出山
            guige=int(input("输入规格,3x3输入3,4x4输入4,5x5输入5,6x6输入6"))#获取用户输入
            if guige<3 or guige>6:#输入必须在3到6的数字之间
                raise(VauleError())#否则直接报错
            break#如果程序到了最后还没有报错就退出循环,正常执行
        except:#如果报错
            print("请正确输入")#让用户重新输入

嗯,就是这样。第一步,我们就做好了。

五、第二步:初始化棋盘

上文说了,我们要用两个矩阵,第一个矩阵是正确的矩阵,我们取名yes_numpy。第二个矩阵是尝试的矩阵,我们取名try_numpy。这里,我们就用1代表棋子,0代表没有棋子。

但是try_numpy矩阵没有标记的位置该怎么弄呢?

这就要用上我们的None了。

None是一个奇怪的值,转化布尔类型为False,他不是0也不是空值,就是啥也没有。例如你硬要获取一个没有返回值的函数的返回值,那就是None。

矩阵的值虽然不能为字符串,但是可以为None啊!

我们要把矩阵的所有值变为None。用两个嵌套for循环赋值就行了。

yes_numpy矩阵,则是要0和1随机。还是用两个嵌套for循环,赋值0或1的随机数。

为了方便,我们把numpy取名为np,random取名为r。

正确程序如下:

import random as r#导入random模块
import numpy as np#导入numpy模块
print("正在生成题目…")#提示
yes_numpy=np.zeros((guige,guige))#yes_numpy为全0矩阵
try_numpy=np.zeros((guige,guige))#try_numpy为全0矩阵
for i in range(guige):#第一层循环为行
    for j in range(guige):#第二层循环为列
        try_numpy[i][j]=None#try_numpy全部赋值为None
print(try_numpy)#输出try_numpy
    
for i in range(guige):#第一层循环为行
    for j in range(guige):#第二层循环为列
        yes_numpy[i][j]=r.choice((1,0))#yes_numpy赋值为1 0随机数

六、第三步:标注矩阵功能(难)

接下来是主要的程序部分了。

首先,我们要获取用户进行的操作。目前更新5个操作:标注矩阵填1,查看标注矩阵填2,胜利侦测填3,查看行列信息填4,重新开始填5。

由于这些操作要重复执行,我们就要用一个while True扩起来。

获取用户操作,还是while True和try-except组合,还有raise和break的使用,和第一步思路一样。但是我们外层已经有一个循环了,所以可以省下来一个while,break可以换成continue。

我们先来完成标注矩阵功能,就是标注try_numpy。如果获取到的回答是1时就执行以下程序。

之后我们还要让用户输入自己要改变的位置的行、列和改变成0还是1还是None,还要再加一层while True和try-except!

知道为啥让你们有注释和减少层级了吧?写这样的程序的时候经常循环套循环,太乱了!写到这里已经是第五层程序了。

我这么做也是有原因的,因为上一个写的蜘蛛纸牌程序比较大型,用起来很卡,时间也长,容易输入错误,并且不知道为啥输入的时候总是自动弹出来一个cde fg,不知道你们有没有这种问题,导致报错。这个程序就长教训了。

输入超出矩阵范围或者修改的不是0或1,这两个异常都要考虑到,把异常扼杀在摇篮之中,给用户的反骨彻底正了。

修改矩阵,很简单,弄上对应的修改位置再修改就行。

以上思路可能理解不了,那就结合着代码理解吧:

while True:#游戏开始
    try:#还是熟悉的try
        caozuo=int(input("输入操作,标注矩阵填1,查看目前改变矩阵填2,胜利侦测填3,查看行列信息填4,重新开始填5。"))#询问操作
        if caozuo<1 or caozuo>4:#必须1到4之内
            raise(ValueError())#报错
    except:#如果错误
        print("请正确输入")#提示
        continue#从头开始
        
    if caozuo==1:#如果操作是1
        while True:
            try:#老两样
                gai_hang,gai_lie,gai_neirong=map(int,input("输入标注位置的行、列(下标),以及改变成0还是1(用空格隔开三个值)\n").split())#询问三个标注信息
                if gai_neirong<0 or gai_neirong>1:#内容非0即1
                    print("只能改变成0和1,",end="")#提示
                    raise(ValueError())#报错
                if gai_hang>=guige or gai_lie>=guige:#行列不能超出矩阵规格
                    print("输入超出规格,",end="")#提示
                    raise(ValueError())#报错
                break#如果没有异常就退出循环
            except:#如果异常
                print("请正确输入")#提示
                
        try_numpy[gai_hang][gai_lie]=gai_neirong#赋值
        print("标注成功")#提示
        continue#从头开始,节约时间

这部分比较难,建议好好理解理解,消化消化。

七、第四步:查看标注矩阵功能

接下来是查看标注矩阵的功能。

我们把问题转换一下,不就是输出try_numpy嘛?

if caozuo==2:#如果要查看标注矩阵
    print(try_numpy)#直接输出
    continue#从头开始,节约时间

是不是简简单单?

八、第五步:胜利侦测

为了节省运行时间,我们换成当输入3之后才进行胜利侦测。

我们不能直接比较两个矩阵是否相等,这时候就要用上numpy里面的函数——all()了。放上两个矩阵,两个等号连接就可以比较两个矩阵是否相等。返回True或者False。

if caozuo==3:#如果要检测是否胜利
    if np.all(yes_numpy==try_numpy):#如果两个矩阵全部相等
        print("你胜利了!")#提示
        zhuangtai="win"#改变变量
        break#退出循环
    else:#否则
        print("还不对哦!")#提示
        continue#从头开始

这些程序都是在那个while True的循环里,所以我们可以用break退出,再回到while win<5那个循环里。这里建议结合下面的完整代码理解。

这里新建变量zhuangtai是因为后面还有重新开始功能,我们要知道是因为获胜还是重新开始退出的大循环。

九、第六步:查看行列信息(难)

接下来,完成查看行列信息的程序。

由于矩阵全随机,我们也只能自己去侦测行列信息。

我们设置一个计数变量:shu。

思路如下:如果侦测到1,则shu自增。

如果侦测到0且前一项为1,则输出shu+空格,之后shu清零。

如果侦测到0且前一项为0,则不输出,可以不侦测。

如果结束之后shu不是0,输出shu且换行。

一行一行,一类一列挨个侦测输出。 

具体程序如下,好好消化消化:

shu=0
 
if caozuo==4:#如果要查看行列信息
    for i in range(guige):#每一行
        print("第",i,"行:")#提示到底是第几行
        for j in range(guige):#每一列
            if yes_numpy[i][j]==1:#如果矩阵的这一格为1
                shu+=1#shu自增
            if yes_numpy[i][j]==0:#如果矩阵的这一格为0
                if shu!=0:#且前一格不是0(直接侦测shu的状态效果一样)
                    print(shu,end="")#输出shu
                shu=0#shu清零
        if shu!=0:#如果结束之后shu不为0
            print(shu)#输出shu要换行
        shu=0#shu清零
        print()#输出空行之后显示列
    shu=0#初始化变量
    #以下程序是把遍历行列进行交换,来达到不用改变主体侦测矩阵列的效果
    for j in range(guige):
        print("第",j,"列:")
        for i in range(guige):
            if yes_numpy[i][j]==1:
                shu+=1
            if yes_numpy[i][j]==0:
                if shu!=0:
                    print(shu,end="")
                shu=0
        if shu!=0:
            print(shu)
        shu=0
        print()

十、第七步:重新开始功能

矩阵重新开始,直接break就行,但要改一下zhuangtai。

#内层循环的程序
if caozuo==5:#如果操作是5
        zhuangtai="0"#状态区分
        break#直接退出循环
#这里是最外层循环的程序
if zhuangtai=="win":#如果是因为获胜退出的循环
    win+=1#win自增

十一、得分与完善and完整代码

我们还可以加上得分功能,再完善一下程序,用变量defen记录得分,增加一下玩家的优越感。

连接以上程序,完善各种bug,最终程序如下:

import numpy as np
import random as r
 
win=0
defen=500
shu=0
 
print("游戏开始。游戏规则:我会给出一个矩阵,并且给出每行每列有几个1的个数信息,如果有两个数字代表有两个空,举个例子:\n[[ 1,1,1]\n[0,0,1]\n[1,0,0]]\n在这个列表中,例如第0列为1,0,1,有两个间断的1那我就给出1 1,第1列有1 0 0,那我就给出1,第2列为1,1,0,有两个不间断的1那我就给出2。\p,请复原这个矩阵。\n另外还有分数系统,标注错一次-10分,标注对一次+10分,初始500分,获胜了+规格x50分。\n胜5局即可胜利。\n")
    
while win<=5:
    while True:
        try:
            guige=int(input("输入规格,3x3输入3,4x4输入4,5x5输入5,6x6输入6"))
            if guige<3 or guige>6:
                raise(VauleError())
            break
        except:
            print("请正确输入")
    
    print("正在生成题目…")
    yes_numpy=np.zeros((guige,guige))
    try_numpy=np.zeros((guige,guige))
    for i in range(guige):
        for j in range(guige):
            try_numpy[i][j]=None
    print(try_numpy)
    
    for i in range(guige):
        for j in range(guige):
            yes_numpy[i][j]=r.choice((1,0))
    print(yes_numpy)
    while True:#游戏开始
    
        try:
            caozuo=int(input("输入操作,标注矩阵填1,查看目前改变矩阵填2,胜利侦测填3,查看行列信息填4,重新开始填5。"))
            if caozuo<1 or caozuo>4:
                raise(ValueError())
        except:
            print("请正确输入")
            continue
        
        if caozuo==1:
            
            while True:
                try:
                    gai_hang,gai_lie,gai_neirong=map(int,input("输入标注位置的行、列(下标),以及改变成0还是1(用空格隔开三个值)\n").split())
                    if gai_neirong<0 or gai_neirong>1:
                        print("只能改变成0和1,",end="")
                        raise(ValueError())
                    if gai_hang>=guige or gai_lie>=guige:
                        print("输入超出规格,",end="")
                        raise(ValueError())
                    break
                except:
                    print("请正确输入")
                
            try_numpy[gai_hang][gai_lie]=gai_neirong
            if try_numpy[gai_hang][gai_lie]==yes_numpy[gai_hang][gai_lie]:
                defen+=10
            else:
                defen-=10
            print("标注成功")
            continue
        
        if caozuo==2:
            print(try_numpy)
            continue
        if caozuo==3:
            if np.all(yes_numpy==try_numpy):
                print("你胜利了!")
                zhuangtai="win"
                defen+=200
                break
            else:
                print("还不对哦!")
                continue
        if caozuo==4:
            for i in range(guige):
                print("第",i,"行:")
                for j in range(guige):
                    if yes_numpy[i][j]==1:
                        shu+=1
                    if yes_numpy[i][j]==0:
                        if shu!=0:
                            print(shu,end="")
                        shu=0
                if shu!=0:
                    print(shu)
                shu=0
                print()
            shu=0
            for j in range(guige):
                print("第",j,"列:")
                for i in range(guige):
                    if yes_numpy[i][j]==1:
                        shu+=1
                    if yes_numpy[i][j]==0:
                        if shu!=0:
                            print(shu,end="")
                        shu=0
                if shu!=0:
                    print(shu)
                shu=0
                print()
        if caozuo==5:
            zhuangtai= "0 "
            break
    if zhuangtai=="win":
        win+=1
print("获胜达到5局!你真厉害!目前的分:",defen)

注:代码的第26和31行为了方便测试直接输出了两个矩阵,玩的之后删了这两行代码就行。

到此这篇关于利用Python还原方阵游戏详解的文章就介绍到这了,更多相关Python还原方阵游戏内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 利用Python还原方阵游戏详解

本文链接: https://lsjlt.com/news/176643.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 利用Python还原方阵游戏详解
    目录一、前言二、游戏规则三、numpy模块四、第一步:大循环and获取规格五、第二步:初始化棋盘六、第三步:标注矩阵功能(难)七、第四步:查看标注矩阵功能八、第五步:胜利侦测九、第六...
    99+
    2023-01-04
    Python还原方阵游戏 Python方阵游戏 Python游戏
  • 详解如何利用Python绘制迷宫小游戏
    目录构思绘制迷宫走出迷宫完整代码更大的挑战关于坐标系设置周末在家,儿子闹着要玩游戏,让玩吧,不利于健康,不让玩吧,扛不住他折腾,于是想,不如一起搞个小游戏玩玩! 之前给他编过猜数字 ...
    99+
    2024-04-02
  • 详解如何利用Python制作24点小游戏
    目录先睹为快游戏规则(改编自维基百科)逐步实现Step1:制作24点生成器Step2:定义游戏精灵类Step3:实现游戏主循环先睹为快 24点 游戏规则(改编自维基百科) 从1~10...
    99+
    2024-04-02
  • Python完美还原超级玛丽游戏附代码与视频
    目录导语🎁正文🎁1)准备中🛒1.1环境安装🎑1.2图片素材+背景音乐+字体(可修改)🎑2)开始敲代码&...
    99+
    2024-04-02
  • 利用Python编写数字战舰游戏
    本篇内容主要讲解“利用Python编写数字战舰游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“利用Python编写数字战舰游戏”吧!前言制造多艘战舰:你需要小心,因为你需要确保你不要在战斗板上...
    99+
    2023-06-02
  • 利用Python编写游戏程序,打造自己的游戏作品
    利用Python编写游戏程序,打造自己的游戏作品,需要具体代码示例 Python是一种高级、通用、解释型程序设计语言。它具有简洁明了的语法、易于学习的特点,并且具有广泛的应用,可以用于网络应用、图形界面编程和游戏开发等多种领域。...
    99+
    2024-01-19
    Python编写 游戏程序 游戏作品
  • Python利用字典树实现猎词游戏
    目录解决策略什么是 Trie?创建 Trie 字典树单词测试总结猎词(word hunt)是一类很常见的游戏,给你一张字母组成的表,然后让你在这些字母中尽可能多的去寻找单词。这类游戏...
    99+
    2024-04-02
  • Python利用3D引擎写一个Pong游戏
    目录前言实现方法完整代码前言 之前,我们用pygame做了一个2D的Pong游戏,今天我们做一个3D的,游戏画面如下: 用ad和←→操作,双人对战 实现该效果我...
    99+
    2023-01-05
    Python 3D Pong游戏 Python Pong游戏 Python 游戏
  • Python NumPy矩阵对象详解及方法
    目录1. 介绍2. 创建矩阵3. 矩阵特有属性4. 矩阵乘法1. 介绍 在数学上,矩阵(Matrix)是一个按照矩形阵列排列的负数或实数集合,但在NumPy中,矩阵np.matrix...
    99+
    2024-04-02
  • Python实现猜拳与猜数字游戏的方法详解
    至此,我们的 Python零基础入门篇 的系列专栏到今天基本上算是结束了。今天没有任何的知识点,只是运用我们之前学习过的知识做两个小游戏的案例。第一个是模拟猜拳的小游戏,第二个就是猜...
    99+
    2024-04-02
  • 利用Python编写一个记忆翻牌游戏
    目录导语开发工具环境搭建先睹为快原理简介导语 昨天看到有留言竟然说我是月更博主,我明明更新地这么勤快(心虚.jpg)。看吧,昨天刚更新过,今天又来更新了。 今天还是带大家写个小游戏吧...
    99+
    2024-04-02
  • 如何利用Python实现星空大战游戏
    小编给大家分享一下如何利用Python实现星空大战游戏,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一.游戏画面二.游戏结束画面三.游戏素材四.游戏代码星空飞碟大...
    99+
    2023-06-29
  • 如何利用Python创建一个游戏窗口
    本篇内容主要讲解“如何利用Python创建一个游戏窗口”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何利用Python创建一个游戏窗口”吧!前言 想要利用Python创建一个游戏窗口...
    99+
    2023-07-02
  • 利用python实现flappy bird 游戏(完整代码)
    第一个python文件,flappybirdmain.py ,程序中已经有详细注释.。 程序大概流程:1.加载图片素材文件 2.绘画开始界面,等待程序开始(按空格) 3 .程序刷新,...
    99+
    2024-04-02
  • 利用Python模拟谷歌的小恐龙游戏
    目录前言开发工具环境搭建先睹为快代码介绍前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。 PS:如有需要Python学习资料...
    99+
    2024-04-02
  • Python还能这么玩之用Python做个小游戏的外挂
    目录一、前言二、工具的准备三、开挂步骤四、实现开挂,自动做菜一、前言 我打开4399小游戏网,点开了一个不知名的游戏,唔,做寿司的,有材料在一边,客人过来后说出他们的要求,你按照菜单...
    99+
    2024-04-02
  • Python实战小游戏飞机大战详解
    目录导语​正文一、环境安装二、我方飞机三、敌方飞机四、控制键盘移动五、检测子弹碰撞六、效果图总结导语 “看见别人都那么努力,那么勤奋,那么意气风发地走在成功的道路上,你问...
    99+
    2024-04-02
  • Python利用物理引擎Pymunk编写一个解压小游戏
    用鼠标创建小球,一个蹦来蹦去的解压小游戏……  本次需要的外置包:pygame,pymunk,cmd运行该命令安装: pip install ...
    99+
    2023-01-04
    Python Pymunk解压游戏 Python 解压游戏 Python Pymunk
  • 用Python写游戏脚本原来这么简单
    前言最近在玩儿公主连结,之前也玩儿过阴阳师这样的游戏,这样的游戏都会有个初始号这样的东西,或者说是可以肝的东西。当然,作为一名程序员,肝这种东西完全可以用写代码的方式帮我们自动完成。游戏脚本其实并不高深,最简单的体验方法就是下载一个Airt...
    99+
    2023-05-14
    游戏 Python 脚本
  • 利用Python写个简易版星空大战游戏
    目录前言一.游戏画面二.游戏结束画面三.游戏素材四.游戏代码五、核心代码1.导入模块2.动态星空背景函数3.不定时产生敌机函数4.飞碟的移动5.子弹的移动6.玩家射击函数7.播放背景...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作