1
0
www.mikescher.com/demos/hangman/protected/controllers/GameController.php

222 lines
5.1 KiB
PHP

<?php
/**
* GameController class file.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @link http://www.yiiframework.com/
* @copyright 2008-2013 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
/**
* GameController implements the {@link http://en.wikipedia.org/wiki/Hangman_(game) Hangman game}.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @version $Id: CController.php 131 2008-11-02 01:32:57Z qiang.xue $
* @package demos.hangman
* @since 1.0
*/
class GameController extends CController
{
/**
* @var string sets the default action to be 'play'
*/
public $defaultAction='play';
/**
* The 'play' action.
* In this action, users are asked to choose a difficulty level
* of the game.
*/
public function actionPlay()
{
static $levels=array(
'10'=>'Easy game; you are allowed 10 misses.',
'5'=>'Medium game; you are allowed 5 misses.',
'3'=>'Hard game; you are allowed 3 misses.',
);
// if a difficulty level is correctly chosen
if(isset($_POST['level']) && isset($levels[$_POST['level']]))
{
$this->word=$this->generateWord();
$this->guessWord=str_repeat('_',strlen($this->word));
$this->level=$_POST['level'];
$this->misses=0;
$this->setPageState('guessed',null);
// show the guess page
$this->render('guess');
}
else
{
$params=array(
'levels'=>$levels,
// if this is a POST request, it means the level is not chosen
'error'=>Yii::app()->request->isPostRequest,
);
// show the difficulty level page
$this->render('play',$params);
}
}
/**
* The 'guess' action.
* This action is invoked each time when the user makes a guess.
*/
public function actionGuess()
{
// check to see if the letter is guessed correctly
if(isset($_GET['g'][0]) && ($result=$this->guess($_GET['g'][0]))!==null)
$this->render($result ? 'win' : 'lose');
else // the letter is guessed correctly, but not win yet
{
$guessed=$this->getPageState('guessed',array());
$guessed[$_GET['g'][0]]=true;
$this->setPageState('guessed',$guessed,array());
$this->render('guess');
}
}
/**
* The 'guess' action.
* This action is invoked when the user gives up the game.
*/
public function actionGiveup()
{
$this->render('lose');
}
/**
* Checks to see if a letter is already guessed.
* @param string the letter
* @return boolean whether the letter is already guessed.
*/
public function isGuessed($letter)
{
$guessed=$this->getPageState('guessed',array());
return isset($guessed[$letter]);
}
/**
* Generates a word to be guessed.
* @return string the word to be guessed
*/
protected function generateWord()
{
$wordFile=dirname(__FILE__).'/words.txt';
$words=preg_split("/[\s,]+/",file_get_contents($wordFile));
do
{
$i=rand(0,count($words)-1);
$word=$words[$i];
} while(strlen($word)<5 || !ctype_alpha($word));
return strtoupper($word);
}
/**
* Checks to see if a letter is guessed correctly.
* @param string the letter
* @return mixed true if the word is guessed correctly, false
* if the user has used up all guesses and the word is guessed
* incorrectly, and null if the letter is guessed correctly but
* the whole word is guessed correctly yet.
*/
protected function guess($letter)
{
$word=$this->word;
$guessWord=$this->guessWord;
$pos=0;
$success=false;
while(($pos=strpos($word,$letter,$pos))!==false)
{
$guessWord[$pos]=$letter;
$success=true;
$pos++;
}
if($success)
{
$this->guessWord=$guessWord;
if($guessWord===$word)
return true;
}
else
{
$this->misses++;
if($this->misses>=$this->level)
return false;
}
}
/**
* @return integer the difficulty level. This value is persistent
* during the whole game session.
*/
public function getLevel()
{
return $this->getPageState('level');
}
/**
* @param integer the difficulty level. This value is persistent
* during the whole game session.
*/
public function setLevel($value)
{
$this->setPageState('level',$value);
}
/**
* @return string the word to be guessed. This value is persistent
* during the whole game session.
*/
public function getWord()
{
return $this->getPageState('word');
}
/**
* @param string the word to be guessed. This value is persistent
* during the whole game session.
*/
public function setWord($value)
{
$this->setPageState('word',$value);
}
/**
* @return string the word being guessed. This value is persistent
* during the whole game session.
*/
public function getGuessWord()
{
return $this->getPageState('guessWord');
}
/**
* @param string the word being guessed. This value is persistent
* during the whole game session.
*/
public function setGuessWord($value)
{
$this->setPageState('guessWord',$value);
}
/**
* @return integer the number of misses. This value is persistent
* during the whole game session.
*/
public function getMisses()
{
return $this->getPageState('misses');
}
/**
* @param integer the number of misses. This value is persistent
* during the whole game session.
*/
public function setMisses($value)
{
$this->setPageState('misses',$value);
}
}