C++课程设计—猜拳游戏
文章目录
简介
给别人写的大二自动化《软件技术基础》课设,要求实现一个猜拳游戏的账号的注册、登录与游戏记录、排名。算是目前做过的所有课设里最最折腾的一个了,主要的麻烦在于C++中io流的使用,这一点上C++真的比C人性化多了,不用指针一个个地去扎,但是同时也逼着自己好好地学习了一把文件流的操作。
代码
#include<iostream>
#include<fstream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<ctime>
#include<cstring>
void Display();//调用display显示switch()菜单
void Register();//注册
void Enter();//登录
using namespace std;
int flag;
int main()
{
Display();//显示菜单 1注册;2登录
cin.get();
return 0;
}
bool cmp(float a,float b){
return a>b;
}
void Register()//注册
{
ofstream outFile("web1.txt");//把注册的ID、code保存到web1.txt文件当中
if(!outFile.is_open())//如果没有成功打开文件
{
cout<<"很遗憾,连接不上服务器";
cout<<"程序结束";
cin.get();
exit(EXIT_FAILURE);
}
string name;
string code;
cout<<"Please Enter members name请输入用户名名称: ";
cin.get();//吃掉空字符
getline(cin,name);
//占位,假设输入的用户名超出长度或太短
outFile<<name<<endl;//记录注册的资料到web1.txt文件中
cout<<"Please Enter members code请输入密码: ";
getline(cin,code);
//占位,假设输入的密码超出长度或太短
outFile<<code<<endl;//记录注册的资料到web1.txt文件中
cout<<"注册成功!";
outFile.close();
Display();
}
void Enter()//登录
{
cin.get();
ifstream inFile;//定义ifstream对象
inFile.open("web1.txt");//读取web1.txt文件中的注册资料
if(!inFile.is_open())//如果文件没有成功打开
{
cout<<"很遗憾,连接不上服务器";
exit(EXIT_FAILURE);
}
string name;
string code;
string temp;
string temp0;
cout<<"Please Enter members name请输入用户名名称: ";
getline(cin,name);
while(getline(inFile,temp))//匹配用户名
{
if(temp==name)//如果匹配用户名成功
{
cout<<"Please Enter members code请输入密码: ";//请输入密码
getline(cin,code);//code
getline(inFile,temp);//匹配code
if(temp==code)//如果密码正确,登录成功
{
cout<<"登录成功";
//占位,登录成功应该转到程序主题
int cnt=0;
int total=0;
char gamer; // 玩家出拳
int computer; // 电脑出拳
int result; // 比赛结果
// 为了避免玩一次游戏就退出程序,可以将代码放在循环中
while (1){
printf("这是一个猜拳的小游戏,请输入你要出的拳头:\n");
printf("A:剪刀\nB:石头\nC:布\nD:不玩了\n");
scanf("%c%*c",&gamer);
switch (gamer){
case 65 | 97: // A | a
gamer=4; break;
case 66 | 98: // B | b
gamer=7; break;
case 67 | 99: // C | c
gamer=10; break;
case 68 | 100: // D | d
exit(0);
break;
}
srand((unsigned)time(NULL)); // 随机数种子
computer=rand()%3; // 产生随机数并取余,得到电脑出拳
result=(int)gamer+computer; // gamer 为 char 类型,数学运算时要强制转换类型
printf("电脑出了");
switch (computer)
{
case 0:printf("剪刀\n");break; //4 1
case 1:printf("石头\n");break; //7 2
case 2:printf("布\n");break; //10 3
}
printf("你出了");
switch (gamer)
{
case 4:printf("剪刀\n");break;
case 7:printf("石头\n");break;
case 10:printf("布\n");break;
}
if (result==6||result==7||result==11){
cnt++;
total++;
printf("你赢了\n");
}
else if (result==5||result==9||result==10){
cnt--;
total++;
printf("电脑赢了!");
}
else{
total++;
printf("平手");
}
float pro;
pro=float(cnt/total);//计算胜率
ofstream of("rank.txt");
of<<pro<<endl;
of.close();
}
}
}
else
{
cout<<"密码错误";
Display();//返回!
}
}
}
void Display()//菜单
{
cout<<"1)Register注册 2)Enter登录\n3)Exit退出\n4)查看排行榜\nChoice:";
int choice;//选择菜单
cin>>choice;
switch(choice)
{
case 1://注册
Register();//call function调用函数
break;
case 2://登录
Enter();//call function调头函数
break;
case 3://退出
exit(EXIT_FAILURE);
case 4://查看排名
float res[10];
memset(res,0,sizeof(res));
ifstream inf("rank.txt");
for(int j=0;j<10;j++){
inf>>res[j];
}
sort(res,res+10,cmp);
for(int j=0;j<10;j++){
cout<<res[j]<<endl;
}
}
}