标签:memset 好用 etc 彩色 nio 有趣的 inf 有意思 getc
Hi~
又到了给大家分享知识的时候,之前写的博客都是清一色的题解博客,可能许多小伙伴们对次毫无兴趣,今天我们来整点有意思的东西
那就是<<真心话大冒险>>,hhhhhhh,接下来先让我们看看这个游戏的整个框架吧,然后再来逐一分析。
完整代码如下:
#include<cstdio> #include<iostream> #include<cstring> #include<conio.h> #include<windows.h> #include<stdlib.h> #include<time.h> #include<cmath> #include<queue> #include<algorithm> #define random(x) (rand()%x) using namespace std; struct node { int rating; string name; } gamecase[100]; int s, sizez, sized, randnumber = 40, gamenumber, loc[100];//randnumber表示的是每个的惩罚的个数 double x, y; string DMX[45] = { "做一个大家都满意的鬼脸", "向一位异性表白3分钟", "与一位异性十指相扣,对视10秒", "坐在异性大腿上坚持10秒", "选两位异性用嘴唇传纸牌", "对外大喊我是猪", "对喂花生米", "女生坐男生小腿上,男生做仰卧起坐", "喝咸味的饮料", "和左边第一个异性换穿上衣", "把右边第一个异性横抱起来", "亲左数第二个异性的额头", "找一男生把腿架他肩膀上让他捶腿", "选一个男生一边捶他的胸一边说:你好讨厌哦", "选一位异性,互摸嘴唇", "隔纸巾接吻", "跳肚皮舞", "亲吻一分钟墙壁", "表演便秘的样子", "给最近的人擦鞋", "给最近的人擦嘴巴", "对陌生人挤眉弄眼", "大喊“燃烧吧小宇宙”", "唱青藏高原最后一句", "表演大猩猩捶胸呐喊", "你真的好讨厌,好讨厌", "做一个大家都满意的鬼脸", "先大笑五秒,再大哭五秒", "学超级名模走秀绕场一周", "对最靠近自己的异性唱首歌", "抱起右手边的人,保持五秒", "原地转十圈然后靠一个人身上", "右手跨过后脑勺从左边摸右眼", "选择一名异性向她/他深情表白", "挤出护手霜,帮最近的异性涂", "想办法让指定的一名异性兴奋起来", "双手揪耳朵说“我错了”并做蛙跳5个", "男生做十五下俯卧撑,女生原地跳十次", "大喊“我是人见人爱、花见花开的小萝莉”", "学动物叫(指定一个动物如:骆驼、蛇等)", "用手纸当围巾围脖子上,并保持到下轮结束", "舔下嘴唇跟正对面的玩家说“你看起来真可口”" }; string ZXH[45] = { "你有没有钟意的人?是谁?", "你想和在场的哪一位玩大冒险?", "每个月的开销是多少?花到哪去了?", "你是处女、处男吗?", "你说过几次“我爱你”?", "你会选择爱还是被爱?", "如果让你拥有一种超能力,你愿意拥有什么呢?", "如果能预知未来,你最不希望看见的是什么?", "当你被我点名的时候是什么心情?", "哭得最伤心的是哪一次?为什么?", "如果有一天自己觉得自己的某一次选择是错的,可是现在已经再也无法重新来,那该怎么办?", "你最怕的事情或东西是什么(说出三件)。", "理想中的另一半是什么样子?", "你有恨过谁吗?", "对你而言,爱情和友情哪个比较重要?", "如果时间能倒流你希望回到哪一时间,为什么?", "每天睡觉前都会想起的人是谁?", "近一个星期内最让你开心的事。", "最害怕的三件事物。", "和异性发生过最暧昧的事情。", "如何向喜欢的人表白?", "我在你眼里什么样?", "你觉得自我最郁闷的外号是什么。", "你最近一次做春梦是什么样貌的。", "你的初吻年龄。", "你最不开心的时候会有什么表现?", "和恋人的身体接触到哪一步了。", "目前最大的愿望?", "童年最有趣的一次经历。", "爱情事业和家庭,你怎么排序?", "最喜欢的三种食物或饮品。", "肯德基或麦当劳,你选哪一个?", "你在生活中有什么比较特殊的癖好?", "你最想要的5样东西", "你有恨过谁吗?", "我和你恋人同时约你,你会陪谁?", "喜欢看什么动画片?", "最珍爱的人是你右手的哪一个手指?", "到目前为止你做过最疯狂的事是?", "如果跟你喜欢的人约会,碰到前任的男(女)朋友,会有什么表现?" }; void Setcolor(unsigned short ForeColor = 2, unsigned short BackGroundColor = 0) { HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hCon, ForeColor % 16 | BackGroundColor % 16 * 16); } bool cmp(struct node a, struct node b) { return a.rating > b.rating; } void love() { s = 0; Setcolor(15, 0); for (x = 1.3; x >= -1.1; x -= 0.1) { for (y = -2; y <= 1.4; y += 0.053) { if (pow(x * x + y * y - 1, 3) - x * x * x * y * y <= 0) { Setcolor(0, rand() % 6 + 10); printf(" "); Sleep(2); } else { Setcolor(0, 0); printf(" "); } } printf("\n"); } Sleep(1500); } void printlen(int n) { for (int i = 0; i < n; ++i) { cout << ‘*‘; } cout << ‘\n‘; } void printspace(int n) { for (int i = 0; i < n; ++i) cout << " "; } void quit() { system("cls"); printspace(5); printf("再见啦,记得再找我玩哟\t(づ ̄3 ̄)づ╭?~\n"); Sleep(1000); } void MainDOS() { printspace(5); printlen(50); printspace(5); printf("** welcome to 真心话大冒险 ^_^ **\n"); printspace(5); printf("**"); printspace(46); printf("**\n"); printspace(5); printf("** 游戏规则如下: **\n"); printspace(5); printf("**"); printspace(46); printf("**\n"); printspace(5); printf("**你有两个选择,一个是真心话,另一个就是大冒险哦**\n"); printspace(5); printf("**"); printspace(46); printf("**\n"); printspace(5); printf("** 那么请按R开始游戏叭! **\n"); printspace(5); printf("**"); printspace(46); printf("**\n"); printspace(5); printf("** 按Q可以退出游戏哟! **\n"); printspace(5); printf("**"); printspace(46); printf("**\n"); printspace(5); printlen(50); puts("\n\n\n"); printspace(30); printf("开发者:Mangata--请关注微信公众号哦:代码小帮手\n");//这里可以随便改成你的名字 } void playDOS() { system("cls"); printspace(5); printf(" O(∩_∩)O~~ 欢迎来到真心话大冒险 (づ ̄3 ̄)づ╭?~\n\n"); printspace(5); printf("╔*☆***◎***◇***☆* 游戏模式 *☆***◇***◎***☆*╗\n"); printspace(5); printf("|★| |★|\n"); printspace(5); printf("|☆| |☆|\n"); printspace(5); printf("|★| 1.单人模式 |★|\n"); printspace(5); printf("|☆| 2.多人模式 |☆|\n"); printspace(5); printf("|★| 3.退出游戏 |★|\n"); printspace(5); printf("|☆| |☆|\n"); printspace(5); printf("|☆| |☆|\n"); printspace(5); printf("╚*☆***◎***◇****☆****★****☆****◇***◎***☆*╝\n\n"); printspace(5); printf("主人请选择你想要玩的游戏哦:"); } void gameDOS1() { system("cls"); printspace(5); printf("☆☆☆☆☆ 真心话请按1 ☆☆☆☆☆\n"); printspace(5); printf("★★ ★★\n"); printspace(5); printf("☆☆☆☆☆ 大冒险请按2 ☆☆☆☆☆\n"); printspace(5); printf("★★ ★★\n"); printspace(5); printf("☆☆☆☆☆ 退出游戏请按3 ☆☆☆☆☆\n"); } void randomgame() { char temp; putchar(‘\n‘); gameDOS1(); putchar(‘\n‘); printspace(5); printf("主人选择真心话还是大冒险呢,真心话请按1,大冒险请按2哟\n"); while (temp = _getch()) { if (temp == ‘1‘) { printspace(5); cout << "主人抽中的真心话:" << ZXH[random(randnumber)] << endl; break; } else if (temp == ‘2‘) { printspace(5); cout << "主人抽中的大冒险:" << DMX[random(randnumber)] << endl; break; } else if (temp == ‘3‘) { quit(); love(); exit(0); } else//处理错误输入 { printf("主人你输错啦,请再输入叭"); Sleep(1000); } system("cls"); gameDOS1(); } printspace(5); printf("请主人按任意键继续哦"); _getch(); system("cls"); } void gameDOS2(int number, int lun) { system("cls"); printspace(5); printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n"); puts(" "); printspace(5); printf("★★ %d人游戏第%d轮 ★★\n", number, lun); puts(" "); printspace(5); printf("★★ 下面的人将接受惩罚: ★★\n"); printspace(5); int k = 0; memset(loc, 0, sizeof(loc));//清空人员地址数组 queue<int> p; printspace(5); printf("恭喜序号为:"); while (k < gamenumber / 2)//筛选出总人数一半的人进行惩罚 { int temp = random(gamenumber + 1);//筛选出随机数 while (!temp)//防止0的出现,因为人数是从1开始计数的 { temp = random(gamenumber + 1); } if (!loc[temp])//防止已经被抽到了的玩家再次被抽到 { printspace(5); printf("%d", temp); k++; loc[temp]++;//被抽到的人相应的数组就+1 p.push(temp);//将抽到的玩家按照先后顺序进入队列 } } printf("被惩罚\n"); putchar(‘\n‘); printspace(5); printf("恭喜你们哟,快点接受惩罚吧 O(∩_∩)O\n"); for (int i = 1; i <= gamenumber; ++i)//未被抽到的人进行加分操作 { if (!loc[i]) { gamecase[i].rating += 5; } } printspace(5); printf("请按任意键继续哦"); _getch(); for (int i = 0; i < gamenumber / 2; ++i)//对被抽到的人进行惩罚 { system("cls"); printspace(5); printf("请%d号玩家接受惩罚:\n", p.front()); p.pop(); printspace(5); printf("请按任意键进入惩罚环节\n"); _getch(); randomgame(); printspace(5); if (i == gamenumber / 2 - 1) printf("请按任意键结束本轮所有惩罚"); else printf("请按任意键进行下一个惩罚\n"); _getch(); } } void gameokDOS()//结算界面函数 { system("cls"); sort(gamecase + 1, gamecase + 1 + gamenumber, cmp); printspace(5); printf("主人,又到了排名清算界面了呢,看看你排在第几名叭!\n"); for (int i = 1; i <= gamenumber; ++i) { printspace(5); printf("第%d名\trating=%d\t", i, gamecase[i].rating); cout << gamecase[i].name << endl; } putchar(‘\n‘); printspace(5); cout << gamecase[1].name << "是冠军" << "\tohhhhhhhhhhhhhhhhhhhhhhhhhhhh!!!" << endl; printspace(5); printf("好啦,主人看完排名请按任意键回到菜单哟!"); _getch(); memset(gamecase, 0, sizeof(gamecase));//清理游戏数据 } int main(void) { srand((int)time(NULL));//随机种子 char choice;//游戏是否开始选择 MainDOS(); while (choice = _getch()) { if (choice == ‘Q‘ || choice == ‘q‘) { quit(); love(); return 0; } else if (choice == ‘R‘ || choice == ‘r‘) { char ch; system("cls"); printspace(5); printf("游戏加载中ing......请主人稍等哟\n"); Sleep(1000); playDOS(); while (ch = _getch()) { if (ch == ‘1‘) { system("cls"); gameDOS1(); char temp; int len = 1; while (temp = _getch()) { system("cls"); if (temp == ‘3‘) { quit(); love(); return 0; } else if (temp == ‘1‘) { printspace(5); printf("☆☆ 第%d轮 ☆☆\n", len++); putchar(‘\n‘); printspace(5); printf("☆☆ 你选择的真心话 ☆☆\n"); putchar(‘\n‘); printspace(5); cout << "主人抽中的:" << ZXH[random(randnumber)] << endl; } else if (temp == ‘2‘) { printspace(5); printf("☆☆ 第%d轮 ☆☆\n", len++); putchar(‘\n‘); printspace(5); printf("☆☆ 你选择的大冒险 ☆☆\n"); putchar(‘\n‘); printspace(5); cout << "主人抽中的:" << DMX[random(randnumber)] << endl; } printf("\n\n"); printspace(5); char t; printf("主人请按任意键继续哟!(づ ̄3 ̄)づ╭?~,按Q就可以返回游戏选择界面哦\n"); t = _getch(); if (t == ‘Q‘ || t == ‘q‘) break; system("cls"); gameDOS1(); } } else if (ch == ‘2‘) { system("cls"); printspace(5); printf("游戏介绍: 主人你很幸运哟,多人游戏模式是由xxx开发的最新版本\n"); putchar(‘\n‘); printspace(5); printf("游戏玩的人数的三倍就是游戏的轮数,也就是说两个人进行6轮\n"); putchar(‘\n‘); printspace(5); printf("每一轮系统会抽出一半的人数,作为接受惩罚的人\n"); putchar(‘\n‘); printspace(5); printf("而每次没有收到惩罚的人都会得到5积分的加成,游戏结束将会列出积分排行榜\n"); putchar(‘\n‘); printspace(5); printf("★★主人你要选的多人模式是几个人呢?请在下方输入人数哦,记得按回车哟★★\n"); printspace(5); cin >> gamenumber;//人数输入 printf("\n\n"); printspace(5); printf("主人请分别输入玩家的名字哟,方便待会积分排行榜,可以输入中文名哦\n"); printspace(5); printf("主人每输入一个名字请按回车哟,不然我会当成一个人的名字的\n"); for (int i = 1; i <= gamenumber; ++i) //存储玩家的名字 { printspace(5); cin >> gamecase[i].name; } printspace(5); printf("游戏加载中请主人稍等......"); Sleep(1500); for (int i = 1; i <= gamenumber * 3; ++i) //游戏轮回 { gameDOS2(gamenumber, i); //调用多人游戏界面 } gameokDOS();//调用游戏结束排名清理函数 system("cls"); printspace(5); printf("本轮游戏结束了哟,正在清理游戏数据,请主人稍等哦\n"); Sleep(1500); } else if (ch == ‘3‘)//退出语句 { quit(); love(); return 0; } else//处理输入的其他不相关字符 { system("cls"); printf("主人,我看不懂你的输入呀,请再输入一遍叭\n"); Sleep(1500); } playDOS();//再次调用界面函数,处理不相关字符的再次输入。 } } else//处理错误输入 { system("cls"); printf("唔,你按错了哟主人!再来一次叭"); Sleep(1500); } system("cls"); MainDOS();//调用主界面 } getchar(); return 0; }
是不是觉得很简单呢?
首先来看第一个函数:
void Setcolor(unsigned short ForeColor = 2, unsigned short BackGroundColor = 0) { HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hCon, ForeColor % 16 | BackGroundColor % 16 * 16); }
这个东西,看不懂的不用管,知道这个是调控制台背景色的就行,感兴趣的可以去百度这个Setcolor()函数的定义用法。
bool cmp(struct node a, struct node b) { return a.rating > b.rating; }
这个是为了游戏结束计算各位玩家的rating值用的cmp,感兴趣的可以看看这我的一篇博客:
https://www.cnblogs.com/YHH520/p/12253671.html,比较入门的cmp用法。
void love() { s = 0; Setcolor(15, 0); for (x = 1.3; x >= -1.1; x -= 0.1) { for (y = -2; y <= 1.4; y += 0.053) { if (pow(x * x + y * y - 1, 3) - x * x * x * y * y <= 0) { Setcolor(0, rand() % 6 + 10); printf(" "); Sleep(2); } else { Setcolor(0, 0); printf(" "); } } printf("\n"); } Sleep(1500); }
这个是为了生成爱心的函数,利用的其实就是数学知识,心形函数的画法,感兴趣的可以收藏一下哦,里面的Setcolor是为了生成彩色的爱心?。
效果如图:
void printlen(int n) { for (int i = 0; i < n; ++i) { cout << ‘*‘; } cout << ‘\n‘; }
这个函数就是输出n和*,本来是像用*画界面的,不过后面找到了更好看的?。
void printspace(int n) { for (int i = 0; i < n; ++i) cout << " "; }
这个函数是为了打出一定的空格。
void quit() { system("cls"); printspace(5); printf("再见啦,记得再找我玩哟\t(づ ̄3 ̄)づ╭?~\n"); Sleep(1000); }
游戏退出函数。
void MainDOS() { printspace(5); printlen(50); printspace(5); printf("** welcome to 真心话大冒险 ^_^ **\n"); printspace(5); printf("**"); printspace(46); printf("**\n"); printspace(5); printf("** 游戏规则如下: **\n"); printspace(5); printf("**"); printspace(46); printf("**\n"); printspace(5); printf("**你有两个选择,一个是真心话,另一个就是大冒险哦**\n"); printspace(5); printf("**"); printspace(46); printf("**\n"); printspace(5); printf("** 那么请按R开始游戏叭! **\n"); printspace(5); printf("**"); printspace(46); printf("**\n"); printspace(5); printf("** 按Q可以退出游戏哟! **\n"); printspace(5); printf("**"); printspace(46); printf("**\n"); printspace(5); printlen(50); puts("\n\n\n"); printspace(30); printf("开发者:Mangata--请关注微信公众号哦:代码小帮手\n");//这里可以随便改成你的名字 }
这是第一个界面,也就是游戏的主界面,其实这个完全看个人的风格,可塑性比较强,每个人的界面风格可以是不同的 (只要不太非主流hhhh)
效果如图:
void playDOS() { system("cls"); printspace(5); printf(" O(∩_∩)O~~ 欢迎来到真心话大冒险 (づ ̄3 ̄)づ╭?~\n\n"); printspace(5); printf("╔*☆***◎***◇***☆* 游戏模式 *☆***◇***◎***☆*╗\n"); printspace(5); printf("|★| |★|\n"); printspace(5); printf("|☆| |☆|\n"); printspace(5); printf("|★| 1.单人模式 |★|\n"); printspace(5); printf("|☆| 2.多人模式 |☆|\n"); printspace(5); printf("|★| 3.退出游戏 |★|\n"); printspace(5); printf("|☆| |☆|\n"); printspace(5); printf("|☆| |☆|\n"); printspace(5); printf("╚*☆***◎***◇****☆****★****☆****◇***◎***☆*╝\n\n"); printspace(5); printf("主人请选择你想要玩的游戏哦:"); }
这是选择游戏的界面,比较单一,就是把这个界面打出来这个同样是可以DIY的,大家能改成自己喜欢的界面^^
效果如图:
void gameDOS1() { system("cls"); printspace(5); printf("☆☆☆☆☆ 真心话请按1 ☆☆☆☆☆\n"); printspace(5); printf("★★ ★★\n"); printspace(5); printf("☆☆☆☆☆ 大冒险请按2 ☆☆☆☆☆\n"); printspace(5); printf("★★ ★★\n"); printspace(5); printf("☆☆☆☆☆ 退出游戏请按3 ☆☆☆☆☆\n"); }
这个同上。
效果图:
void randomgame() { char temp; putchar(‘\n‘); gameDOS1(); putchar(‘\n‘); printspace(5); printf("主人选择真心话还是大冒险呢,真心话请按1,大冒险请按2哟\n"); while (temp = _getch()) { if (temp == ‘1‘) { printspace(5); cout << "主人抽中的真心话:" << ZXH[random(randnumber)] << endl; break; } else if (temp == ‘2‘) { printspace(5); cout << "主人抽中的大冒险:" << DMX[random(randnumber)] << endl; break; } else if (temp == ‘3‘) { quit(); love(); exit(0); } else//处理错误输入 { printf("主人你输错啦,请再输入叭"); Sleep(1000); } system("cls"); gameDOS1(); } printspace(5); printf("请主人按任意键继续哦"); _getch(); system("cls"); } void gameDOS2(int number, int lun) { system("cls"); printspace(5); printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n"); puts(" "); printspace(5); printf("★★ %d人游戏第%d轮 ★★\n", number, lun); puts(" "); printspace(5); printf("★★ 下面的人将接受惩罚: ★★\n"); printspace(5); int k = 0; memset(loc, 0, sizeof(loc));//清空人员地址数组 queue<int> p; printspace(5); printf("恭喜序号为:"); while (k < gamenumber / 2)//筛选出总人数一半的人进行惩罚 { int temp = random(gamenumber + 1);//筛选出随机数 while (!temp)//防止0的出现,因为人数是从1开始计数的 { temp = random(gamenumber + 1); } if (!loc[temp])//防止已经被抽到了的玩家再次被抽到 { printspace(5); printf("%d", temp); k++; loc[temp]++;//被抽到的人相应的数组就+1 p.push(temp);//将抽到的玩家按照先后顺序进入队列 } } printf("被惩罚\n"); putchar(‘\n‘); printspace(5); printf("恭喜你们哟,快点接受惩罚吧 O(∩_∩)O\n"); for (int i = 1; i <= gamenumber; ++i)//未被抽到的人进行加分操作 { if (!loc[i]) { gamecase[i].rating += 5; } } printspace(5); printf("请按任意键继续哦"); _getch(); for (int i = 0; i < gamenumber / 2; ++i)//对被抽到的人进行惩罚 { system("cls"); printspace(5); printf("请%d号玩家接受惩罚:\n", p.front()); p.pop(); printspace(5); printf("请按任意键进入惩罚环节\n"); _getch(); randomgame(); printspace(5); if (i == gamenumber / 2 - 1) printf("请按任意键结束本轮所有惩罚"); else printf("请按任意键进行下一个惩罚\n"); _getch(); } }
这两个函数我放在一起,因为这两个函数就是为了多人游戏准备的
第一个randomgame()函数是处理接受惩罚的界面用while防止错误的输入。
第二个函数是打印游戏的轮数以及被抽中惩罚的人的序号,具体细节有注释。
void gameokDOS()//结算界面函数 { system("cls"); sort(gamecase + 1, gamecase + 1 + gamenumber, cmp); printspace(5); printf("主人,又到了排名清算界面了呢,看看你排在第几名叭!\n"); for (int i = 1; i <= gamenumber; ++i) { printspace(5); printf("第%d名\trating=%d\t", i, gamecase[i].rating); cout << gamecase[i].name << endl; } putchar(‘\n‘); printspace(5); cout << gamecase[1].name << "是冠军" << "\tohhhhhhhhhhhhhhhhhhhhhhhhhhhh!!!" << endl; printspace(5); printf("好啦,主人看完排名请按任意键回到菜单哟!"); _getch(); memset(gamecase, 0, sizeof(gamecase));//清理游戏数据 }
这个函数是为了游戏结算分数,用一个sort把rating比较搞的排在前面,然后输出第一名??,memset是为了清空多人游戏的信息,为了下一轮游戏做准备。
函数就是这么点,游戏的设计思路也很简单,以随机数为主,利用srand((int)time(NULL))作为随机种子保证被惩罚的人的随机性,然后通过各种界面函数的调用构成了这个游戏的大框架。
觉得好用的话请点个赞顺便关注微信公众号:代码小帮手
谢谢啦!下次再见啦
标签:memset 好用 etc 彩色 nio 有趣的 inf 有意思 getc
原文地址:https://www.cnblogs.com/YHH520/p/13179417.html