[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[原创代码] [Perl]Win32::Console版生命游戏

本帖最后由 523066680 于 2014-9-22 11:34 编辑

环境: Perl 5.16.3, Win32
循环设置了1000次,按ESC可提前退出。
思路写的不太漂亮,先简单实现吧
  1. use Term::ReadKey;
  2. use Win32::Console;
  3. use Time::HiRes 'sleep';
  4. use IO::Handle;
  5. STDOUT->autoflush(1);
  6. system("mode con lines=40 cols=80");
  7. our $OUT=Win32::Console->new(STD_OUTPUT_HANDLE);
  8. $OUT->Cursor(20, 20, 99, 0);  #hide cursor
  9. my ($i, $j);
  10. our ($rows, $cols) = (40, 40);
  11. our ($mxrow, $mxcol) = ($rows-1, $cols-1);
  12. # init
  13. our @coord;
  14. my (@h, @n);
  15. my $y = 0;
  16. foreach (<DATA>) {
  17.     s/\r?\n$//;
  18.     tr/\*\./10/;
  19.     @{$h[$y++]} = ( split("", $_) );
  20. }
  21. foreach $i (0 .. $mxrow) {
  22.     foreach $j (0 .. $mxcol) {
  23.         $coord[$i][$j]{'x'} = $j*2;
  24.         $coord[$i][$j]{'y'} = $i;
  25.         $h[$i][$j] = 0 unless (defined $h[$i][$j]);
  26.         $n[$i][$j] = 0;
  27.     }
  28. }
  29. &Draw(\@n, \@h);
  30. foreach (0..1000) {
  31.     sleep 0.1;
  32.     @n = ();
  33.     &NextBuffer(\@h, \@n);
  34.     &Draw(\@h, \@n);
  35.     @h = (@n);
  36.     &KeyFunc();
  37. }
  38. sub NextBuffer {
  39.     my ($ra, $rb) = (shift, shift);
  40.     my ($i, $j, $sum, $n);
  41.     my ($L, $R, $U, $D, $vi, $vj);
  42.     foreach $i (0 .. $mxrow) {
  43.         $U = ($i-1) < 0 ? $mxrow : ($i-1);
  44.         $D = ($i+1) > $mxrow ? 0 : ($i+1);
  45.         foreach $j (0 .. $mxcol) {
  46.             $sum = 0;
  47.             $L = ($j-1) < 0 ? $mxcol : ($j-1);
  48.             $R = ($j+1) > $mxcol ? 0 : ($j+1);
  49.             $sum = $ra->[$U][$L] + $ra->[$U][$j] + $ra->[$U][$R] +
  50.                    $ra->[$i][$L] +        0      + $ra->[$i][$R] +
  51.                    $ra->[$D][$L] + $ra->[$D][$j] + $ra->[$D][$R];
  52.             if ($sum == 3) {
  53.                 $rb->[$i][$j] = 1;
  54.             } elsif ($sum == 2) {
  55.                 $rb->[$i][$j] = $ra->[$i][$j];
  56.             } else {
  57.                 $rb->[$i][$j] = 0;
  58.             }
  59.         }
  60.     }
  61. }
  62. sub Draw {
  63.     my ($ra, $rb) = (shift, shift);
  64.     foreach $i (0 .. $mxrow) {
  65.         foreach $j (0 .. $mxcol) {
  66.             if ($rb->[$i][$j] != $ra->[$i][$j]) {
  67.                 &Point(
  68.                     $coord[$i][$j]{'x'},
  69.                     $coord[$i][$j]{'y'},
  70.                     $rb->[$i][$j],
  71.                 );
  72.             }
  73.         }
  74.     }
  75. }
  76. sub Point {
  77.     my ($mx, $my, $light) = (shift, shift, shift);
  78.     my $color;
  79.     if ($light == 1) {
  80.         $color = $FG_WHITE|$BG_GRAY;
  81.     } else {
  82.         $color = $FG_WHITE|$BG_BLACK;
  83.     }
  84.     $OUT->Cursor($mx, $my);
  85.     $OUT->FillAttr($color, 2, $mx, $my);
  86. }
  87. sub KeyFunc {
  88.     my $key;
  89.     $key = ReadKey(-1);
  90.     return if (not defined $key);
  91.     if ( ord($key) == 27 ) {
  92.         exit;
  93.     }
  94. }
  95. __DATA__
  96. ......................**...............
  97. ......................**...............
  98. .......................................
  99. .......................................
  100. .......................................
  101. .......................................
  102. .......................................
  103. .......................................
  104. .......................................
  105. .......................................
  106. .......................................
  107. .......................................
  108. .........*..........**...**............
  109. .......*.*............***..............
  110. ......*.*............*...*.............
  111. **...*..*.............*.*..............
  112. **....*.*..............*...............
  113. .......*.*......*.*....................
  114. .........*......**.....................
  115. .................*...*.................
  116. .....................**......*.........
  117. ....................*.*......*.*.......
  118. ...............*..............*.*....**
  119. ..............*.*.............*..*...**
  120. .............*...*............*.*......
  121. ..............***............*.*.......
  122. ............**...**..........*.........
  123. .......................................
  124. .......................................
  125. .......................................
  126. .......................................
  127. .......................................
  128. .......................................
  129. .......................................
  130. .......................................
  131. .......................................
  132. .......................................
  133. ...............**......................
  134. ...............**......................
复制代码

我都没做过这个东东

TOP

本帖最后由 523066680 于 2014-9-21 12:07 编辑
我都没做过这个东东
neorobin 发表于 2014-9-21 11:38


    规则:
1. 如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),则该细胞为生(即该细胞若原先为死,则转为生,若原先为生,则保持不变) 。
2. 如果一个细胞周围有2个细胞为生,则该细胞的生死状态保持不变;
3. 在其它情况下,该细胞为死(即该细胞若原先为生,则转为死,若原先为死,则保持不变)
设定图像中每个像素的初始状态后依据上述的游戏规则演绎生命的变化,由于初始状态和迭代次数不同,将会得到令人叹服的优美图案。

    有些生命游戏的模式超赞  发个wiki链接
Conway's Game of Life

TOP

接触这个游戏倒是很早很早的了, 上次 BAT 的竞赛当时我也没见着, 后来只瞅了下, 以后也许BAT弄一下吧

TOP

本帖最后由 523066680 于 2014-9-21 12:56 编辑

回复 4# neorobin


      确定不使用 C + 图形库 吗 ……
有时间搞个3D+半透明效果方块组成的细胞自动机,应该很有趣。

TOP

回复 5# 523066680


    YOUTUBE 上看到好多人做过了

TOP

回复 6# neorobin


    果然是走在前线的,表示也是业余玩个兴趣。

TOP

在这里 那个gif里的运动是谁算出来的真牛啊 很想输入看看
!scripting!

TOP

本帖最后由 neorobin 于 2014-9-28 15:52 编辑

Conway's Game of Life 是生命游戏中的一类, 规则可以简单描述成 23/3 或者 B3/S23, 即邻居是2或3个时继续存活, 空单元的邻居正好3个时, 可以在此处新生

专题网站  http://www.conwaylife.com/
上有 3000+ 个模式供下载
http://www.conwaylife.com/patterns/all.zip

看几个大的 (比较大的 GIF , 不知怎能在论坛显示?)


河豚火车


反射器


又该耕地了


饲养员


ALPHA 星入侵, 来势凶悍啊


不用出动这多战舰, 给我四驾战车, GO, 占领整个宇宙吧


这些大型生物对效率要求是很高的, 用汇编或者高级语言实现比较好

我还是发个简单的 BAT 版的吧, 学了下 CRLF 的 set allvar=   速度确实快了好象有一倍哦
  1. set "M=20"
  2. if "%1"=="" (
  3.     for %%a in ( FontSize:00080008 FontFamily:00000030 WindowSize:00%M%00%M%
  4.               ScreenColors:0000000f CodePage:000001b5 ScreenBufferSize:00%M%00%M%
  5.     ) do for /f "tokens=1,2 delims=:" %%b in ("%%a") do (
  6.         >nul reg add HKCU\Console\LIFEGAME /v %%b /t reg_dword /d 0x%%c /f
  7.     )
  8.     start "LIFEGAME" /max "%ComSpec%" /c "%~s0" 1&goto:eof
  9. ) else (
  10.     >nul reg delete HKCU\Console\LIFEGAME /f
  11. )
  12. @echo off & setlocal enableDelayedExpansion
  13. for /f "delims==" %%a in ('set') do if "%%a" neq "M" set "%%a="
  14. set /a "M=0x%M%, L=M-2, im=M*M, _P=M+1, _Q=L*M+1"
  15. for /l %%a in (1 1 !im!) do (
  16.     if !random! lss 0x3fff (set "W= !W!") else set "W=#!W!"
  17. if %%a lss !M! set "ET= !ET!"
  18. )
  19. for /l %%a in () do (
  20.     set "U="
  21.     for /l %%i in (!_P! !M! !_Q!) do (
  22.         set /a "a=%%i-1+L"& for /f "tokens=1-3" %%a in ("!a! %%i !L!") do set "U=!U!!W:~%%a,1!!W:~%%b,%%c!!W:~%%b,1!"
  23.     )
  24.     for %%a in (!M!) do set "U=!U:~-%%a!!U!!U:~0,%%a!"
  25.     set "W="
  26.     for /l %%i in (!_P! !M! !_Q!) do (
  27.         set /a "_b=%%i-2, _a=_b-m, _c=_b+m, _i=%%i-1"
  28.         for /l %%a in (1 1 !L!) do (
  29.             set /a "_b+=1, _a+=1, _c+=1, _i+=1"
  30.             for /f "tokens=1-4" %%a in ("!_a! !_b! !_c! !_i!") do (
  31.                 set "_t=!U:~%%a,3!!U:~%%b,3!!U:~%%c,3!"
  32.                 set "_t=!_t: =!     !U:~%%d,1!#   " & set "W=!W!!_t:~9,1!"
  33.             )
  34.         )
  35.         set "W=!W!  "
  36.     )
  37.     set "W=!ET!  !W!!ET!"
  38. cls & echo !W:~0,-%_P%!
  39. )
复制代码
1

评分人数

TOP

本帖最后由 523066680 于 2014-9-28 11:43 编辑

回复 9# neorobin

上传到公共图床然后论坛贴图咯,可能加载会比wikipedia的快一些

TOP

回复 9# neorobin
cmd命令怎么删掉_106.lif结尾的文件名 del .*_106.lif不行啊 你给的链接里面好多文件 我要删掉不能用的
!scripting!

TOP

回复 9# neorobin
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /r %%a in (*.lif) do (
  4. set var=%%a
  5. set var=!var:~-8!
  6. if !var!==_106.lif del %%a
  7. )
  8. pause
复制代码
有没有比这个简便的命令写法
!scripting!

TOP

回复  neorobin
cmd命令怎么删掉_106.lif结尾的文件名 del .*_106.lif不行啊 你给的链接里面好多文件 我要 ...
普大喜奔 发表于 2014-9-28 12:59


把.*改成 *

    你可以改成  dir *_106.lif 看看结果对不对,然后改成del
1

评分人数

TOP

Conway's Game of Life 是生命游戏中的一类, 规则可以简单描述成 23/3 或者 B3/S23, 即邻居是2或3个时继续存 ...
neorobin 发表于 2014-9-28 10:52

大神发的这个链接好多好看的矩阵,我把代码改了下,用把.lif文件拖到importGrid.cmd上就可以看矩阵的效果了
也可以直接运行cell.py,用随机矩阵玩
cell.py
  1. import sys
  2. import os
  3. import random
  4. import time
  5. cols=100
  6. rows=80
  7. dict={' ':0,'*':1}
  8. cells=[[' ' for x in range(cols)] for y in range(rows)]
  9. grid=[[' ' for x in range(cols)] for y in range(rows)]
  10. if len(sys.argv)>1:
  11.     f=sys.argv[1]
  12.     try:
  13.         txt=open(f,'r')
  14.     except:
  15.         print('file not found')
  16.         os.system('pause >nul')
  17.         exit()
  18.     y=1
  19.     for line in txt.readlines():
  20.         if y==rows-1:
  21.             print('err:too much lines')
  22.             break
  23.         if line[0]=='#':continue
  24.         for x in range(cols-2):
  25.             try:
  26.                 if line[x]=='*':cells[y][x+1]='*'
  27.             except:
  28.                 y+=1
  29.                 break
  30. else:
  31.     print('cmdline:cell.py *.lif')
  32.     while True:
  33.         level=input('larger number,less cells ( >0 ):')
  34.         try:
  35.             if int(level)>0:
  36.                 for y in range(1,rows-1):
  37.                     for x in range(1,cols-1):
  38.                         r=random.randint(0,int(level))
  39.                         if r==0:cells[y][x]='*'
  40.                 break
  41.         except:pass
  42. for y in cells:print(' '.join(y))
  43. print("press key to begin...")
  44. os.system('pause >nul')
  45. i=0
  46. while True:
  47.     for y in range(1,rows-1):
  48.         for x in range(1,cols-1):
  49.             num=dict[cells[y-1][x-1]]+\
  50.                 dict[cells[y-1][x+1]]+\
  51. dict[cells[y-1][x]]+\
  52. dict[cells[y+1][x-1]]+\
  53. dict[cells[y+1][x+1]]+\
  54. dict[cells[y+1][x]]+\
  55. dict[cells[y][x-1]]+\
  56. dict[cells[y][x+1]]
  57.             if num==3:grid[y][x]='*'
  58.             elif num==2:grid[y][x]=cells[y][x]
  59.             else:grid[y][x]=' '
  60.     for y in range(1,rows-1):
  61.         for x in range(1,cols-1):
  62.             cells[y][x]=grid[y][x]
  63.     time.sleep(0.01)
  64.     os.system('cls')
  65.     i+=1
  66.     print('time: '+str(i))
  67.     num=0
  68.     for y in range(1,rows-1):
  69.         for x in range(1,cols-1):
  70.             num+=dict[cells[y][x]]
  71.     if num==0:
  72.         print('cells all dead,press key to exit...')
  73.         break
  74.     else:
  75.         for y in cells:print(' '.join(y))
  76. os.system('pause >nul')
复制代码
importGrid.cmd:
  1. @echo off & setlocal enabledelayedexpansion & color 0a & title PYTHON CELL
  2. if "%2"=="" (
  3. for %%a in (FontSize:00080005  WindowSize:005c00c8  ScreenColors:0000000f  CodePage:000003a8  ScreenBufferSize::005c00c8) do for /f "tokens=1,2 delims=:" %%b in ("%%a") do (
  4. >nul reg add HKCU\Console\PYTHON_CELL /v %%b /t reg_dword /d 0x%%c /f)
  5. start "PYTHON_CELL" /max "%ComSpec%" /c "%~s0" %1 1&goto:eof
  6. ) else (
  7. >nul reg delete HKCU\Console\PYTHON_CELL /f
  8. )
  9. python %~dp0cell.py %1
复制代码
!scripting!

TOP

返回列表