C#游戏编程:《控制台小游戏系列》之《七、键盘熟练工实例》
一、游戏分析 相信大家对金山打字通、打字精灵等打字软件非常熟悉,想当年刚接触计算机时还靠它们的打字游戏练习打字基本功。这章的游戏DEMO就是一个打字小游戏,当然,它很简单,只是A~Z字母的打字练习小游戏。游戏的设计也不复杂,游戏开始时先初始化下落字母的个数和每次下落字母的概率,随着时间的进行,字母会从界面上方逐渐下落到界面底下,在这过程中你需要敲击键盘上与界面下落的字母相对应的键位,如果键位的字母与下落的字母一致,则记录打字正确数量,否则不记录,无论如何,敲击一次键盘记录一下敲击键盘数,当字母下落到界面底下时,字母停止下落,该字母被视为无效,相应地,也记录一次敲击数。正确率、敲击数等信息会在界面上显示,游戏还有倒计时,时间一到则被视为游戏结束。
二、游戏实现 先定义一个字母表,字母表的实现为: ///LetterTable类实现using System;using CEngine;using CGraphics;namespace Typing{ internal class Letter { /// <summary> /// 字母 /// </summary> private String m_letter; /// <summary> /// 字母码 /// </summary> private Int32 m_code; /// <summary> /// 字母背景色 /// </summary> private ConsoleColor m_backcolor; /// <summary> /// 字母前景色 /// </summary> private ConsoleColor m_fontcolor; /// <summary> /// 字母活动情况 /// </summary> private Boolean m_bAlive; /// <summary> /// 字母窗体位置 /// </summary> private CPoint m_position; /// <summary> /// 随机数 /// </summary> private static Random m_random = new Random(); /// <summary> /// 构造函数 /// </summary> public Letter() { } public String getLetter() { return this.m_letter; } public void setLetter(String letter) { this.m_letter = letter; } public Int32 getCode() { return this.m_code; } public void setCode(Int32 code) { this.m_code = code; } public Char getChar() { return (Char)this.m_code; } public ConsoleColor getBackcolor() { return this.m_backcolor; } public ConsoleColor getFontcolor() { return this.m_fontcolor; } public void setBackcolor(ConsoleColor color) { this.m_backcolor = color; } public void setFontcolor(ConsoleColor color) { this.m_fontcolor = color; } public Boolean getAlive() { return m_bAlive; } public void setAlive(Boolean bAlive) { this.m_bAlive = bAlive; } public CPoint getPosition() { return this.m_position; } public void setPosition(CPoint point) { this.m_position = point; } public void setPosition(Int32 x, Int32 y) { this.m_position.setX(x); this.m_position.setY(y); } /// <summary> /// 随机得到一个字母 /// </summary> public void newLetter() { setLetter(LetterTable.getLetter(m_random.Next(0, 26))); setCode(LetterTable.getLetterCode(getLetter())); setBackcolor((ConsoleColor)m_random.Next(0, 16)); setFontcolor((ConsoleColor)(15 - (Int32)getBackcolor())); setPosition(m_random.Next(1, 30), -1); setAlive(false); } /// <summary> /// 绘制字母 /// </summary> /// <param name="draw"></param> public void draw(CDraw draw) { if (m_bAlive) { draw.setBackcolor(this.m_backcolor); draw.drawText(m_letter, m_position.getX(), m_position.getY(), 1, 1, this.m_fontcolor); } draw.setDrawSymbol(CSymbol.DEFAULT); draw.fillRect(m_position.getX(), m_position.getY() - 1, 1, 1, ConsoleColor.Black); } }} 定义一个字母管理类,用于管理所有下落的字母和配置字母的下落个数和每次下落字母的数量,字母管理类定义为:///LetterManager类实现
试玩链接:http://download.csdn.net/detail/hwenycocodq520/4630387四、结语 实话说,这个游戏DEMO实现得比较仓促,代码写得比较凌乱,但都是些简单的逻辑,相信大家都能看得明白。
- 3楼conmajia2小时前
- 前排占座学习。
- 2楼Joyhen2小时前
- 非常好的例子,可延伸
- 1楼chb345536638昨天 22:43
- 围观学习
using System;using CEngine;using CGraphics;namespace Typing{ internal class Letter { /// <summary> /// 字母 /// </summary> private String m_letter; /// <summary> /// 字母码 /// </summary> private Int32 m_code; /// <summary> /// 字母背景色 /// </summary> private ConsoleColor m_backcolor; /// <summary> /// 字母前景色 /// </summary> private ConsoleColor m_fontcolor; /// <summary> /// 字母活动情况 /// </summary> private Boolean m_bAlive; /// <summary> /// 字母窗体位置 /// </summary> private CPoint m_position; /// <summary> /// 随机数 /// </summary> private static Random m_random = new Random(); /// <summary> /// 构造函数 /// </summary> public Letter() { } public String getLetter() { return this.m_letter; } public void setLetter(String letter) { this.m_letter = letter; } public Int32 getCode() { return this.m_code; } public void setCode(Int32 code) { this.m_code = code; } public Char getChar() { return (Char)this.m_code; } public ConsoleColor getBackcolor() { return this.m_backcolor; } public ConsoleColor getFontcolor() { return this.m_fontcolor; } public void setBackcolor(ConsoleColor color) { this.m_backcolor = color; } public void setFontcolor(ConsoleColor color) { this.m_fontcolor = color; } public Boolean getAlive() { return m_bAlive; } public void setAlive(Boolean bAlive) { this.m_bAlive = bAlive; } public CPoint getPosition() { return this.m_position; } public void setPosition(CPoint point) { this.m_position = point; } public void setPosition(Int32 x, Int32 y) { this.m_position.setX(x); this.m_position.setY(y); } /// <summary> /// 随机得到一个字母 /// </summary> public void newLetter() { setLetter(LetterTable.getLetter(m_random.Next(0, 26))); setCode(LetterTable.getLetterCode(getLetter())); setBackcolor((ConsoleColor)m_random.Next(0, 16)); setFontcolor((ConsoleColor)(15 - (Int32)getBackcolor())); setPosition(m_random.Next(1, 30), -1); setAlive(false); } /// <summary> /// 绘制字母 /// </summary> /// <param name="draw"></param> public void draw(CDraw draw) { if (m_bAlive) { draw.setBackcolor(this.m_backcolor); draw.drawText(m_letter, m_position.getX(), m_position.getY(), 1, 1, this.m_fontcolor); } draw.setDrawSymbol(CSymbol.DEFAULT); draw.fillRect(m_position.getX(), m_position.getY() - 1, 1, 1, ConsoleColor.Black); } }} 定义一个字母管理类,用于管理所有下落的字母和配置字母的下落个数和每次下落字母的数量,字母管理类定义为:///LetterManager类实现
试玩链接:http://download.csdn.net/detail/hwenycocodq520/4630387四、结语 实话说,这个游戏DEMO实现得比较仓促,代码写得比较凌乱,但都是些简单的逻辑,相信大家都能看得明白。
- 3楼conmajia2小时前
- 前排占座学习。
- 2楼Joyhen2小时前
- 非常好的例子,可延伸
- 1楼chb345536638昨天 22:43
- 围观学习