Python3.4 写的 Nonogram 游戏解题代码

1.关于本文

Nonogram是一种逻辑游戏,以猜谜的方式绘画位图。在一个网格中,每一行和列都有一组数,玩家需根据它们来填满或留空格子,最后就可以由此得出一幅图画。

具体规则可以参见Wikipedia上的相关页面:

中文简体:https://zh.wikipedia.org/zh-cn/Nonogram

英文:https://en.wikipedia.org/wiki/Nonogram

本文中的程序,通过写在文本文件中给定的输入,经过计算,把输出写到另一个文本文件中

(这个程序最开始写出来的目的是用来计算PythonChallenge的第32关的~~~,因此输入文件的格式设计也采用了与该关输入相同的格式)

2.输入的文本文件

输入是一个文本文件。共有Dimensions、Horizontal lines、Vertical lines三个区,Dimensions指定输入矩阵的高度和长度,Horiziontal lines 和 Vertical line 下各行的数字分别代表着Nonogram每行或每列头部出现的提示性数字

如下面这个up.txt,就是一个合法的输入文本:

# Dimensions
32 32

# Horizontal lines
3 2
8
10
3 1 1

5 2 1
5 2 1
4 1 1
15

19
6 14
6 1 12
6 1 10

7 2 1 8
6 1 1 2 1 1 1 1
5 1 4 1
5 4 1 4 1 1 1

5 1 1 8
5 2 1 8
6 1 2 1 3
6 3 2 1

6 1 5
1 6 3
2 7 2
3 3 10 4

9 12 1
22 1
21 4
1 17 1

2 8 5 1
2 2 4
5 2 1 1
5

# Vertical lines
5
5
5
3 1

3 1
5
5
6

5 6
9 5
11 5 1
13 6 1

14 6 1
7 12 1
6 1 11 1
3 1 1 1 9 1

3 4 10
8 1 1 2 8 1
10 1 1 1 7 1
10 4 1 1 7 1

3 2 5 2 1 2 6 2
3 2 4 2 1 1 4 1
2 6 3 1 1 1 1 1
12 3 1 2 1 1 1

3 2 7 3 1 2 1 2
2 6 3 1 1 1 1
12 3 1 5
6 3 1

6 4 1
5 4
4 1 1
5

3.程序代码

FILL, UNCERTAIN, NOTHING = 'X', '_', ' '

def inputdata(inputfile):

    '''
    函数:从inputfile读取数据
    输入:@inputfile,字符串,输入文件
    输出:读取到的数据
          @height 矩阵高度
          @width 矩阵长度
          @horizdata 各行数据(Nonogram矩阵左侧数据)
          @verticdata 各列数据(Nonogram矩阵上侧数据)
    '''

    (height, width, horizdata, verticdata) = 0, 0, [], []

    #标识进入到各个步骤的常量
    STEP_NOTHING = 'NOTHING'
    STEP_READDMI = 'READDIM'
    STEP_READHRZ = 'READHRZ'
    STEP_READVRT = 'READVRT'
    currstep = STEP_NOTHING
    
    #打开文件
    f = open(inputfile, 'r')
    for line in f.readlines():

        #读到空行直接跳过
        if line.strip() == '':
           
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数织图游戏的 Java 代码如下: ``` import java.util.Scanner; public class Nonogram { public static void main(String[] args) { Scanner input = new Scanner(System.in); // 数织图的行列数 System.out.print("请输入数织图的行数:"); int row = input.nextInt(); System.out.print("请输入数织图的列数:"); int col = input.nextInt(); // 定义数织图的行列数组 int[][] rowArr = new int[row][]; int[][] colArr = new int[col][]; for (int i = 0; i < row; i++) { System.out.print("请输入第" + (i + 1) + "行的数字序列,用空格隔开:"); String[] rowStr = input.next().split(" "); rowArr[i] = new int[rowStr.length]; for (int j = 0; j < rowStr.length; j++) { rowArr[i][j] = Integer.parseInt(rowStr[j]); } } for (int i = 0; i < col; i++) { System.out.print("请输入第" + (i + 1) + "列的数字序列,用空格隔开:"); String[] colStr = input.next().split(" "); colArr[i] = new int[colStr.length]; for (int j = 0; j < colStr.length; j++) { colArr[i][j] = Integer.parseInt(colStr[j]); } } // 初始化数织图的二维数组 int[][] nonogram = new int[row][col]; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { nonogram[i][j] = -1; } } // 打印数织图 printNonogram(nonogram, rowArr, colArr); // 根据玩家的输入更新数织图 while (true) { System.out.print("请输入要填充的行列号和数字(格式为x y z,用空格隔开),输入0结束游戏:"); int x = input.nextInt() - 1; if (x == -1) { break; } int y = input.nextInt() - 1; int z = input.nextInt(); nonogram[x][y] = z; printNonogram(nonogram, rowArr, colArr); } input.close(); } /** * 根据数织图的二维数组和行列数组打印出数织图 */ public static void printNonogram(int[][] nonogram, int[][] rowArr, int[][] colArr) { for (int i = 0; i < rowArr.length; i++) { for (int j = 0; j < rowArr[i].length; j++) { System.out.print(rowArr[i][j] + " "); } System.out.print(" | "); for (int j = 0; j < nonogram[i].length; j++) { System.out.print((nonogram[i][j] == -1) ? " " : (nonogram[i][j] + " ")); } System.out.println(); } for (int i = 0; i < colArr.length; i++) { for (int j = 0; j < colArr[i].length; j++) { System.out.print(colArr[i][j] + " "); } System.out.print(" "); } System.out.println("\n"); } } ``` 在这个代码中,我们使用了 Scanner 类来获取用户的输入。用户首先需要输入数织图的行列数,然后输入每一行和每一列的数字序列。程序会根据这些数字序列来初始化数织图的二维数组。 程序会不断地询问用户要填充的行列号和数字,直到用户输入 0。每次用户输入后,程序会更新数织图的二维数组,并打印出数织图。在打印数织图时,我们还会打印出每一行和每一列的数字序列,方便用户填充数织图。 这个程序只是数织图游戏的基本框架,你可以根据自己的需要对其进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值