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++的程序来帮助她打印出评语,评语打印规则如下:
| 分数 | 评语 |
|---|---|
| 10 | Perfect |
| 9、8 | Great |
| 7、6 | Good |
| 5、4、3 | Not Bad |
| 2、1、0 | Bad |
| 其他 | 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个字符
完结撒花(*-∀-)ノ
完结(*-∀-)ノ花
你就说是不是撒花吧。
点赞过百,火速更新下一版!
463

被折叠的 条评论
为什么被折叠?



