“快速敲字母”小游戏——C++实现
游戏介绍:游戏开始运行后,会不断有英文字母从窗体出现并往下掉落,玩家通过按下键盘上相应的字母键,可以将正在掉落的字母消除掉,如果任由字母掉落在窗体下方所绘制的“地面”上,玩家会受到“伤害”,受伤次数达到5次则游戏结束。
游戏实现:
- 完成菜单函数;
- 菜单项切换及绘制地面;
- 显示血槽;
- 处理扣血并建立“字母”结构体;
- 产生字母的函数;
- 字母掉落的设计思想及触地判断;
- 处理Game over时的输出内容;
- 更新字母坐标及显示得分的函数;
- 字母持续掉落的实现;
- 按键消除字母;
- 完成显示级别的函数;
- 主函数循环体。
视频教学链接: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++实现相关推荐
- c#简单实现打字母小游戏的编程思想
打字母小游戏案例 模块一(划分游戏界面和控制界面) 分析: 1.整个界面由游戏界面和控制界面组成 所以,要用到panel控件来完成,并且还要设置panel控件的大小,边框,背景,以及背景样式等,最 ...
- NYOJ273 字母小游戏
字母小游戏 时间限制:1000 ms | 内存限制:65535 KB 难度:0 描述 给你一个乱序的字符串,里面包含有小写字母(a--z)以及一些特殊符号,请你找出所给字符串里面所有的小写字母的个 ...
- C语言 | 猜字母小游戏(简单易学)
下面是一个使用C语言编写的猜字母小游戏的示例代码: #include <stdio.h> #include <stdlib.h> #include <time.h> ...
- c语言 字母小游戏,详细讲解C语言单机小游戏——打字母游戏
要用C语言编写一个单机小游戏,首先得安装一个图形库.在这里我用的是EasyX 图形库,EasyX 是针对 C++ 的图形库,可以帮助 C++语言初学者快速上手图形和游戏编程. 比如,可以用 VC + ...
- java打字母小游戏总结与收获,java:打字母小游戏demo
在一个300*400的窗体上,有随机产生的字母向下落.在键盘上敲字母,如果对了就消掉,初始成绩为1000分,每敲对一个字母加10分,如果字母落到屏幕下方,或者敲错,扣100分. import java ...
- 零基础如何快速入门微信小游戏开发?
随着微信生态中,小程序应用指数级的增长,许多休闲游戏变成为了众多游戏厂商流量变现的新手段.以近期很火的"羊了个羊"为例,它便是我们常常所说的小游戏. 游戏和小游戏的区别 要盘点小游 ...
- 【h5白鹭引擎】如何快速开发一个小游戏
1.环境搭建 安装教程传送门:http://edn.egret.com/cn/index.php?g=&m=article&a=index&id=207&terms1_ ...
- C语言可以敲哪些小游戏,C语言可以写哪些小游戏?
C语言可以写哪些小游戏? C语言可以编手机游戏.你叫他去死不过我这有贪吃蛇的代码,你倒可以看看(用TC编译一定过( #包括 #包括 #包括 #包括 #包括 #定义输入7181 #定义ESC 283 # ...
- 用DW敲-打地鼠小游戏
相信大部分的道友们都玩过打地鼠的游戏吧,游戏的机制非常简单,所以今天我就分享一个极其不完善的打地鼠小游戏的代码给大家. 为什么是极其不完善的呢?因为该有的功能基本有,不该有的功能当然没有啦! 说人话部 ...
最新文章
- 用漫画了解 Linux 内核到底长啥样
- shell编程【分发系统】
- webloigc12服务启动不了_一键启动知多少!
- python是基于什么语言开发-python是哪个国家的人开发的语言
- 【Python】GroupBy:数据聚合与分组运算
- 磁盘满了,为啥du却显示还有很大空间?
- 揭秘!双11万亿流量下的分布式缓存系统 Tair
- [android] 百度地图开发 (二).定位城市位置和城市POI搜索
- Ansible16:Playbook高级用法
- 《Spark大数据分析:核心概念、技术及实践》一3.5 API
- ARC115E-LEQ and NEQ【容斥,dp,线段树】
- vue-resource ajax跨域,基于Vue-resource jsonp跨域问题的解决方法_婳祎_前端开发者
- 连接mysql报错有乱码_连接mysql服务器报错时,出现乱码
- CSS3 pointer-events的应用
- Android 的主题的演变
- webpack资源管理
- Lucene系列-分析器
- Scheme语言深入
- excel转vcf 易语言免费版
- “犯强汉者,虽远必诛!”----遥想伟大汉人当年