PHP+Gtk实例(求24点)

dafenqi
2023-08-28 / 0 评论 / 13 阅读 / 正在检测是否收录...

PHP+Gtk实例(求24点)

最近要安排我为BIT提供的《PHP高级应用--关于PHP你不知道的》一门课的讲课素材, 其中有部分涉及到PHP和Gtk2开发桌面应用的部分, 于是抽空就想写一了一个demo出来.
这是一个经典的求24的算法的PHP实现, 加上了Gtk2的界面, 其实也没什么复杂的, 和MFC开发没什么太大的区别, 唯一的不爽, 就是要自己用代码来写布局。。。
有兴趣的同学可以看看.
后记: 这里有一个网页版的, 可以用来玩玩: http://www.laruence.com/stashes/compute.php

运行截图

完整源代码(PHP-Gtk example):

  <?php
/**
 * A 24 maker
 * @version 1.0.0
 * @author laruence<laruence at yahoo.com.cn>
 * @copyright (c) 2009 http://www.laruence.com
 */
class TwentyFourCal extends GtkWindow {
     private $chalkboard;
     private $inputs;
     public  $needle = 24;
     public  $precision = '1e-6';
     function TwentyFourCal() {
          parent::__construct();
          $this->draw();
          $this->show();
     }
     /**
      * 画窗体方法
      */
     public function draw() {
          $this->set_default_size(200, 200);
          $this->set_title("24计算器");
          $mesg   = new GtkLabel('Please input 4 integer(0-99):');
          $this->chalkboard = new GtkLabel();
          $this->inputs = $inputs = array(
               new GtkEntry(),
               new GtkEntry(),
               new GtkEntry(),
               new GtkEntry()
          );
          /**
           * container
           */
          $table = new GtkTable(4, 1, 0);
          $layout = array(
               'left'  => 0,
               'right' => 1,
               'top'     => 0,
               'bottom' => 1,
          );
          $vBox = new GtkVBox(false, true);
          $vBox->pack_start($mesg);
          foreach ( $inputs as $input ) {
               $input->set_max_length(2);
               $table->attach($input, $layout['left'], $layout['right'],
                    $layout['top']++, $layout['bottom']++);
          }
          $vBox->pack_start($table);
          $button = new GtkButton("Calculate");
          $button->connect("clicked", array($this, "calculate"));
          $vBox->pack_start($this->chalkboard);
          $vBox->pack_start($button, true, false);
          $this->add($vBox);
     }
     public function show() {
          $this->show_all();    // 显示窗体
     }
     private function notice($mesg) {
          $this->chalkboard->set_text($mesg);
     }
     /**
      * 取得用户输入方法
      */
     public function calculate() {
          $operants = array();
          $inputs   = $this->inputs;
          foreach ($inputs as $input) {
               $number = $input->get_text();
               if (!preg_match('/^\s*\d+\s*$/', $number)) {
                    $this->notice('pleas input for integer(0-99)');
                    return ;
               }
               array_push($operants, $number);
          }
          $length = count($operants);
          try {
               $this->search($operants, 4);
          } catch (Exception $e) {
               $this->notice($e->getMessage());
               return;
          }
          $this->notice('can\'t compute!');
          return;
     }
     /**
      * 求24点算法PHP实现
      */
     private function search($expressions, $level) {
          if ($level == 1) {
               $result = 'return ' . $expressions[0] . ';';
               if ( abs(eval($result) - $this->needle) <= $this->precision) {
                    throw new Exception($expressions[0]);
               }
          }
          for ($i=0;$i<$level;$i++) {
               for ($j=$i+1;$j<$level;$j++) {
                    $expLeft  = $expressions[$i];
                    $expRight = $expressions[$j];
                    $expressions[$j] = $expressions[$level - 1];
                    $expressions[$i] = '(' . $expLeft . ' + ' . $expRight . ')';
                    $this->search($expressions, $level - 1);
                    $expressions[$i] = '(' . $expLeft . ' * ' . $expRight . ')';
                    $this->search($expressions, $level - 1);
                    $expressions[$i] = '(' . $expLeft . ' - ' . $expRight . ')';
                    $this->search($expressions, $level - 1);
                    $expressions[$i] = '(' . $expRight . ' - ' . $expLeft . ')';
                    $this->search($expressions, $level - 1);
                    if ($expLeft != 0) {
                         $expressions[$i] = '(' . $expRight . ' / ' . $expLeft . ')';
                         $this->search($expressions, $level - 1);
                    }
                    if ($expRight != 0) {
                         $expressions[$i] = '(' . $expLeft . ' / ' . $expRight . ')';
                         $this->search($expressions, $level - 1);
                    }
                    $expressions[$i] = $expLeft;
                    $expressions[$j] = $expRight;
               }
          }
          return false;
     }
     function __destruct() {
          Gtk::main_quit();
     }
}
new TwentyFourCal();
Gtk::main();    //进入GTK主循环
?>

GTK1的API Reference : http://gtk.php.net/manual/en/gtk.gtkentry.php
GTK2的API Reference: 很不完整

0

Deprecated: strtolower(): Passing null to parameter #1 ($string) of type string is deprecated in /www/wwwroot/testblog.58heshihu.com/var/Widget/Archive.php on line 1032

评论 (0)

取消