import java.applet.Applet; import java.awt.event.*; import java.awt.*; import java.io.*; interface SequenceCallback { public void seq_badChar(); public void seq_accept( boolean finish ); } class CodeSequence implements KeyListener { char [] sequence; int seq_index; private SequenceCallback cb; public CodeSequence( SequenceCallback cb ) { this.cb = cb; } public void keyPressed( KeyEvent e ) { if ( e.getKeyChar() == sequence[seq_index] ) { seq_index++; if ( sequence.length == seq_index ) { cb.seq_accept(true); } else { cb.seq_accept(false); } } else { cb.seq_badChar(); } } public void keyReleased( KeyEvent e ) {} public void keyTyped( KeyEvent e ) {} public int getRestLength() { return sequence.length - seq_index; } public void reInit( char [] seq ) { sequence = seq; seq_index = 0; } public int len_all( FontMetrics fm ) { return fm.charsWidth( sequence, 0, sequence.length ); } public int len_finished( FontMetrics fm ) { return fm.charsWidth( sequence, 0, seq_index ); } } class TypeWord { String word; char [] sequence; TypeWord( String word, String seq ) { this.word = word; this.sequence = seq.toCharArray(); } } public class AhoType extends Applet implements SequenceCallback { CodeSequence seq = new CodeSequence(this); String now_word; static final int MES_Y = 100; static final int SEQ_Y = 110; static final int WORD_NUM = 16; int word_idx = 0; TypeWord [] words; Color fg_m = Color.black, fg_s = Color.blue, bg = Color.white; boolean all_finish = false; public AhoType() {} public void makeWords() { words = new TypeWord[WORD_NUM]; words[0] = new TypeWord("クッキー(cookie)","kukki-"); words[1] = new TypeWord("リスト(list)","risuto"); words[2] = new TypeWord("リンクトリスト(linked list)","rinnkutorisuto"); words[3] = new TypeWord("ランゲージ(language)","rannge-ji"); words[4] = new TypeWord("ハッシュテーブル(hash table)","hasshute-buru"); words[5] = new TypeWord("U.S.A","yu-esue-"); words[6] = new TypeWord("ジャバ(JAVA)","jaba"); words[7] = new TypeWord("エクステンズ(extends)","ekusutennzu"); words[8] = new TypeWord("インプリメンツ(implements)","innpurimenntsu"); words[9] = new TypeWord("ゲットグラフィクス(getGraphics)","gettogurafikusu"); words[10] = new TypeWord("ストリングバッファドインプットストリーム(StringBufferedInputStream)","sutoringubaffadoinputtosutori-mu"); words[11] = new TypeWord("喜連瓜破","kireuriwari"); words[12] = new TypeWord("瓜生堂","uryuudou"); words[13] = new TypeWord("放出","houshutsu"); words[14] = new TypeWord("pneumonoultramicroscopicsilicovolcanoconiosis","pneumonoultramicroscopicsilicovolcanoconiosis"); words[15] = new TypeWord("llanfairpwllgwyngyllgogerychwyrndrobwyll-llantysiliogogogoch","llanfairpwllgwyngyllgogerychwyrndrobwyll-llantysiliogogogoch"); } public void init() { makeWords(); seq.reInit( words[0].sequence ); now_word = words[0].word; addKeyListener( seq ); } public void paint( Graphics g ) { int center = getWidth()/2; FontMetrics fm; if ( all_finish ) { String end = "終了"; fm = g.getFontMetrics(); g.drawString( end, center-fm.stringWidth(end)/2 , MES_Y ); return; } fm = g.getFontMetrics(); g.setColor(bg); g.fillRect( 0, 0, getWidth(), getHeight() ); fm = g.getFontMetrics(); g.setColor(fg_m); g.drawString( now_word, center - (fm.stringWidth(now_word)/2), MES_Y ); int seq_start = center - seq.len_all(fm)/2; g.setColor(fg_s); g.drawChars( seq.sequence, seq.seq_index, seq.getRestLength(), seq_start + seq.len_finished(fm), MES_Y+fm.getHeight()+2 ); } public void seq_badChar() {} public void seq_accept( boolean finish ) { repaint(); if ( finish ) { word_idx++; if ( word_idx >= WORD_NUM ) { removeKeyListener( seq ); all_finish = true; } else { seq.reInit( words[word_idx].sequence ); now_word = words[word_idx].word; } } } }