亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
123下一頁
最近訪問板塊 發(fā)新帖
查看: 9373 | 回復(fù): 21
打印 上一主題 下一主題

初學(xué)練習(xí),用perl寫的命令行五子棋 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2009-11-28 01:48 |只看該作者 |倒序?yàn)g覽
剛剛起步,可能有些地方還殘留著其他語言的痕跡。如果有什么更好的寫法請大家不吝賜教。
  1. #!perl

  2. use 5.010;
  3. use strict;
  4. use utf8;
  5. binmode(STDIN, ':encoding(utf8)');
  6. binmode(STDOUT, ':encoding(utf8)');
  7. binmode(STDERR, ':encoding(utf8)');

  8. my $cell=16;
  9. my $cell_char="+";
  10. my $turn = 1;
  11. my (@cells, @line, @rows, $point, $msg);

  12. &init;
  13. while(1) {
  14.     system "cls";
  15.     &printCells;
  16.     if(&checkWin) {
  17.         say "[".(!$turn ? "Black" : "White")."] is win!";
  18.         last;
  19.     }
  20.     say $msg if ($msg);
  21.     $msg = undef;
  22.     say "[".($turn ? "Black" : "White")."] side turn...";
  23.     chomp($point = <STDIN>);
  24.     unless ($point =~ s/([a-p]{2})/\L\1/i) {
  25.         $msg = "Invalid input or out of range. \nPlease enter two character in a-z.";
  26.         redo;
  27.     }
  28.     if (&downChess) {
  29.         $turn = !$turn;
  30.     } else {
  31.         $msg = "Pieces already exist, can not be repeated. \nTry again!";
  32.         redo;
  33.     }
  34. }

  35. #初始化游戲二維數(shù)組
  36. sub init {
  37.     for(1..$cell) {
  38.         my @line = split(/ /, "$cell_char " x $cell);
  39.         push @cells, \@line;
  40.     }
  41.     @rows = 'a'..'p';
  42. }

  43. #打印游戲當(dāng)前棋盤
  44. sub printCells {
  45.     say "  @rows";
  46.     for(0..$cell-1){
  47.         @line = @{$cells[$_]};
  48.         say "$rows[$_] @line";
  49.     }
  50. }

  51. #落子
  52. sub downChess {
  53.     #解析
  54.     my $rowNum = &index(substr $point, 0, 1);
  55.     my $colNum = &index(substr $point, 1, 1);
  56.     #驗(yàn)證
  57.     #return 0 if (!&isInRange($rowNum) or !&isInRange($colNum));
  58.     return 0 unless ($cells[$rowNum]->[$colNum] eq $cell_char);
  59.     #落子
  60.     $cells[$rowNum]->[$colNum] = &turnChar($turn);
  61.     return 1;
  62. }

  63. #當(dāng)前棋子樣式
  64. sub turnChar {
  65.     return $_[0] ? '@' : 'o';
  66. }

  67. sub isInRange {
  68.     return $_[0] >= 0 and $_[0] <= $cell;
  69. }

  70. #傳入char,返回與'a'的差
  71. sub index {
  72.     ord($_[0]) - ord('a');
  73. }

  74. #判斷是否勝利
  75. sub checkWin {
  76.     return (&checkVerticalWin or &checkTraverseWin or &checkLeftCantWin);
  77. }

  78. #判斷縱向勝利
  79. sub checkVerticalWin {
  80.     for my $index (0..$#cells) {
  81.         my $time;
  82.         for my $line (@cells) {
  83.             if(@{$line}[$index] eq &turnChar(!$turn)) {
  84.                 $time++;
  85.             } else {
  86.                 $time = 0;
  87.             }
  88.             if($time == 5) {
  89.                 return 1;
  90.             }
  91.         }
  92.     }
  93.     return 0;
  94. }

  95. #判斷橫向勝利
  96. sub checkTraverseWin {
  97.     for(@cells) {#0..$#cells) {
  98.         my $time;
  99.         for my $chess (@{$_}) {#$cells[$_]}) {
  100.             if($chess eq &turnChar(!$turn)) {
  101.                 $time++;
  102.             } else {
  103.                 $time = 0;
  104.             }
  105.             #say $time if($time != 0);
  106.             if($time == 5) {
  107.                 return 1;
  108.             }
  109.         }
  110.     }
  111.     return 0;
  112. }

  113. #判斷向左傾斜
  114. sub checkLeftCantWin {
  115.     for my $index (0..$#cells) {
  116.         my ($time_right, $time_left, $temp_index);
  117.         $temp_index = $index;
  118.         for my $line (@cells) {
  119.             #左上到右下,上半部分
  120.             if(@{$line}[$temp_index] eq &turnChar(!$turn)) {
  121.                 $time_right++;
  122.             } else {
  123.                 $time_right = 0;
  124.             }
  125.             #右上到左下,上半部分
  126.             if(@{$line}[$#line-$temp_index] eq &turnChar(!$turn)) {
  127.                 $time_left++;
  128.             } else {
  129.                 $time_left = 0;
  130.             }
  131.             $temp_index--;
  132.             #say $time if ($time != 0);
  133.             return 1 if($time_right == 5 or $time_left == 5);
  134.             last if($temp_index < 0);
  135.         }
  136.         $time_right = 0;
  137.         $time_left = 0;
  138.         for my $line(reverse @cells) {
  139.             #左上到右下,下半部分
  140.             if(@{$line}[$#line-$index] eq &turnChar(!$turn)) {
  141.                 $time_right++;
  142.             } else {
  143.                 $time_right = 0;
  144.             }
  145.             #右上到左下,下半部分
  146.             if(@{$line}[$index] eq &turnChar(!$turn)) {
  147.                 $time_left++;
  148.             } else {
  149.                 $time_left = 0;
  150.             }
  151.             $index--;
  152.             #say $time if ($time != 0);
  153.             return 1 if($time_right == 5 or $time_left == 5);
  154.             last if($#line == $index);
  155.         }
  156.     }
  157.     return 0;
  158. }
復(fù)制代碼

評分

參與人數(shù) 1可用積分 +3 收起 理由
蘭花仙子 + 3 我很贊同

查看全部評分

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2009-11-28 12:49 |只看該作者
請大家?guī)兔纯,給點(diǎn)意見?纯从惺裁吹胤叫枰倪M(jìn)?

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2009-11-28 12:50 |只看該作者
牛X

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2009-11-28 15:29 |只看該作者
這就是 5.10 的新語法了吧,記得看過一些介紹的,確實(shí)不習(xí)慣啊,Perl6似乎也這樣子了,不過應(yīng)該是沒有放棄以前的語法吧,考慮是不是得花時間關(guān)注下才是~

看了lz的代碼了,提個需求:平時的 棋類游戲 很少有敲坐標(biāo)下子的,一般都是一個光標(biāo)移到后,空格確認(rèn)后落子,這樣子更人性化一點(diǎn)
不過這個需求會很麻煩就是了,readline 就不行了, readkey 如果要處理 方向鍵更麻煩,當(dāng)然 wasd 四個鍵替代也不錯,期待lz的下一個版本~

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2009-11-30 01:02 |只看該作者
原帖由 dugu072_cu 于 2009-11-28 15:29 發(fā)表
這就是 5.10 的新語法了吧,記得看過一些介紹的,確實(shí)不習(xí)慣啊,Perl6似乎也這樣子了,不過應(yīng)該是沒有放棄以前的語法吧,考慮是不是得花時間關(guān)注下才是~

看了lz的代碼了,提個需求:平時的 棋類游戲 很少有 ...

感謝您的意見。不過從命令行中獲取光標(biāo)這種事不知道 perl 能否做到?

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2009-11-30 08:11 |只看該作者
windows 有 Win32::Console
其他平臺 有 Term::ANSIScreen

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2009-12-01 16:49 |只看該作者
超級牛x的‘小白菜’呀。。。。

-_-|||

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2010-01-25 21:09 |只看該作者
呵呵,有意思的,下了一盤很不錯。

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2010-01-26 09:13 |只看該作者
贊一個,這哪是初學(xué)水平啊。

建議用GUI界面,PERL是能做到的!

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2010-01-26 09:30 |只看該作者
同樣是新手,差距就這么大呢
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP