【C++游戏必备】switch的用法

Switch的用法

前言

警告:本文为作者原创,未经授权,禁止转载
警告:本文为作者个人理解,请勿过分解读
大家应该都知道,“switch”是开关的意思,那么在C++中,“switch”又应该如何应用呢?在实战制作游戏中,又可以如何创造奇迹呢?请大家接着阅览。

第一章·基本用法

“switch”有点像“if”判断,但是相较“if”,使用“switch”在某些操作上较为方便,switch语句支持的类型:
1.整型类型

int
short
long
long long
char
bool(C++17支持)

2.枚举类型

enum
enum class

3.不支持的类型

string
float
double

第二章·荔枝

给大家几个例子

分数评语

题目背景
荔枝(作者的绰号之一)在玩一款游戏,游戏有一个评分,由于她很难拿到满分,所以她非常爱玩(虽然经常被游戏坑)
题目描述
荔枝想知道她拿到分数后的评语,她会给你一个int范围内的整数n,希望你能写一个C++的程序来帮助她打印出评语,评语打印规则如下:

分数评语
10Perfect
9、8Great
7、6Good
5、4、3Not Bad
2、1、0Bad
其他Error

其中大小写不改变
输入输出格式
输入一个整数n,输出对应的评语
样例组
输入:6输出:Good
输入:-2输出:Error
解决代码
1.用switch

#include <bits/stdc++.h>//懒得记头文件,用个万能头 
using namespace std;
int n; 
int main(){
    cin>>n;
    switch(n){
    	case 10://假如n的值为10 
    		cout<<"Perfect"<<endl;//注意大小写! 
    		break;//一定要break!不然结束不了! 
    	case 9:
    	case 8://同if(n==9||n==8) 
    		cout<<"Great"<<endl;
    		break;
    	case 7:
    	case 6:
    		cout<<"Good"<<endl;
    		break;
    	case 5://同if(n==5||n==4||n==3) 
    	case 4:
    	case 3:
    		cout<<"Not Bad"<<endl;
    		break;
    	case 2:
    	case 1:
    	case 0:
    		cout<<"Bad"<<endl;
    		break;
    	default://同else 
    		cout<<"Error"<<endl;
    		break;
	}
    return 0;
}

2.用if

#include <bits/stdc++.h>//懒得记头文件,用个万能头 
using namespace std;
int n; 
int main(){
    cin>>n;
    if(n==10)cout<<"Perfect"<<endl;
    else if(n==9||n==8)cout<<"Great"<<endl;//一定要else if! 
    else if(n==7||n==6)cout<<"Good"<<endl;
    else if(n==5||n==4||n==3)cout<<"Not Bad"<<endl;
    else if(n==2||n==1||n==0)cout<<"Bad"<<endl;
    else cout<<"Error"<<endl;
    return 0;
}

坐标

题目背景
荔枝正在操场上和她的同学“快乐”地玩蒙眼抓人游戏。
题目描述
荔枝被蒙上了眼睛,她的初始坐标为(1,1),她根据声音移动了几步,用一个字符串s表示,其中‘U’代表上(x–),'D’代表下(x++),‘L’代表左(y–),‘R’代表右(y++),她想知道自己现在在哪个坐标,请你写一个C++程序帮助她吧!
输入输出格式
输入一个字符串s,保证长度不超过100且只包含’U’、‘D’、‘L’、'R’四个字符。输出两个整数x和y,中间用一个空格隔开,表示荔枝现在在哪个坐标,坐标可能为负数。
样例组
输入DRDDR输出4 3
输入URDL输出1 1
代码
1.switch语句

#include <bits/stdc++.h>//懒得记头文件,用个万能头 
using namespace std;
string s;
int x=1,y=1;
int main(){
    cin>>s;
    for(int i=0;i<s.size();i++){
    	char c=s[i];
    	switch(c){
    		case 'U':x--;break;//压行,同if(c=='U')x--;
			case 'D':x++;break;
			case 'L':y--;break;
			case 'R':y++;break;
		}
	}
	cout<<x<<' '<<y<<endl;
    return 0;
}

2.if语句

#include <bits/stdc++.h>//懒得记头文件,用个万能头 
using namespace std;
string s;
int x=1,y=1;
int main(){
    cin>>s;
    for(int i=0;i<s.size();i++){
    	char c=s[i];
    	if(c=='U')x--;
    	if(c=='D')x++;
    	if(c=='L')y--;
    	if(c=='R')y++;
	}
	cout<<x<<' '<<y<<endl;
    return 0;
}

实战(制作简单小游戏)

Okay鸭既然理解了switch,还不赶紧制作几个小游戏玩玩?(注意!文字小游戏尽量用if,更简单!)

猜字母

#include <bits/stdc++.h>//懒得记头文件,用个万能头 
#include <windows.h>//游戏必备头文件(除非你用的是别的系统) 
#include <conio.h>//用_getch()必须有的 
using namespace std;
char ans;//答案 
void op(){//生成提示函数 
	char ts;//提示变量
	do{
		ts=rand()%26+'A';
	}while(ts==ans);//保证提示不是答案 
	cout<<endl<<"提示:不是"<<ts<<endl;
}
int main(){
    srand(time(NULL));//随机数必备
	ans=rand()%27;//随机一个值 
	ans+='A';//加上A 
	char n=' ';//操作符,初始赋值为空格
	while(n!=ans){
		cout<<"请输入一个大写字母(输入空格获取提示):";
		if(kbhit()){//检查是否按下键 
			n=_getch();//无显示输入字符(必须是字符!) 
			switch(n){
				case ' ':
				    op();
				    system("pause");//按任意键继续的那玩意儿  
					break;
				default:
					if(n!=ans)cout<<"猜错了!"<<endl;//借助if来写
					else{
						cout<<"猜对了!你赢了!"<<endl;
						return 0;//直接返回0 
					} 
					system("pause");
					break;
			}
		}
		Sleep(250);//短暂停顿0.25秒
		system("cls");//清屏 
	}
    return 0;
}

备注:仅有41行,1031个字符

煎饼果子小摊

#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <windows.h>
#include <conio.h>
using namespace std;

string ld[4] = {"不要辣", "微辣", "辣", "无敌辣"}; // 辣度要求
string tl[4] = {"葱", "胡椒粉", "番茄酱", "无"}; // 调料

struct dingdan {
    int l, num, t; // 辣度、个数、调料(不再需要id字段)
};

vector<dingdan> dd; // 订单显示
vector<bool> is;    // 订单是否完成
int money = 100;    // 初始资金

// 材料库存
int bz = 0, jd = 0; // 饼子、鸡蛋的个数

// 各种饼子数量:[辣度][调料],0-3对应不要辣到无敌辣,0-3对应调料
int bz_count[4][4] = {0};

void clearScreen() {
    system("cls");
}

void pauseScreen() {
    system("pause");
}

void gm() { // 购买函数
    cout << "1.饼子(2元/个) 2.鸡蛋(1元/个)" << endl;
    char k;
    cin >> k;
    
    if (k == '1') {
        cout << "买几个?" << endl;
        int m;
        cin >> m;
        if (m <= 0) {
            cout << "数量必须大于0!" << endl;
        } else if (money < m * 2) {
            cout << "你的钱不够!" << endl;
        } else {
            cout << "购买成功!" << endl;
            money -= m * 2;
            bz += m;
        }
    } else if (k == '2') {
        cout << "买几个?" << endl;
        int m;
        cin >> m;
        if (m <= 0) {
            cout << "数量必须大于0!" << endl;
        } else if (money < m) {
            cout << "你的钱不够!" << endl;
        } else {
            cout << "购买成功!" << endl;
            money -= m;
            jd += m;
        }
    } else {
        cout << "没有这玩意儿,购买失败!" << endl;
    }
    pauseScreen();
}

void zz() { // 制作函数
    cout << "1.制作饼子" << endl;
    int k;
    cin >> k;
    
    if (k == 1) {
        if (bz > 0 && jd > 0) { // 判断是否有材料
            cout << "选择辣度(0,1,2,3):" << endl;
            cout << "0.不要辣 1.微辣 2.辣 3.无敌辣" << endl;
            int c;
            cin >> c;
            
            if (c < 0 || c > 3) {
                cout << "无效的辣度选择!" << endl;
                pauseScreen();
                return;
            }
            
            cout << "选择小料:0.葱 1.胡椒粉 2.番茄酱 3.无" << endl;
            int e;
            cin >> e;
            
            if (e < 0 || e > 3) {
                cout << "无效的小料选择!" << endl;
                pauseScreen();
                return;
            }
            
            // 制作饼子
            bz_count[c][e]++;
            bz--;
            jd--;
            cout << "制作成功!制作了1个" << ld[c] << tl[e] << "饼子" << endl;
        } else {
            cout << "你没有足够的材料!" << endl;
        }
    } else {
        cout << "没有这玩意儿!" << endl;
    }
    pauseScreen();
}

void cs() { // 出售函数
    if (dd.empty()) {
        cout << "当前没有订单!" << endl;
        pauseScreen();
        return;
    }
    
    cout << "输入要完成的订单编号" << endl;
    cout << "当前订单:" << endl;
    
    // 显示所有未完成的订单,编号从1开始
    for (int i = 0; i < (int)dd.size(); i++) {
        if (!is[i]) {
            // 显示编号为 i+1(1-based),但实际索引是 i
            cout << i + 1 << ". " << dd[i].num << "个 " 
                 << ld[dd[i].l] << " " << tl[dd[i].t] << endl;
        }
    }
    
    int orderNumber; // 用户输入的订单编号(1-based)
    cin >> orderNumber;
    
    // 转换为0-based索引
    int index = orderNumber - 1;
    
    if (index < 0 || index >= (int)dd.size()) {
        cout << "订单编号无效!" << endl;
        pauseScreen();
        return;
    }
    
    if (is[index]) {
        cout << "订单已完成!" << endl;
        pauseScreen();
        return;
    }
    
    dingdan &order = dd[index];
    
    // 检查库存是否足够
    if (bz_count[order.l][order.t] >= order.num) {
        bz_count[order.l][order.t] -= order.num;
        
        // 计算收益
        int base_price = 0;
        switch (order.l) {
            case 0: base_price = 4; break; // 不要辣
            case 1: base_price = 5; break; // 微辣
            case 2: base_price = 6; break; // 辣
            case 3: base_price = 9; break; // 无敌辣
        }
        
        // 如果有调料(非"无"),额外加1元
        if (order.t != 3) {
            base_price += 1;
        }
        
        int earnings = base_price * order.num;
        money += earnings;
        is[index] = true;
        cout << "订单完成!获得" << earnings << "元" << endl;
    } else {
        cout << "你没有足够多的食物!" << endl;
        cout << "需要" << order.num << "个" << ld[order.l] << tl[order.t] 
             << "饼子,但只有" << bz_count[order.l][order.t] << "个" << endl;
    }
    pauseScreen();
}

void displayStatus() {
    cout << "当前资金:" << money << "元" << endl;
    cout << "库存:饼子" << bz << "个,鸡蛋" << jd << "个" << endl;
    
    // 显示各种饼子的库存
    cout << "饼子库存详情:" << endl;
    for (int l = 0; l < 4; l++) {
        for (int t = 0; t < 4; t++) {
            if (bz_count[l][t] > 0) {
                cout << "  " << ld[l] << tl[t] << ": " << bz_count[l][t] << "个" << endl;
            }
        }
    }
    
    cout << "========================================" << endl;
    cout << "1.购买 2.制作 3.出售 ESC退出" << endl;
    cout << "========================================" << endl;
    
    bool hasOrders = false;
    cout << "当前订单:" << endl;
    for (int i = 0; i < (int)dd.size(); i++) {
        if (!is[i]) {
            hasOrders = true;
            // 显示编号为 i+1(1-based)
            cout << i + 1 << ". " << dd[i].num << "个 " 
                 << ld[dd[i].l] << " " << tl[dd[i].t] << endl;
        }
    }
    if (!hasOrders) {
        cout << "(暂无订单)" << endl;
    }
    cout << "========================================" << endl;
}

int main() {
    srand(time(NULL));
    
    cout << "欢迎来到煎饼果子店经营游戏!" << endl;
    cout << "用1个饼子和1个鸡蛋可以制作1个煎饼果子" << endl;
    cout << "创作思路:作者去吃煎饼果子,还挺好吃的" <<endl; 
    pauseScreen();
    
    while (true) {
        displayStatus();
        
        if (_kbhit()) {
            char n = _getch();
            switch (n) {
                case '1':
                    gm();
                    break;
                case '2':
                    zz();
                    break;
                case '3':
                    cs();
                    break;
                case 27: // ESC键
                    cout << "游戏结束!最终资金:" << money << "元" << endl;
                    pauseScreen();
                    return 0;
            }
        }
        
        // 随机生成新订单(概率约为1%)
        int ran = rand() % 100 + 1;
        if (ran == 1 && dd.size() < 10) { // 限制最大订单数量
            int lll = rand() % 4;  // 辣度 0-3
            int ttt = rand() % 4;  // 调料 0-3
            int nnn = rand() % 3 + 1; // 数量 1-3
            
            dingdan newOrder;
            newOrder.l = lll;
            newOrder.t = ttt;
            newOrder.num = nnn;
            
            dd.push_back(newOrder);
            is.push_back(false);
            
            // 可选:提示新订单
            // cout << "新订单!" << nnn << "个" << ld[lll] << tl[ttt] << "饼子" << endl;
        }
        
        Sleep(100);
        clearScreen();
    }
    
    return 0;
}

备注:由于原码太乱了,所以借助了AI整理,共270行,7533个字符

完结撒花(*-∀-)ノ

完结(*-∀-)ノ花
你就说是不是撒花吧。
点赞过百,火速更新下一版!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值