Programando com o MIOLO

Tutorial – O jogo “Hangman”

Neste tutorial apresentamos uma aplicação mais completa usando o MIOLO, fazendo uso de formulários, controles, eventos e manutenção de estado entre round-trips. Se você não leu o tutorial “Hello World!”, leia-o antes deste.

Passo 1 – Estrutura do módulo Hangman

Criar o diretório “hangman” dentro do diretório <miolo>/modules

Criar o diretório “etc” dentro do diretório <miolo>/modules/hangman

Criar o diretório “handlers” dentro do diretório <miolo>/modules/hangman

Criar o diretório “forms” dentro do diretório <miolo>/modules/hangman

Criar o diretório “html” dentro do diretório <miolo>/modules/hangman

Criar o diretório “images” dentro do diretório <miolo>/modules/hangman/html

Passo 2 – Arquivo de configuração do módulo

Criar o arquivo “module.conf” dentro do diretório <miolo>/modules/hangman/etc, com o seguinte conteúdo:

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>

<conf>

<options>

<startup>hangman</startup>

</options>

<theme>

<module>miolo</module>

<main>clean</main>

<lookup></lookup>

<title>Miolo – Hangman Game</title>

</theme>

</conf>

Passo 3 – Copiar arquivos do usados pelo módulo

Copiar o arquivo <miolo>/modules/turoial3/html/files/words.txt para <miolo>/modules/hangman/etc

Copiar o arquivo <miolo>/modules/turoial3/html/images/hangman.png para <miolo>/modules/hangman/html/images

Passo 4 – Classe Handler

Criar o arquivo “handler.class” dentro do diretório <miolo>/modules/hangman/handlers, com o seguinte conteúdo:

<?php

class HandlerHangman extends Handler

{

}

?>

Passo 5 – Handler principal

Criar o arquivo “main.inc” dentro do diretório <miolo>/modules/hangman/handlers, com o seguinte conteúdo:

<?

$ui = $MIOLO->GetUI();

$form = $ui->GetForm('hangman','frmMain');

$theme->SetContent($form);

?>

Passo 6 – Criar o formulário principal

Criar o arquivo “frmMain.class” dentro do diretório <miolo>/modules/hangman/forms, com o seguinte conteúdo:

<?

1: class frmMain extends Form

2: {

3: const FACIL = 10;

4:	const MEDIO = 5;

5:	const DIFICIL = 3;

6:

7: function __construct()

8: {

9: parent::__construct('Hangman Game!');

10: $this->SetIcon($this->manager->GetUI()->GetImage('hangman','hangman.png'));

11: $this->SetFormCSS(0,470,0,0,0,'relative');

12: $this->EventHandler();

13: }

14:

15: function CreateFields()

16: {

17: $options = array(

18: new RadioButton('level','1','',true,'Fácil. Você pode errar 10 vezes.'),

19: new RadioButton('level','2','',false,'Médio. Você pode errar 5 vezes.'),

20: new RadioButton('level','3','',false,'Difícil. Você pode errar 3 vezes.')

21: );

22: $link = $this->manager->GetCurrentURL();

23: $guesses = $this->GetGuessLetters();

24: for ($letter = 65; $letter <= 90; ++$letter)

25: {

26: $char = chr($letter);

27: $letters[] = $button = new LinkButton("guess$char", $char, $link);

28: $button->AttachEventHandler('click','OnLetterClick',$char);

29: if (strpos($guesses,$char,$pos) !== false)

30: {

31: $button->color = 'gray';

32: }

33: }

34: $level = array(

35: new RadioButtonGroup('levelGroup','', $options,'1', 'vertical','none'),

36: new MButton('btnPlay', 'Jogar!')

37: );

38: $guess = array(

39: new TextHeader('choice','1','Escolha uma letra:'),

40: new Text('guessWord',''),

41: new Spacer('20px'),

42: new Text('guessErrors',''),

43: new LinkButtonGroup('letters','',$letters,'horizontal','none'),

44: new LinkButton('giveUp','Desistir?',$link)

45: );

46: $finished = array(

47: new TextHeader('finished','1',''),

48: new Text('word',''),

49: new Spacer('20px'),

50: new LinkButton('again','Jogar novamente?',$link)

51: );

52: $fields = array(

53: new Label('Você deve descobrir a palavra, escolhendo uma letra de cada

vez. Se você errar acima do limite, você perde!'),

54: new BaseGroup('choiceGroup','Escolha o nível', $level, 'vertical','css'),

55: new BaseGroup('guessGroup','', $guess, 'vertical','css'),

56: new BaseGroup('finishedGroup','', $finished, 'vertical','css')

57: );

58: $this->SetFields($fields);

59: $this->btnPlay->attachEventHandler('click','OnBtnPlayClick');

60: $this->giveUp->attachEventHandler('click','OnFinished','lose');

61: $this->SetStatus('level');

62: $this->defaultButton = false;

63: }

64:

65: function SetLevel($level)

66: {

67: switch ($level)

68: {

69: case '1': $this->page->SetViewState('level',self::FACIL); break;

70: case '2': $this->page->SetViewState('level',self::MEDIO); break;

71: case '3': $this->page->SetViewState('level',self::DIFICIL); break;

72: }

73: }

74:

75: function GetLevel()

76: {

77: return $this->page->GetViewState('level');

78: }

79:

80: function SetErrors($errors)

81: {

82: $this->page->SetViewState('errors', $errors);

83: }

84:

85: function GetErrors()

86: {

87: return $this->page->GetViewState('errors');

88: }

89:

90: function SetStatus($status)

91: {

92: $this->SetFieldAttr('choiceGroup','visible', ($status == 'level'));

93: $this->SetFieldAttr('guessGroup','visible', ($status == 'play'));

94: $this->SetFieldAttr('finishedGroup','visible', ($status == 'finished'));

95: }

96:

97: function SetWord($word)

98: {

99: $this->page->SetViewState('secretword', $word);

100: }

101:

102: function GetWord()

103: {

104: return $this->page->GetViewState('secretword');

105: }

106:

107: function SetGuessWord($guessWord)

108: {

109: $this->page->SetViewState('guessword', $guessWord);

110: for($i = 0, $w = ''; $i < strlen($guessWord); $w .= $guessWord{$i} .

'&nbsp;', $i++);

111:	$this->SetFieldValue('guessWord', $w);

112: }

113:

114: function GetGuessWord()

115: {

116: return $this->page->GetViewState('guessword');

117: }

118:

119: function SetGuessLetters($guessLetters)

120: {

121: $this->page->SetViewState('guessletters', $guessLetters);

122: }

123:

124: function GetGuessLetters()

125: {

126: return $this->page->GetViewState('guessletters');

127: }

128:

129: function SetGuessErrors()

130: {

131: $this->SetFieldValue('guessErrors','Você tem ' . $this->GetErrors() .

' erros em um máximo de ' . $this->GetLevel() . '.');

132: }

133:

134: function OnBtnPlayClick($sender)

135: {

136: $level = $this->levelGroup->GetValue();

137: $this->setLevel($level);

138: $file = $this->manager->GetModulePath('hangman','etc/words.txt');

139: $words = preg_split("/[\s,]+/",file_get_contents($file));

140: do

141: {

142: $i = rand(0,count($words)-1);

143: $word = $words[$i];

144: } while(strlen($word)<5 || !preg_match('/^[a-z]*$/i',$word));

145: $word=strtoupper($word);

146: $guessWord = str_repeat('_',strlen($word));

147: $this->SetGuessWord($guessWord);

148: $this->SetErrors(0);

149:	$this->SetWord($word);

150: $this->SetGuessErrors();

151: $this->SetGuessLetters('');

152: $this->SetStatus('play');

153: }

154:

155: function OnLetterClick($sender, $param)

156: {

157: $sender->color = 'blue';

158: $letter = $param;

159: $this->SetGuessLetters($this->GetGuessLetters() . $letter);

160: $word = $this->GetWord();

161: $guessWord = $this->GetGuessWord();

162: $this->SetStatus('play');

163: $pos = 0;

164: $success = false;

165: while (($pos = strpos($word,$letter,$pos)) !== false)

166: {

167: $guessWord{$pos} = $letter;

168: $success = true;

169: $pos++;

170: }

171: $this->SetGuessWord($guessWord);

172: if ($success)

173: {

174: if ($guessWord === $word)

175: {

176: $this->OnFinished(null,'win');

177: }

178: }

179: else

180: {

181: $errors = $this->GetErrors() + 1;

182: $this->SetErrors($errors);

183: if ($errors >= $this->GetLevel())

184: $this->OnFinished(null,'lose');

185: }

186: $this->SetGuessErrors();

187: }

188:

189: function OnFinished($sender, $param)

190: {

191: $this->SetGuessLetters('');

192: $this->SetFieldValue('word', 'A palavra era: ' . $this->GetWord());

193: $this->SetFieldValue('finished', ($param == 'lose') ? 'Você perdeu!' :

'Você ganhou!');

194: $this->SetStatus('finished');

195: }

196: }

?>

Programando com o MIOLO

Shimoda

2005-01-15T16:12:00

Vilson Gartner