初學練習,用Perl寫的命令列五子棋
最近一週在學習 Perl ,剛看完小駱駝書。寫點有趣的東西練習練習。靈感來自於這裡 。
剛剛起步,可能有些地方還殘留著其他語言的痕跡。如果有什麼更好的寫法請大家不吝賜教。
學習 Perl 是為了寫一些處理文字的小工具,今後會陸續發出來的。預計第一個將是 Java 程式碼轉換 AS3 程式碼的工具。
#!perl use 5.010; use strict; use utf8; binmode(STDIN, ':encoding(utf8)'); binmode(STDOUT, ':encoding(utf8)'); binmode(STDERR, ':encoding(utf8)'); my $cell=16; my $cell_char="+"; my $turn = 1; my (@cells, @line, @rows, $point, $msg); &init; while(1) { system "cls"; &printCells; if(&checkWin) { say "[".(!$turn ? "Black" : "White")."] is win!"; last; } say $msg if ($msg); $msg = undef; say "[".($turn ? "Black" : "White")."] side turn..."; chomp($point = <STDIN>); unless ($point =~ s/([a-p]{2})/\L\1/i) { $msg = "Invalid input or out of range. \nPlease enter two character in a-z."; redo; } if (&downChess) { $turn = !$turn; } else { $msg = "Pieces already exist, can not be repeated. \nTry again!"; redo; } } #初始化遊戲二維陣列 sub init { for(1..$cell) { my @line = split(/ /, "$cell_char " x $cell); push @cells, \@line; } @rows = 'a'..'p'; } #列印遊戲當前棋盤 sub printCells { say " @rows"; for(0..$cell-1){ @line = @{$cells[$_]}; say "$rows[$_] @line"; } } #落子 sub downChess { #解析 my $rowNum = &index(substr $point, 0, 1); my $colNum = &index(substr $point, 1, 1); #驗證 #return 0 if (!&isInRange($rowNum) or !&isInRange($colNum)); return 0 unless ($cells[$rowNum]->[$colNum] eq $cell_char); #落子 $cells[$rowNum]->[$colNum] = &turnChar($turn); return 1; } #當前棋子樣式 sub turnChar { return $_[0] ? '@' : 'o'; } sub isInRange { return $_[0] >= 0 and $_[0] <= $cell; } #傳入char,返回與'a'的差 sub index { ord($_[0]) - ord('a'); } #判斷是否勝利 sub checkWin { return (&checkVerticalWin or &checkTraverseWin or &checkLeftCantWin); } #判斷縱向勝利 sub checkVerticalWin { for my $index (0..$#cells) { my $time; for my $line (@cells) { if(@{$line}[$index] eq &turnChar(!$turn)) { $time++; } else { $time = 0; } if($time == 5) { return 1; } } } return 0; } #判斷橫向勝利 sub checkTraverseWin { for(@cells) {#0..$#cells) { my $time; for my $chess (@{$_}) {#$cells[$_]}) { if($chess eq &turnChar(!$turn)) { $time++; } else { $time = 0; } #say $time if($time != 0); if($time == 5) { return 1; } } } return 0; } #判斷向左傾斜 sub checkLeftCantWin { for my $index (0..$#cells) { my ($time_right, $time_left, $temp_index); $temp_index = $index; for my $line (@cells) { #左上到右下,上半部分 if(@{$line}[$temp_index] eq &turnChar(!$turn)) { $time_right++; } else { $time_right = 0; } #右上到左下,上半部分 if(@{$line}[$#line-$temp_index] eq &turnChar(!$turn)) { $time_left++; } else { $time_left = 0; } $temp_index--; #say $time if ($time != 0); return 1 if($time_right == 5 or $time_left == 5); last if($temp_index < 0); } $time_right = 0; $time_left = 0; for my $line(reverse @cells) { #左上到右下,下半部分 if(@{$line}[$#line-$index] eq &turnChar(!$turn)) { $time_right++; } else { $time_right = 0; } #右上到左下,下半部分 if(@{$line}[$index] eq &turnChar(!$turn)) { $time_left++; } else { $time_left = 0; } $index--; #say $time if ($time != 0); return 1 if($time_right == 5 or $time_left == 5); last if($#line == $index); } } return 0; }
相關文章
- perl 命令列模式命令列模式
- Perl 作為命令列實用程式(轉)命令列
- Perl學習筆記(五)——關聯陣列筆記陣列
- Java學習之陣列練習Java陣列
- java簡單練習-五子棋Java
- 初識命令列命令列
- 用 Swift 來寫命令列程式Swift命令列
- 編寫友好的命令列應用程式命令列
- 學習perl(6)
- 學習perl(5)
- 學習Perl(4)
- 學習perl(3)
- 學習perl(2)
- Java學習筆記——陣列練習(七)Java筆記陣列
- 用 nodejs 寫一個命令列工具 :建立 react 元件的命令列工具NodeJS命令列React元件
- PacVim:一個學習 vim 命令的命令列遊戲命令列遊戲
- PERL學習筆記---正規表示式的應用筆記
- perl6學習
- Shells命令列學習筆記命令列筆記
- 用perl寫的一個watchdog程式
- Perl語言學習(四)Perl控制結構
- 初創公司如何訓練大型深度學習模型深度學習模型
- Find命令練習
- 用nodejs寫一個命令列應用-前言NodeJS命令列
- 學習 golang 中,寫了個 golang http client 練練手GolangHTTPclient
- perl DBI 學習總結
- perl學習筆記1筆記
- perl學習筆記(7)筆記
- OpenSSL學習筆記:openssl命令列的使用筆記命令列
- JAVA 陣列 練習Java陣列
- 陣列練習題陣列
- oracle語句練習--初級Oracle
- perl學習筆記---標量筆記
- 用 go 寫的五子棋預測演算法Go演算法
- Git學習3 --- Git命令列基本操作Git命令列
- 學習ASM技術(六)-- ASMCMD命令列ASM命令列
- 用Node.js寫的看股票的命令列小工具Node.js命令列
- perl 陣列的hash表陣列