- 分享
制作游戏的方法
- 2025-2-15 21:29:03 @
(下面的话所指的程序都为C++)
1.如果想在不用画布的情况下做一个画面类游戏,可以像放视频一帧一帧放画面一样每次输出一个画面,然后清屏,再重新输出新画面
2.当你想转换bool
类型的值时,除了用 !
(非),也可以用这个:
bool flag;
bool notflag=!flag;
if(/*里面填转换条件*/) swap(flag,notflag);
3.接下来,教大家一点老师不讲的知识:
- 1.
windows.h
头文件的应用- 一.
system("start cmd")
创建一个cmd窗口 - 二.
system("color ab")
改变运行框背景颜色为a,字体颜色为b(a,b为windows下的颜色字符,具体字符表示的颜色在cmd窗口上输入color njx
来了解) - 三.
system("pauce")
点击任意键继续 - 四.
system("cls")
清空运行框 - 五.
system("shutdown /s /t s");
在s秒后关闭计算机 - 六.
Sleep(x);
等待x秒
- 一.
4.切换C++14版本
- 1.打开C++
- 2.打开
工具
中的编译选项
- 3.在第一个框中输入
-std=c++14 -O2
5.随机数函数
int rand_(int l,int r){//随机数函数
std::srand(static_cast<unsigned int>(std::time(nullptr)));
int random_num = std::rand() % r + l;
return random_num;
}
6.单个字符改变颜色
//blue
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE);
注意:其中的颜色只有BLUE
,GREEN
,RED
,INTENSITY
(高亮),组合颜色用 | 连接,如:
//紫色
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | FOREGROUND_RED);
是紫色
于是,一个游戏就诞生了......
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
// de 用于记录当前得分
// fx 代表恐龙头部的 y 值,不过在代码后续未被使用,可能是预留变量
// maxde 用于记录历史最高得分
int de = 0, fx = 4, maxde = 0;
// p 是皮肤的索引,初始为 0,表示默认使用第一种皮肤
// pi 是一个二维字符数组,存储了 6 种不同的皮肤文字信息
int p = 0;
char pi[6][9] = { "我是恐龙","我是奶龙","我是你妈","阿米诺斯","鸡汤来喽","鸡你太美" };
// tiao 数组存储了小恐龙跳跃时不同阶段的高度信息
int tiao[20] = { 5,4,3,2,2,1,1,1,0,0,0,0,0,1,1,1,2,2,3,4 };
// xian 用于记录游戏中碰到的仙人掌总数
int xian = 0;
// xk用于标记是否需要生成仙人掌
// huachan用于标记是否正在进行滑铲动作
bool xk = 1, huachan = 0;
// huachantime 记录滑铲动作的持续时间
// huachancdtime 记录滑铲技能的冷却时间
int huachantime = 70, huachancdtime = 100;
double huachanshouyi = 0,huachancdshouyi = 0;
bool piflag[6]={1,0,0,0,0,0};
int jinbishu=0;
int pijin[6]={0,5,10,20,50,100};
int huachanxiaohaoshu=20;
bool fanbei=0;
int fanbeitime=50,fanbeicdtime=100;
// 随机数生成函数,用于生成指定范围内的随机整数 , l 是随机数范围的下限,r 是随机数范围的上限
int rand_(int l, int r) {
std::srand(static_cast<unsigned int>(std::time(nullptr)));
int random_num = std::rand() % r + l;
return random_num;
}
// 绘制恐龙皮肤的函数
// x_ 是当前绘制位置的 x 坐标,y_ 是恐龙的基准 y 坐标
void pifu(int x_, int y_) {
// 每个汉字由两个字符组成
// 根据是否处于滑铲状态决定显示皮肤文字还是空白
if (x_ == y_ && huachan == 0) cout << pi[p][0] << pi[p][1];
else if (x_ == y_ && huachan == 1) cout << " ";
if (x_ == y_ + 1 && huachan == 0) cout << pi[p][2] << pi[p][3];
else if (x_ == y_ + 1 && huachan == 1) cout << " ";
if (x_ == y_ + 2) cout << pi[p][4] << pi[p][5];
if (x_ == y_ + 3) cout << pi[p][6] << pi[p][7];
}
// 显示游戏提示信息的函数
void tishi() {
system("cls");
cout << "-------------------------" << endl;
cout << " 说明 " << endl;
cout << " 游戏内按空格跳跃 " << endl;
cout << " “X”是仙人掌,碰到会死 " << endl;
cout << "跳跃请长按“ ”到跳起为止" << endl;
cout << " 可以按对应键释放不同技能" << endl;
cout << "-------------------------" << endl;
system("pause");
system("cls");
}
// 检测按键输入的函数
// h__ 是需要检测的按键字符
bool shuru_(char h__) {
for (int i = 0; i <= 255; ++i) {
if (GetAsyncKeyState(i) & 0x8000) {
if (i == h__) {
return 1;
}
}
}
return 0;
}
// 显示游戏开始界面的函数
void chu() {
system("cls");
system("color 0f");
SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_INTENSITY);
cout << "----------------------" << endl;
SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN);
cout << " 小恐龙 " << endl;
SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
cout << " 按 s 开始 " << endl;
SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
cout << " 按 h 换角色 " << endl;
SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN);
cout << " 按 n 退出游戏 " << endl;
SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
cout << " 按 t 查看游戏说明 " << endl;
SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE);
cout << " 按 k 查看技能说明 " << endl;
SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | FOREGROUND_RED);
cout << " 按 m 查看得分 " << endl;
SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
cout << " 按 c 进行技能升级 " << endl;
SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
cout << "----------------------" << endl;
SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN);
}
// 显示历史最高得分和碰到的仙人掌总数的函数
void maxd() {
SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
cout << "最高分:" << maxde << endl;
SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN);
cout << "仙人掌个数:" << xian << endl;
SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN | FOREGROUND_RED);
cout << "金币个数 : " << jinbishu << endl;
SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN);
system("pause");
}
// 显示换皮肤界面的函数
void huan() {
cout << "1.我 2.我 3.我 4.阿 5.鸡 6.鸡" << endl;
cout << " 是 是 是 米 汤 你" << endl;
cout << " 恐 奶 你 诺 来 太" << endl;
cout << " 龙 龙 妈 斯 喽 美" << endl;
cout << " 2号 5 个,3 号 10 个,4 号 20 个 " << endl;/*0,5,10,20,50,100*/
cout << " 5 号 50 个,6 号 100 个 " << endl;
cout << "当前金币:" << jinbishu << endl;
cout << " 输入皮肤序号(默认为 1) " << endl;
}
// 绘制游戏界面并判断是否死亡的函数
// flag_ 标记是否需要绘制仙人掌,y__ 是仙人掌的高度,o_ 是仙人掌的 x 坐标,tiao_ 是恐龙当前的跳跃高度
int ch(bool flag_, int y__, int o_, int tiao_) {
// 根据得分情况改变控制台颜色和调整游戏难度
int k = tiao_;
int j_ = 60;
int u_i_ = 1;
if (de % 500 == 0 && de % 1000 != 0) system("color 0f");
if (de % 1000 == 0) system("color f0");
if (de % 1000 == 900) system("color 6e");
if (de % 1000 == 400) system("color e6");
if (de % 2000 >= 1900 && de % 2000 <= 1999) {
j_ = 40;
system("color 7f");
}
if (de % 500 == 0 && de % 1000 != 0 && de % 3000 <= 2999 && de % 3000 >= 2000) {
system("color 40");
j_ = 50;
y__ = 4;
}
cout << "得分:" << de << endl;
cout << "滑铲冷却时间:" << huachancdtime << endl;
if((piflag[0]==1 & piflag[1]==1 & piflag[2]==1 & piflag[3]==1 & piflag[4]==1 & piflag[5]==1)){
cout << "翻倍冷却时间:"<< fanbeicdtime<<endl;
if(fanbei==1) cout << "翻倍剩余时间:" << fanbeitime << endl;
else cout << endl;
}
if(huachan==1) cout << "滑铲剩余时间:" << huachantime << endl;
else cout << endl;
// 双重循环遍历游戏界面的每个位置进行绘制
for (int i = 0; i < 10; i++) {
for (int j = 0; j < j_; j++) {
if (j == 4) pifu(i, k);
if (flag_ == 1 && xk == 1) {
if (i >= 9 - y__ && i <= 8 && j == o_) {
if (i == k + 3 && j == 4 && huachan == 0) {
u_i_ = 0;
}
else if (i == k + 3 && j == 4 && huachan == 1) {
xk = 0;
xian += y__;
}
cout << 'X';
}
}
if (i == 9) cout << '-';
else cout << ' ';
}
cout << endl;
}
return u_i_;
}
// 技能说明函数
void jieshao() {
system("cls");
cout << "-------------------------------------------------------------------------------" << endl;
cout << " 技能说明 " << endl;
SetConsoleTextAttribute(hConsole,FOREGROUND_GREEN);
cout << " 技能名称:滑铲" << endl;
cout << " 技能按键:S" << endl;
cout << " 技能效果:在滑铲期间,小恐龙可以穿过仙人掌而不死亡,并且可以获得碰到的仙人掌" << endl;
cout << " 技能持续时间:" << huachantime << " 个游戏帧" << endl;
cout << " 技能冷却时间:" << huachancdtime << " 个游戏帧" << endl;
cout << " 技能特殊效果:如果滑铲结束时玩家离仙人掌太近,将获得额外 20 个游戏帧的滑铲"<<endl;
if(!(piflag[0]==1 & piflag[1]==1 & piflag[2]==1 & piflag[3]==1 & piflag[4]==1 & piflag[5]==1)) goto S;
SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN);
cout << " 技能名称:翻倍" << endl;
cout << " 技能按键:F" << endl;
cout << " 技能效果:在翻倍期间,玩家得分翻倍" << endl;
cout << " 技能持续时间:" << fanbeitime << " 个游戏帧" << endl;
cout << " 技能冷却时间:" << fanbeicdtime << " 个游戏帧" << endl;
cout << " 技能特殊效果:无法升级,但可以锁住时间,即不会更换天气"<<endl;
S : ;
SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN);
cout << "-------------------------------------------------------------------------------" << endl;
system("pause");
system("cls");
}
void shengji(){
if(huachancdtime<=10){
cout << "-----满级-----"<<endl;
goto loop;
}
cout <<huachanxiaohaoshu<< " 仙人掌 进行一次升级"<<endl;
cout << "是否升级:"<<endl;
cout << "升级输入 y ,不升级输入 n"<<endl;
loop : ;
}
int main() {
while (1){
chu();
char w_;
cin >> w_;
if (w_ == 'k') {
system("cls");
jieshao();
continue;
}
if( w_=='c'){
system("cls");
shengji();
char c;
cin >> c;
if(c=='y'){
system("cls");
cout << "稍等 . . ."<<endl;
if(huachanxiaohaoshu<=xian){
xian-=huachanxiaohaoshu;
huachanshouyi += 1.0/100;
huachancdshouyi+=0.5/100;
Sleep(1000);
system("cls");
cout << "升级成功!"<<endl;
huachanxiaohaoshu+=10;
}
else{
Sleep(1000);
system("cls");
cout << "升级失败!距离升级剩余:"<<huachanxiaohaoshu-xian<<" 个仙人掌"<<endl;
}
system("pause");
}
else{
system("cls");
cout << "取消成功!"<<endl;
system("pause");
}
}
// 如果用户选择换皮肤
if (w_ == 'h') {
system("cls");
huan();
if(huachancdtime<=10){
Sleep(2000);
continue;
}
int r__;
cin >> r__;
system("cls");
int p_ = r__ - 1;
// 判断用户的分是否足够解锁该皮肤
if (jinbishu >= pijin[p_] | piflag[p_]==1) {
cout << "更换成功";
p = p_ ;
if(piflag[p_]==0){
jinbishu-=pijin[p_];
piflag[p_]=1;
}
}
else cout << "更换失败";
Sleep(1000);
system("cls");
}
// 如果用户选择查看历史最高分
if (w_ == 'm') {
system("cls");
maxd();
system("cls");
}
// 如果用户选择查看游戏提示
if (w_ == 't') {
tishi();
}
// 如果用户选择退出游戏
if (w_ == 'n') {
system("cls");
SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN);
cout << "感 谢 您 的 使 用 !"<<endl;
SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
return 0;
}
// 如果用户选择开始游戏
if (w_ == 's') {
de = 0;
bool ti = 0;
int ao = 0;
bool u = 1, o = 1;
int r = 49;
int r_u_ = rand_(1, 3);
while(u == 1){
// 处理技能相关逻辑
if ((shuru_('s') || shuru_('S')) && huachancdtime == 0 && huachan == 0) {
huachan = 1;
}
if (huachan == 1 && huachantime > 0) {
huachantime--;
}
if (huachan == 1 && huachantime == 0) {
huachan = 0;
huachancdtime = 100;
huachantime = 80;
}
if((piflag[0]==1 & piflag[1]==1 & piflag[2]==1 & piflag[3]==1 & piflag[4]==1 & piflag[5]==1)){
if ((shuru_('f') | shuru_('F')) && fanbeicdtime == 0 && fanbei == 0){
fanbei = 1;
}
if (fanbei == 1 && fanbeitime > 0) {
fanbeitime--;
}
if (fanbei == 1 && fanbeitime == 0) {
fanbei = 0;
fanbeicdtime = 50;
fanbeitime = 10;
}
}
if (de % 3000 < 2999 && de % 3000 > 2500) r_u_ = 3;
// 处理跳跃逻辑
if (shuru_(' ') == 1 & ti == 0 & huachan==0) {
ti = 1;
}
// 处理仙人掌生成逻辑
if (o == 0) {
r = 49 + rand_(2, 4);
o = 1;
xk = 1;
r_u_ = rand_(1, 3);
}
// 绘制游戏界面并判断恐龙是否存活
if (o == 1) {
u = ch(1, r_u_, r, tiao[ao]);
r--;
if (r <= 0) o = 0;
}
else u = ch(0, 0, 0, tiao[ao]);
// 根据是否滑铲调整游戏速度
if (huachan == 1) {
Sleep(2);
}
else {
Sleep(30);
}
system("cls");
de++;
if(fanbei==1) de+=2;
// 如果恐龙死亡,更新最高分并处理死亡界面
if (u == 0) {
system("color 0f");
system("cls");
cout << "得分:" << de;
maxde = max(maxde, de);
Sleep(2000);
system("cls");
}
// 处理跳跃状态更新
if (ti == 1 && ao <= 18) ao++;
if (ti == 1 && ao == 19) {
ao = 0;
ti = 0;
}
// 处理滑铲冷却时间
if (huachancdtime > 0) huachancdtime--;
if(fanbeicdtime>0&(piflag[0]==1&piflag[1]==1&piflag[2]==1&piflag[3]==1&piflag[4]==1&piflag[5]==1))fanbeicdtime--;
// 判断是否给无敌帧
if(huachantime==2){
if(r<=15){
huachantime+=20;
}
}
}
jinbishu+=de/100;
}
huachantime=80+80*huachanshouyi;
huachancdtime=100-100*huachancdshouyi;
}
return 0;
}
这个游戏实现了一个跑酷类游戏(记得用C++14及以上版本) 实在不行就用这个(用Googe浏览器):
chrome://dino
长度:365行 (前面那个找不到了,重发一下)
0 comments
No comments so far...