利用Python还原方阵游戏详解

目录
  • 一、前言
  • 二、游戏规则
  • 三、numpy模块
  • 四、第一步:大循环and获取规格
  • 五、第二步:初始化棋盘
  • 六、第三步:标注矩阵功能(难)
  • 七、第四步:查看标注矩阵功能
  • 八、第五步:胜利侦测
  • 九、第六步:查看行列信息(难)
  • 十、第七步:重新开始功能
  • 十一、得分与完善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还原方阵游戏内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 基于Python实现经典植物大战僵尸游戏

    目录 游戏截图 动态演示 源码分享 state/tool.py state/constants.py state/main.py 主执行文件main.py 游戏截图 动态演示 源码分享 state/tool.py import os import json from abc import abstractmethod import pygame as pg from . import constants as c class State(): def __init__(self): self.s

  • python 实现方阵的对角线遍历示例

    任务描述 对一个方阵矩阵,实现平行于主对角线方向的对角线元素遍历. 从矩阵索引入手: [[ 1 2 3 4 5] [ 6 7 8 9 10] [11 12 13 14 15] [16 17 18 19 20] [21 22 23 24 25]] 上三角的索引遍历: 0 0 1 1 2 2 3 3 4 4 0 1 1 2 2 3 3 4 0 2 1 3 2 4 0 3 1 4 0 4 下三角的索引遍历: 1 0 2 1 3 2 4 3 2 0 3 1 4 2 3 0 4 1 4 0 代码 impo

  • Python实现简单扫雷游戏

    本文实例为大家分享了Python实现简单扫雷游戏的具体代码,供大家参考,具体内容如下 #coding: utf-8 __note__ = """ * 扫雷小游戏 * 需要python3.x以上 * 需要安装PyQt5 * pip install PyQt5 """   import sys   try:     import PyQt5 except ImportError:     import tkinter     from tkinter

  • 十个Python经典小游戏的代码合集

    目录 1.小猫运动 游戏源码 游戏效果 2.弹球 游戏源码 游戏效果 3.画正方形 游戏源码 游戏效果 4.彩点实验 游戏源码 游戏效果 5.彩点实验圆形 游戏源码 游戏效果 6.彩点实验下三角 游戏源码 游戏效果 7.彩点实验抛物线 游戏源码 游戏效果 8.彩点实验椭圆形 游戏源码 游戏效果 9.旋转文字 游戏源码 游戏效果 10.迷宫游戏 游戏源码 游戏效果 1.小猫运动 游戏源码 # @Author : 辣条 ''' 多行注释 本程序运行后会有一只小猫向前走 安装模块 pip instal

  • Python实现智能贪吃蛇游戏的示例代码

    目录 前言 基本环境配置 实现效果 实现代码 前言 我想大家都玩过诺基亚上面的贪吃蛇吧,本文将带你一步步用python语言实现一个snake小游戏. 基本环境配置 版本:Python3 系统:Windows 相关模块:pygame pip install pygame安装即可 实现效果 实现代码 import random, pygame, sys from pygame.locals import * import time ''' ''' FPS = 1 ##WINDOWWIDTH = 64

  • 利用Python还原方阵游戏详解

    目录 一.前言 二.游戏规则 三.numpy模块 四.第一步:大循环and获取规格 五.第二步:初始化棋盘 六.第三步:标注矩阵功能(难) 七.第四步:查看标注矩阵功能 八.第五步:胜利侦测 九.第六步:查看行列信息(难) 十.第七步:重新开始功能 十一.得分与完善and完整代码 一.前言 写这篇文章的灵感来源于我玩游戏的时候(为了避免过不了审就不说是啥游戏了),看见一个大佬在游戏里面建造了“还原方阵游戏”,就感觉很牛掰,就想着python不是有矩阵吗,可不可以还原一下呢? 说干就干,我写的那个

  • MySQL数据库设计之利用Python操作Schema方法详解

    弓在箭要射出之前,低声对箭说道,"你的自由是我的".Schema如箭,弓似Python,选择Python,是Schema最大的自由.而自由应是一个能使自己变得更好的机会. Schema是什么? 不管我们做什么应用,只要和用户输入打交道,就有一个原则--永远不要相信用户的输入数据.意味着我们要对用户输入进行严格的验证,web开发时一般输入数据都以JSON形式发送到后端API,API要对输入数据做验证.一般我都是加很多判断,各种if,导致代码很丑陋,能不能有一种方式比较优雅的验证用户数据呢

  • 利用Python生成随机验证码详解

    目录 1.先搞环境 2.开始码代码 3. 加干扰 4. 加入更多的干扰 5. 验证码 + 随机字符 6. 验证码保存本地(选) 最近感觉被大数据定义成机器人了,随便看个网页都跳验证码. 怎么用python绕验证码是个令人头秃的事情, 我投降!那么今天手把手教大家如何写验证码,去为难别人,让他们头秃. 说错了,其实就是教大家如何通过python代码去生成验证码~~ 1.先搞环境 1.我们需要你电脑有python3.4以上的版本 2.pip安装PIL包 pip install pillow 3.默念

  • 利用Python破解验证码实例详解

    一.前言 本实验将通过一个简单的例子来讲解破解验证码的原理,将学习和实践以下知识点: Python基本知识 PIL模块的使用 二.实例详解 安装 pillow(PIL)库: $ sudo apt-get update $ sudo apt-get install python-dev $ sudo apt-get install libtiff5-dev libjpeg8-dev zlib1g-dev \ libfreetype6-dev liblcms2-dev libwebp-dev tcl

  • 如何利用python读取micaps文件详解

    最近用编程处理文件挺多的,matlab用得比较熟,但还是想用python来写写,Fortran就不用了. 所用到的数据如下图,前面4行是说明,实际要用的数据是第5行开始. 一共是有29*53个点,每一组就有53个数据,一共是有29组. 下面就是操作了 # 导入所需的库 import numpy # 打开 micaps 文件 f1 = open('13052520.000', 'rt') f2 = open('data.txt', 'wt') # 前面4行为注释数据,没有用 for i in ra

  • 如何利用Python拟合函数曲线详解

    目录 拟合多项式 函数说明 拟合任意函数 函数说明 总结 使用Python拟合函数曲线需要用到一些第三方库: numpy:科学计算的基础库(例如:矩阵) matplotlib:绘图库 scipy:科学计算库 如果没有安装过这些库,需要在命令行中输入下列代码进行安装: pip install numpy matplotlib scipy 拟合多项式 ''' Author: CloudSir Date: 2021-08-01 13:40:50 LastEditTime: 2021-08-02 09:

  • 利用python如何处理nc数据详解

    前言 这两天帮一个朋友处理了些 nc 数据,本以为很简单的事情,没想到里面涉及到了很多的细节和坑,无论是"知难行易"还是"知易行难"都不能充分的说明问题,还是"知行合一"来的更靠谱些,既要知道理论又要知道如何实现,于是经过不太充分的研究后总结成此文,以记录如何使用 python 处理 nc 数据. 一.nc 数据介绍 nc 全称 netCDF(The Network Common Data Form),可以用来存储一系列的数组,就是这么简单(参考

  • 如何利用Python模拟GitHub登录详解

    前言 最近学习了Fiddler抓包工具的简单使用,通过抓包,我们可以抓取到HTTP请求,并对其进行分析.现在我准备尝试着结合Python来模拟GitHub登录. Fiddler抓包分析 首先,我们想要模拟一个网站的登录,我们必须要简单了解其大致过程. 在这里,我通过Fiddler来抓取GitHub登录的请求,从网页上登录的URL为:https://github.com/login ,抓包结果如下: 左边的是会话列表,右边的是请求和响应的数据.一般情况下,登录都是用POST请求,因为我在左边的会话

  • 利用Python破解斗地主残局详解

    前言 相信大家都玩过斗地主,规则就不再介绍了. 直接上一张朋友圈看到的残局图: 这道题我刚看到时,曾尝试用手工来破解,每次都以为找到了农民的必胜策略时,最后都发现其实农民跑不掉.由于手工破解无法穷尽所有可能性,所以这道题究竟农民有没有妙手跑掉呢,只能通过代码来帮助我们运算了. 本文将简要讲述怎么通过代码来求解此类问题,在最后会公布残局的最后结果,并开源代码以供大家吐槽. minimax 代码的核心思想是minimax.minimax可以拆解为两部分,mini和max,分别是最小和最大的意思. 直

  • python实现报表自动化详解

    本篇文章将介绍: xlwt 常用功能 xlrd 常用功能 xlutils 常用功能 xlwt写Excel时公式的应用 xlwt写入特定目录(路径设置) xlwt Python语言中,写入Excel文件的扩展工具.可以实现指定表单.指定单元格的写入.支持excel03版到excel2013版.使用时请确保已经安装python环境 xlrd Python语言中,读取Excel的扩展工具.可以实现指定表单.指定单元格的读取.使用时请确保已经安装python环境. NOTICE: xlwt对Excel只

随机推荐