中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-16 18:38
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 用批处理如何显示动态变换的九宫格? 查看 6,018 回复 31
楼 主 用批处理如何显示动态变换的九宫格? 发表于 2007-01-14 01:29 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
积分 2,725
发帖 1,160
注册 2006-09-23 12:00
UID 63486
来自 河北廊坊
状态 离线
相信很多人都知道九宫格吧,



戴九履一,左三右七,二四为肩,六八为足,横竖斜三个数相加都得15
突发奇想,可不可以用批处理来显示九宫格呢?可不是简单的echo哦。
要列出九宫格局,每个格中一个数字,每隔几秒钟变换格中的数字,例如:

九宫           
4 9 2
3 5 7
8 1 6

变成
2 9 4
7 5 3
6 1 8

又变成
6 1 8
7 5 3
2 9 4

又变成
8 1 6
3 5 7
4 9 2

又变成
6 7 2
1 5 9
8 3 4

又变成
8 3 4
1 5 9
6 7 2

等等等等,要求列举所有可能,记住不是罗列,每次显示一种。


[ Last edited by ccwan on 2007-1-14 at 01:31 AM ]
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
2 发表于 2007-01-14 01:40 ·  中国 广东 广州 天河区 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564
发帖 1,127
注册 2006-12-25 22:57
UID 74552
性别 男
状态 离线
2 4 6 8
1 3 7 9
5
河图格式是规定的
3 发表于 2007-01-14 01:43 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
积分 2,725
发帖 1,160
注册 2006-09-23 12:00
UID 63486
来自 河北廊坊
状态 离线
并非讨论河图洛书,只要达到一楼的要求。
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
4 发表于 2007-01-14 02:14 ·  中国 广东 广州 番禺区 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564
发帖 1,127
注册 2006-12-25 22:57
UID 74552
性别 男
状态 离线
九宫八卦,很明显呀,只有八个结果
5 发表于 2007-01-14 03:08 ·  中国 甘肃 甘南藏族自治州 合作市 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
这个难度大啊
6 发表于 2007-01-14 03:50 ·  中国 北京 联通
银牌会员
★★★
努力做坏人
积分 1,185
发帖 438
注册 2006-08-28 12:00
UID 61449
来自 北京
状态 离线
这个难度确实大,不好找规律
我今后在论坛的目标就是做个超级坏人!!!
7 发表于 2007-01-14 05:23 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
  演示代码如下:

@echo off
title 九宫格
mode con cols=40 lines=20
set n1=0
setlocal enabledelayedexpansion

:begin
cls
set n5=5
set str= 1 2 3 4 6 7 8 9
set /a n1+=1
if %n1% gtr 9 exit
call :intercept %n1%
set /a n9=15-%n1%-%n5%
call :intercept %n9%
for %%i in (%str%) do (
set flag=
set n2=%%i
set str_tmp=%str%
call :intercept !n2!
set /a n8=15-!n2!-!n5!
set /a n3=15-!n1!-!n2!
set /a n7=15-!n8!-!n9!
set /a n4=15-!n1!-!n7!
set /a n6=15-!n3!-!n9!
for %%j in (!n3! !n4! !n6! !n7! !n8!) do call :intercept %%j
if not "!str!"=="" set flag=1
set /a sum1=!n3!+!n5!+!n7!
set /a sum2=!n4!+!n5!+!n6!
if !sum1! equ 15 if !sum1! equ !sum2! if not defined flag call :result
set str=!str_tmp!
)
goto begin

:intercept
set str=!str: %1=!
goto :eof

:result
cls
echo.
echo.
echo.
echo ┌──┬──┬──┐
echo │ %n1% │ %n2% │ %n3% │
echo ├──┼──┼──┤
echo │ %n4% │ %n5% │ %n6% │
echo ├──┼──┼──┤
echo │ %n7% │ %n8% │ %n9% │
echo └──┴──┴──┘
echo.
echo ________________________________________
echo.
echo 按任意键显示下一个
pause>nul
goto :eof

  写错了一个E文单词,更正一下下顺便美化了一下显示界面。

[ Last edited by namejm on 2007-1-13 at 05:38 PM ]
本帖最近评分记录 (共 9 条) 点击查看详情
评分人分数时间
lxmxn +10 2007-01-14 05:27
vkill +5 2007-01-14 05:28
redtek +15 2007-01-14 07:19
pengfei +15 2007-01-14 10:34
ccwan +15 2007-01-14 21:01
chainliq +6 2007-01-15 01:20
zhxy9804 +2 2007-02-24 22:22
htysm +8 2007-04-23 04:32
huahua0919 +1 2007-12-05 10:36
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
8 发表于 2007-01-14 05:27 ·  中国 甘肃 甘南藏族自治州 合作市 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
namejm Nx
9 发表于 2007-01-14 05:30 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
UID 59080
状态 离线

  版主实在厉害啊,PF。
10 发表于 2007-01-14 08:56 ·  中国 广东 珠海 电信
初级用户
积分 22
发帖 9
注册 2007-01-14 08:34
UID 76474
性别 男
来自 珠海
状态 离线
Originally posted by lxmxn at 2007-1-13 04:30 PM:

  版主实在厉害啊,PF。

同感!~~
11 发表于 2007-01-14 13:25 ·  中国 湖南 娄底 新化县 电信
银牌会员
★★★
积分 1,218
发帖 485
注册 2006-07-21 21:24
UID 58987
来自 湖南.娄底
状态 离线
namejm兄的代码甚为精彩~~~!这里九宫格指的是魔方阵, 楼主给出的九宫格为三阶的魔方阵, 而变换时只是以纵横为中心轴将其两侧的阵列互换了一下, 它的行、列及对角都是相同数字相加。

大家还可以扩展一下, 把阶数扩大为5或7等.


所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。如下是三阶魔方阵:

8 1 6
3 5 7
4 9 2


打印魔方阵算法:

1、将1放在第一行中间一列;

2、从2开始直到n*n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1. 例如上面的三阶魔方阵,5在4的上一行后一列;

3、如果上一个数的行数为1,则下一个数的行数为n(指最下一行). 例如: 1在第1行,则2应放在最下一行,列数同样加1;

4、当上一个数的列数为n时,下一个数的列数应为1,行数减1. 例如: 2在第3行最后一列,则3应放在第2行第1列;

5、如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面. 例如: 按上面的规定,4应该放在第1行第2列,但该位置已被1占据,所以4就放在3的下面.由于6是第1行第3列(即最后一列),故7放在6下面.按此方法可以得到任何阶的魔方阵.



根据上面的算法用批处理实现打印魔方阵完全可以实现, 可能需要构建二维数组。

发个我以前写的打印魔方阵的小程序。

[ Last edited by pengfei on 2007-1-15 at 01:29 AM ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
lxmxn +10 2007-01-14 15:12
附件
sigil.rar (4.22 KiB, 下载附件所需积分 1 点, 下载次数: 83)
业精于勤而荒于嬉,形成于思而毁于随。
12 发表于 2007-01-14 15:14 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
UID 59080
状态 离线

  To pengfei :

  兄写的小程序也精彩啊,而且把其中的算法也说的很明白,精彩。
13 发表于 2007-01-14 21:02 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
积分 2,725
发帖 1,160
注册 2006-09-23 12:00
UID 63486
来自 河北廊坊
状态 离线
namejm的水平真不是盖的,佩服得很啊!
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
14 发表于 2007-01-15 01:20 ·  中国 广西 贵港 电信
高级用户
★★
学无尽止
积分 635
发帖 244
注册 2006-04-15 05:07
UID 53857
性别 男
来自 广西贵港
状态 离线
高手,KOOL````````
学无尽止
15 发表于 2007-01-15 08:12 ·  中国 广东 广州 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564
发帖 1,127
注册 2006-12-25 22:57
UID 74552
性别 男
状态 离线

@ECHO OFF
:TOP
SET /A R=%RANDOM%%%8
SET /A R=%R%+%R%%%2
IF %R% LEQ 0 GOTO TOP
IF 0x00%R% EQU 0x00%A% (
SET Ct=1) ELSE (
SET Ct=0)
SET A=%R%
SET /A E=5
SET /A At=15-%A%
SET /A I=%At%-%E%
SET /A It=15-%I%
SET /A X=15-%A%*2-%E%
IF %X% LEQ 0 SET /A X=~%X%+1
SET /A Y=20-%A%-%X%-%I%
IF %Ct% EQU 0 (SET /A C=%X%,G=%Y%) ELSE SET /A C=%Y%,G=%X%
SET /A B=%At%-%C%,D=%At%-%G%,F=%It%-%C%,H=%It%-%G%

ECHO %A% %B% %C%
ECHO %D% %E% %F%
ECHO %G% %H% %I%
pause>nul
cls&&goto top


我也试着写了一个,反推出来的
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
pengfei +15 2007-01-15 10:29
论坛跳转: