(下面的话所指的程序都为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);

注意:其中的颜色只有BLUEGREENRED,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...