游戏介绍:游戏开始运行后,会不断有英文字母从窗体出现并往下掉落,玩家通过按下键盘上相应的字母键,可以将正在掉落的字母消除掉,如果任由字母掉落在窗体下方所绘制的“地面”上,玩家会受到“伤害”,受伤次数达到5次则游戏结束。

游戏实现:

  1. 完成菜单函数;
  2. 菜单项切换及绘制地面;
  3. 显示血槽;
  4. 处理扣血并建立“字母”结构体;
  5. 产生字母的函数;
  6. 字母掉落的设计思想及触地判断;
  7. 处理Game over时的输出内容;
  8. 更新字母坐标及显示得分的函数;
  9. 字母持续掉落的实现;
  10. 按键消除字母;
  11. 完成显示级别的函数;
  12. 主函数循环体。

视频教学链接:https://www.51zxw.net/Show.aspx?cid=717&id=78854。

C++代码:

#include<iostream>
#include<windows.h>
#include<conio.h>
#include<vector>//LetterShower类中要使用向量
#include<time.h>//每次出现的字母具有随机性
//#pragma comment(lib,"winmm.lib")//需要使用PlaySound函数播放音效
using namespace std;HANDLE handle;
COORD crd;
const short GROUND = 27;
const short SCR_WIDTH = 60;
const short HEALTH = 5;class Vitality {//管理生命力的变化
public:Vitality() {vitality = HEALTH;}void ShowVitality() {//显示当前血量crd.X = 36;//SCR_WIDTH*0.6crd.Y = 0;SetConsoleCursorPosition(handle, crd);SetConsoleTextAttribute(handle, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);for (short i = 0; i < HEALTH; i++) {cout << (i < vitality ? "■" : "__");}SetConsoleTextAttribute(handle, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);//恢复成黑底白字}short GetWound(short n=-1) {//扣血vitality += n;ShowVitality();return vitality;}short GetRestore() {//恢复满血vitality = HEALTH;ShowVitality();return vitality;}
private:short vitality;//剩余血量
};Vitality vty;//定义全局变量,在LetterShower类的成员函数中可以访问它struct Letter {char letter;//当前字母short x;//x坐标short y;//y坐标
};class LetterShower {//管理产生字母、字母下落、掉落字母等行为
public:LetterShower() {score = 0;}void GenerateLetter() {//新产生一个字母并进入向量Letter l = { 'A' + rand() % 26, rand() % SCR_WIDTH, 1 };letters[l.letter - 'A'].push_back(l);}short Fall() {//管理字母掉落及触地(往下掉落一个位置)short i;vector<Letter>::iterator itr;for (i = 0; i < 26; i++) {for (itr = letters[i].begin(); itr != letters[i].end(); ) {//若同一字母先后出现在屏幕上不同位置,靠内层循环依次处理//获得字母原来位置坐标,准备输出空格将其擦除crd.X = itr->x;crd.Y = itr->y;SetConsoleCursorPosition(handle, crd);cout << "  ";if (itr->y>=GROUND) {//若已触地,须做扣血处理if (vty.GetWound() <= 0) {crd.X = 13;crd.Y = GROUND + 2;SetConsoleCursorPosition(handle, crd);SetConsoleTextAttribute(handle, BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);cout << "Game Over!";SetConsoleTextAttribute(handle, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);//恢复成黑底白字//PlaySound(".\\Sound\\over.wav", NULL, SND_ASYNC | SND_FILENAME);//音效函数,SND_ASYNC是声音未播放完便可进行接下来的操作,SND_FILENAME是按照文件名指定声音来源return -1;//表明本函数的调用块游戏已结束}itr = letters[i].erase(itr);//血量还有,擦除字母即可,擦除后迭代器会自动自加//PlaySound(".\\Sound\\wound.wav", NULL, SND_ASYNC | SND_FILENAME);continue;//还有下落的字母}itr->y++;crd.Y = itr->y;SetConsoleCursorPosition(handle, crd);cout << itr->letter;itr++;//迭代器没有被擦除的情况}}return 0;//表明尚未Game Over!}void ClearAll() {//清除所有for (short i = 0; i < 26; i++) {while (!letters[i].empty()) {letters[i].pop_back();}}score = 0;}void ShowScore() {//显示得分crd.X = 1;crd.Y = GROUND + 2;SetConsoleCursorPosition(handle, crd);cout << "Score:" << score << "    ";//多输出几个空格 ,避免上一次得分较大,清除不干净}void SetDelay(short d) {delay = d;}void Wait() {Sleep(delay);}void Rain() {//反复执行Fall()函数,字母不断掉落,捕捉用户按键,消除被按中的字母char ch;//保存用户按键信息vector<Letter>::iterator itr;Repeat:while (!_kbhit()) {if (Fall() == -1)return;Wait();if (rand() % 3 == 0)//有三分之一的概率产生新字母GenerateLetter();}ch = _getch();if (ch >= 'a'&&ch <= 'z') {//若按下的不是字母块,不进入循环if (!letters[ch - 'a'].empty()) {itr = letters[ch - 'a'].begin();crd.X = itr->x;crd.Y = itr->y;SetConsoleCursorPosition(handle, crd);cout << "  ";letters[ch - 'a'].erase(itr);//PlaySound();score++;ShowScore();}}goto Repeat;}
private:vector<Letter> letters[26];//建立26个成员的向量数组,下标0~25分别表示A~Z的各种情况short score;//保存得分short delay;//字母掉落时延时的毫秒数
};void PrintLevel(short lv) {//输出难易级别,0~2分别表示EASY、INTERMEDIATE、HARDcrd.X = 4;crd.Y = 0;SetConsoleCursorPosition(handle, crd);switch(lv) {case 0:cout << "Level: EASY";break;case 1:cout << "Level: INTERMEDIATE";break;default:cout << "Level: HARD";break;}
}void Welcome() {crd.X = 17;crd.Y = 10;SetConsoleCursorPosition(handle, crd);cout << "Welcome to Type Game!";crd.X = 17;crd.Y = 12;SetConsoleCursorPosition(handle, crd);cout << "Press any key to continue...";
}short ShowMenu() {system("cls");//清除Welcome()的内容//返回值显示用户所选难度级别,容易0,一般1,困难2crd.X = 10;crd.Y = 10;SetConsoleCursorPosition(handle, crd);cout << "Which level do you want to try?";short result = 0;char ch=0;do {if (ch == 75)//左方向键result = (result + 2) % 3;if (ch == 77)//右方向键result = (result + 1) % 3;crd.X = 10;crd.Y = 12;SetConsoleCursorPosition(handle, crd);//被选中时绿底黑字,未被选中时黑底白字if (result == 0)SetConsoleTextAttribute(handle, BACKGROUND_GREEN);elseSetConsoleTextAttribute(handle, FOREGROUND_GREEN| FOREGROUND_BLUE| FOREGROUND_RED);cout << "EASY";crd.X = 20;crd.Y = 12;SetConsoleCursorPosition(handle, crd);//被选中时绿底黑字,未被选中时黑底白字if (result == 1)SetConsoleTextAttribute(handle, BACKGROUND_GREEN);elseSetConsoleTextAttribute(handle, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED);cout << "INTERMEDIATE";crd.X = 38;crd.Y = 12;SetConsoleCursorPosition(handle, crd);//被选中时绿底黑字,未被选中时黑底白字if (result == 2)SetConsoleTextAttribute(handle, BACKGROUND_GREEN);elseSetConsoleTextAttribute(handle, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED);cout << "HARD";ch = _getch();if (ch == 0)ch = _getch();} while (ch != VK_RETURN);//只有按下回车键,结束循环SetConsoleTextAttribute(handle, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED);//恢复成默认文字及背景色return result;
}void DrawGround() {//绘制地面crd.X = 0;crd.Y = GROUND + 1;SetConsoleCursorPosition(handle, crd);for (short i = 0; i < SCR_WIDTH; i++)cout << "=";
}int main() {system("mode con cols=60 lines=31");handle = GetStdHandle(STD_OUTPUT_HANDLE);Welcome();//显示欢迎界面_getch();srand(time(0));//产生随机种子char choice;//由用户输出是否继续游戏short level;//接受用户输入级别LetterShower ls;do {system("cls");//清除欢迎界面文字,如果是第二次玩,清除屏幕字母level = ShowMenu();system("cls");vty.GetRestore();//恢复满血vty.ShowVitality();//血量 PrintLevel(level);DrawGround();ls.ClearAll();//清空向量且得分为0ls.ShowScore();ls.SetDelay(500-level*100);ls.Rain();cout << "    Try again?(y/n)"<<endl;cin >> choice;} while (choice == 'Y'||choice == 'y');return 0;
}

C++运行结果:

“快速敲字母”小游戏——C++实现相关推荐

  1. c#简单实现打字母小游戏的编程思想

    打字母小游戏案例 模块一(划分游戏界面和控制界面) 分析: 1.整个界面由游戏界面和控制界面组成 ​ 所以,要用到panel控件来完成,并且还要设置panel控件的大小,边框,背景,以及背景样式等,最 ...

  2. NYOJ273 字母小游戏

    字母小游戏 时间限制:1000 ms  |  内存限制:65535 KB 难度:0 描述 给你一个乱序的字符串,里面包含有小写字母(a--z)以及一些特殊符号,请你找出所给字符串里面所有的小写字母的个 ...

  3. C语言 | 猜字母小游戏(简单易学)

    下面是一个使用C语言编写的猜字母小游戏的示例代码: #include <stdio.h> #include <stdlib.h> #include <time.h> ...

  4. c语言 字母小游戏,详细讲解C语言单机小游戏——打字母游戏

    要用C语言编写一个单机小游戏,首先得安装一个图形库.在这里我用的是EasyX 图形库,EasyX 是针对 C++ 的图形库,可以帮助 C++语言初学者快速上手图形和游戏编程. 比如,可以用 VC + ...

  5. java打字母小游戏总结与收获,java:打字母小游戏demo

    在一个300*400的窗体上,有随机产生的字母向下落.在键盘上敲字母,如果对了就消掉,初始成绩为1000分,每敲对一个字母加10分,如果字母落到屏幕下方,或者敲错,扣100分. import java ...

  6. 零基础如何快速入门微信小游戏开发?

    随着微信生态中,小程序应用指数级的增长,许多休闲游戏变成为了众多游戏厂商流量变现的新手段.以近期很火的"羊了个羊"为例,它便是我们常常所说的小游戏. 游戏和小游戏的区别 要盘点小游 ...

  7. 【h5白鹭引擎】如何快速开发一个小游戏

    1.环境搭建 安装教程传送门:http://edn.egret.com/cn/index.php?g=&m=article&a=index&id=207&terms1_ ...

  8. C语言可以敲哪些小游戏,C语言可以写哪些小游戏?

    C语言可以写哪些小游戏? C语言可以编手机游戏.你叫他去死不过我这有贪吃蛇的代码,你倒可以看看(用TC编译一定过( #包括 #包括 #包括 #包括 #包括 #定义输入7181 #定义ESC 283 # ...

  9. 用DW敲-打地鼠小游戏

    相信大部分的道友们都玩过打地鼠的游戏吧,游戏的机制非常简单,所以今天我就分享一个极其不完善的打地鼠小游戏的代码给大家. 为什么是极其不完善的呢?因为该有的功能基本有,不该有的功能当然没有啦! 说人话部 ...

最新文章

  1. 用漫画了解 Linux 内核到底长啥样
  2. shell编程【分发系统】
  3. webloigc12服务启动不了_一键启动知多少!
  4. python是基于什么语言开发-python是哪个国家的人开发的语言
  5. 【Python】GroupBy:数据聚合与分组运算
  6. 磁盘满了,为啥du却显示还有很大空间?
  7. 揭秘!双11万亿流量下的分布式缓存系统 Tair
  8. [android] 百度地图开发 (二).定位城市位置和城市POI搜索
  9. Ansible16:Playbook高级用法
  10. 《Spark大数据分析:核心概念、技术及实践》一3.5 API
  11. ARC115E-LEQ and NEQ【容斥,dp,线段树】
  12. vue-resource ajax跨域,基于Vue-resource jsonp跨域问题的解决方法_婳祎_前端开发者
  13. 连接mysql报错有乱码_连接mysql服务器报错时,出现乱码
  14. CSS3 pointer-events的应用
  15. Android 的主题的演变
  16. webpack资源管理
  17. Lucene系列-分析器
  18. Scheme语言深入
  19. excel转vcf 易语言免费版
  20. “犯强汉者,虽远必诛!”----遥想伟大汉人当年

热门文章

  1. FlowNet 论文笔记
  2. 文件描述符到底是啥?
  3. 使用OpenOffice实现文件在线预览
  4. 阶乘问题——斯特林公式
  5. PyInstaller 使用UPX压缩减少exe大小
  6. Hyperspace HDU - 4666
  7. Sorry,Buddha
  8. 创建一个 dva 脚手架工程
  9. 大数据时代个人信息安全保护小贴士
  10. 简历篇 | 应届毕业生如何制作一份美观的简历?