当前位置:首页 > PHP教程 > php应用 > 列表

PHP实现猜数游戏

发布:smiling 来源: PHP粉丝网  添加日期:2022-04-07 08:26:44 浏览: 评论:0 

本文实例为大家分享了PHP实现猜数游戏的具体代码,供大家参考,具体内容如下

猜数游戏有两种玩法:

第一种:两个人玩,一方出数字,一方猜。出数字的人要想好一个指定位数的数,数字可重复,不能让猜的人知道。

猜的人就可以开始猜。每猜一个数,出数者就要说大过或小过出的数。

第二种:两个人玩,一方出数字,一方猜。出数字的人要先想好一个没有重复数字的4位数,不能让猜的人知道。猜的人就可以开始猜。每猜一个数,出数者就要根据这个数字给出几A几B,其中A前面的数字表示位置正确的数的个数,而B前的数字表示数字正确而位置不对的数的个数。如正确答案为5234,而猜的人猜5346,则是1A2B,其中有一个5的位置对了,记为1A,而3和4这两个数字对了,而位置没对,因此记为2B,合起来就是1A2B。接着猜的人再根据出题者的几A几B继续猜,直到猜中为止。

下面是PHP代码实现:

  1. <?php 
  2. // 标准输入流和标准输出流 
  3. $stdin = null; 
  4. $stdout = null; 
  5.    
  6. /** 
  7.  * 初始化 IO 流 
  8.  */ 
  9. function init() { 
  10.  global $stdin; 
  11.  global $stdout; 
  12.    
  13.  $stdin = fopen('php://stdin', 'r'); 
  14.  $stdout = fopen('php://stdout', 'w'); 
  15. } 
  16.    
  17. /** 
  18.  * 关闭 IO 流 
  19.  */ 
  20. function destroy() { 
  21.  global $stdin; 
  22.  global $stdout; 
  23.    
  24.  if(is_resource($stdin)) { 
  25.  fclose($stdin); 
  26.  } 
  27.  if(is_resource($stdout)) { 
  28.  fclose($stdout); 
  29.  } 
  30. } 
  31.    
  32. /** 
  33.  * 从命令行读取一行数据 
  34.  */ 
  35. function read() { 
  36.  global $stdin; 
  37.    
  38.  $line = fgets($stdin); 
  39.  return trim($line, PHP_EOL); //去除换行符 
  40. } 
  41.    
  42. /** 
  43.  * 向命令行输出一行数据 
  44.  */ 
  45. function write($line) { 
  46.  global $stdout; 
  47.  // 转换编码 
  48.  if(stripos(PHP_OS, 'winnt') !== false) { 
  49.  $line = iconv('UTF-8', 'GBK', $line); 
  50.  } 
  51.  fwrite($stdout, $line . PHP_EOL); 
  52. } 
  53.    
  54. /** 
  55.  * 第一种玩法 
  56.  * @param $count 位数 
  57.  */ 
  58. function guess_the_number($count = 2) { 
  59.  // 随机生成一个 $count 位数 
  60.  $min = pow(10, $count - 1); 
  61.  $max = pow(10, $count) - 1; 
  62.  $number = rand($min, $max); 
  63.  init(); 
  64.  while(1) { 
  65.  write(sprintf('Please input your number (%s-bit digit), q or quit exit: ', $count)); 
  66.  $readStr = read(); 
  67.  // exit program 
  68.  if($readStr == 'q' || $readStr == 'quit') { 
  69.  break; 
  70.  } 
  71.  $readInt = intval($readStr); 
  72.  if($readInt > $number) { 
  73.  write('大了'); 
  74.  } else if($readInt < $number) { 
  75.  write('小了'); 
  76.  } else { 
  77.  write('恭喜你,猜对了!'); 
  78.  write('Input c continue to play'); 
  79.  $readStr = read(); 
  80.  if($readStr == 'c' || $readStr == 'continue') { 
  81.  $number = rand($min, $max); 
  82.  } else {  
  83.  break ; 
  84.  } 
  85.  } 
  86.  } 
  87.  destroy(); 
  88. } 
  89.    
  90. /** 
  91.  * 得到一个没有重复数字的四位数 
  92.  */ 
  93. function getRandNumber() { 
  94.  $num = rand(1, 9); 
  95.  $array = array_diff(array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), [$num]); 
  96.  shuffle($array); 
  97.  $subarr = array_slice($array, 0, 3); //再取 3 个数字 
  98.  $str = implode('', array_merge([$num], $subarr)); 
  99.  return intval($str); 
  100. } 
  101.    
  102. /** 
  103.  * 第二种玩法 
  104.  */ 
  105. function guess_the_number2() { 
  106.  $number = getRandNumber(); 
  107.  $len = 4; //四位数 
  108.  init(); 
  109.  while(1) { 
  110.  write(sprintf('Please input your number (%s-bit digit), q or quit exit: ', $len)); 
  111.  $readStr = read(); 
  112.  // exit program 
  113.  if($readStr == 'q' || $readStr == 'quit') { 
  114.  break; 
  115.  } 
  116.  $readInt = intval($readStr); 
  117.  if($readInt == $number) { 
  118.  write('恭喜你,猜对了!'); 
  119.  write('Input c continue to play'); 
  120.  $readStr = read(); 
  121.  if($readStr == 'c' || $readStr == 'continue') { 
  122.  $number = getRandNumber(); 
  123.  } else {  
  124.  break ; 
  125.  } 
  126.  } else { 
  127.  // 判断 几A几B 
  128.  $readInt = str_pad($readInt, $len, '0', STR_PAD_LEFT); //不足四位的补足四位 
  129.  $number = strval($number); 
  130.  $readArr = str_split($readInt, 1); // cast to array 
  131.  $numArr = str_split($number, 1); 
  132.  $aval = 0; // 几A 
  133.  $bval = 0; // 几B 
  134.  for($i = 0; $i < $len; $i++) { 
  135.  if($readArr[$i] == $numArr[$i]) { 
  136.  $aval++; 
  137.  unset($readArr[$i], $numArr[$i]); 
  138.  } 
  139.  } 
  140.  $bval = count(array_intersect($readArr, $numArr)); 
  141.  write(sprintf('%sA%sB', $aval, $bval)); 
  142.  } 
  143.  } 
  144.  destroy(); 
  145. } 
  146.    
  147. if(PHP_SAPI == 'cli') { 
  148.  // guess_the_number(1); 
  149.  guess_the_number2(); 
  150. } else { 
  151.  echo 'Please run under command line!'; 
  152.  exit; 
  153. }

Tags: PHP猜数游戏

分享到: