鄙人这辈子编写的第一个游戏程序:猜拳! 好激动,共享下c++源代码

石头剪子布的猜拳游戏,在VC下编译运行下,生成的.EXE文件,就可以单独拿出来玩游戏了。
这个游戏属于1.1版本,最原始的1.0版本主要部分和这个差不多,1.1主要是在原来的基础上与玩家的交互做了一些更加友好的改进(感谢提出改进意见的宿舍兄弟)
程序基本没有太大的技术含量,自认为程序核心的部分:电脑随机给出的猜拳。本人想到了一个很简单但自认为挺巧妙的方法(小小的骄傲下),不多说了看代码吧,如果代码有什么潜在的bug漏洞,或者有更好的改进,请留言回复,非常谢谢。
  1#include<iostream>
  2#include<ctime>
  3using namespace std;
  4
  5int win_or_loss(int);//判断输赢的子函数
  6void baoshi(time_t&);//给出当前系统时间的子函数
  7void keep_window_open();//让程序运行完毕后,窗口不立马消失
  8int main()
  9{
 10    time_t the_time_1,the_time_2;
 11
 12    char q;
 13    int win(0),loss(0),ping(0);
 14    double gailv(0),sum(0);
 15    cout<<"欢迎您玩 石头-剪子-布 游戏(游戏作者:XXX)  版本 1.1\n"<<endl;
 16    cout<<"请合理安排时间,切勿沉迷于游戏!\n"<<endl;
 17
 18    baoshi(the_time_1);
 19    cout<<"游戏说明:数字1代表石头    数字2代表剪子    数字3代表布\n"<<endl;    
 20
 21    
 22    
 23    
 24    do{
 25        cout<<"\n请问您一共想要玩几次猜拳游戏,请输入大于0的正整数(建议您至少玩十次):"<<endl;
 26        double times;
 27        //输入的次数必须为大于0的正整数,不可为0,负数,浮点数,字符或者是字符串,如果出现非法输入,下面代码是用来处理这些非法输入
 28        while(!(cin>>times))
 29        {
 30            cout<<"您的输入不合法,必须为一个数字,请重新输入:"<<endl;
 31            cin.clear();
 32            cin.sync();
 33        }

 34        if(times<=0)
 35        {
 36            cout<<"您的输入不合法,必须为正整数!\n"<<endl;
 37            cin.clear();
 38            cin.sync();
 39            q='y';
 40            continue;
 41        }

 42        else if(times!=int(times))
 43        {
 44            cout<<"您的输入不合法,必须为正整数!\n"<<endl;
 45            cin.clear();
 46            cin.sync();
 47            q='y';
 48            continue;
 49        }

 50        //游戏正式开始
 51        for(int i=0;i<times;++i)
 52        {
 53            cout<<"\n请输入您打算猜的拳(用数字123代替,数字1代表石头  数字2代表剪子  数字3代表布)"<<endl;
 54        
 55            while(1)
 56            {
 57                double t;
 58                cin>>t;
 59                if(cin.bad())
 60                {
 61                    cerr<<"Sorry,出现了系统故障,请重新运行游戏!\n"<<endl;
 62                    return 1;
 63                }

 64                //用来处理非法输入
 65                if(cin.fail())
 66                {
 67                    cerr<<"Sorry!,请您必须输入一个合法的数字(1 or 2 or 3)"<<endl;
 68                    cout<<"请输入您打算猜的拳(用数字123代替)"<<endl;
 69                    cin.clear();
 70                    cin.sync();
 71                    continue;
 72                }
else if(t!=1&&t!=2&&t!=3)
 73                {
 74                    cerr<<"Sorry!,请您必须输入一个合法的数字(1 or 2 or 3)\n"<<endl;
 75                    cout<<"请输入您打算猜的拳(用数字123代替)\n"<<endl;
 76                    cin.clear();
 77                    cin.sync();
 78                    continue;
 79                }
else
 80                {
 81                    cout<<""<<i+1<<"次猜拳游戏 ";
 82                    if(t==1)
 83                        cout<<"您猜的拳是:石头"<<endl;
 84                    else if(t==2)
 85                        cout<<"您猜的拳是:剪刀"<<endl;
 86                    else
 87                        cout<<"您猜的拳是:布"<<endl;
 88                    int n=win_or_loss(t);
 89                    if(n==0)
 90                        ++ping;
 91                    else if(n>0)
 92                        ++win;//统计赢的次数
 93                    else
 94                        ++loss;//统计输的次数
 95                    break;
 96                }

 97            }

 98            if(i==times-1)
 99                cout<<"您的猜拳次数已经达到您所设定的"<<times<<"次\n"<<endl;
100        }

101            cout<<"请问是否还要继续本游戏(Y/other)"<<endl;
102            cin>>q;//在玩够开始自己所设的次数后,如果仍然打算继续,则输入'y'
103    }
while(q=='Y'||q=='y');
104    
105    //对整个游戏过程做一个完整统计
106    sum=win+loss+ping;
107    gailv=win/sum;
108    cout<<"\n本次游戏您一共猜拳:"<<sum<<""<<endl;
109    cout<<"其中一共胜利:"<<win<<""<<endl;
110    cout<<"其中一共输了:"<<loss<<""<<endl;
111    cout<<"其中一共打平:"<<ping<<""<<endl;
112    cout<<"您的胜率为:"<<gailv*100<<"%"<<endl;
113    cout<<"您的败率为:"<<loss/sum*100<<"%"<<endl;
114    cout<<"您的打平的概率为:"<<(1-loss/sum-gailv)*100<<"%"<<endl;
115    if(sum<10)
116        cout<<"由于您猜拳的次数小于10次,不具有统计学意义,所以您与电脑到底谁厉害,无法评判,请大侠重新来过!\n"<<endl;
117    else if(gailv<0.4)
118        cout<<"您真是个菜鸟,连二进制的电脑都比不过,笨死了!\n"<<endl;
119    else
120        cout<<"大侠好厉害啊,竟然赢了电脑,佩服佩服,看来我得重新写代码啊\n"<<endl;
121    
122    baoshi(the_time_2);
123    cout<<"本次游戏您一共花费了:"<<the_time_2-the_time_1<<"秒\n"<<endl;
124
125    keep_window_open();
126    return 0;
127}

128
129//游戏核心代码,判断输赢
130int win_or_loss(int t)
131{
132    time_t the_time;
133    struct tm *tm_ptr;
134    int rec_sec;
135
136    //电脑的猜拳最好的办法是设定一组完全的随机数,但是一般很难设计出完全的随机数,因此想了一个很巧妙的方法,取玩游戏时的系统时间的秒,根据当前的秒,电脑给出相应猜出的拳
137    //这样用一种相对比较随机的方法,即便玩游戏的人知道了随机数的规律,也很难完全获胜
138    the_time=time((time_t *)0);
139    tm_ptr=gmtime(&the_time);
140    rec_sec=tm_ptr->tm_sec;
141
142
143    int ans;
144    //switch中主要分了三种情况,第一种是60以内的素数,然后又添加了几个其他的,凑够20;第二种是能被3除开的,然后再添加几个凑成20个;剩下的为第三种
145    switch(rec_sec)
146    {
147    case 2:case 8:case 5:case 7:case 11:case 13:case 17:case 19:case 23:case 29:case 31:case 37:case 41:case 43:case 47:case 53:case 59:case 22:case 38:case 56:
148        cout<<"电脑游戏程序的猜的拳是:石头"<<endl;
149        ans=1;
150        break;
151    case 0:case 3:case 6:case 9:case 12:case 15:case 18:case 21:case 24:case 27:case 30:case 33:case 36:case 39:case 42:case 45:case 48:case 51:case 54:case 57:
152        cout<<"电脑游戏程序的猜的拳是:剪子"<<endl;
153        ans=2;
154        break;
155    default:
156        cout<<"电脑游戏程序的猜的拳是:布"<<endl;
157        ans=3;
158        break;
159    }

160
161    if(t==ans)
162    {
163        cout<<"您这次和电脑打了一个平手!"<<endl;
164        return 0;
165    }

166    
167    switch(t)
168    {
169    case 1:
170        if(ans==2)
171        {
172            cout<<"恭喜您!您这次是侥幸赢了电脑!\n"<<endl;
173            return 1;
174        }

175        else
176        {
177            cout<<"哈哈,笨蛋!输给电脑了吧!"<<endl;
178            return -1;
179        }

180        break;
181    case 2:
182        if(ans==3)
183        {
184            cout<<"恭喜您!您这次是侥幸赢了电脑\n"<<endl;
185            return 1;
186        }

187        else
188        {
189            cout<<"哈哈,笨蛋!输给电脑了吧!"<<endl;
190            return -1;
191        }

192        break;
193    case 3:
194        if(ans==1)
195        {
196            cout<<"恭喜您!您这次是侥幸赢了电脑\n"<<endl;
197            return 1;
198        }

199        else
200        {
201            cout<<"哈哈,笨蛋!输给电脑了吧!"<<endl;
202            return -1;
203        }

204        break;
205    }

206}

207inline void keep_window_open()
208{
209    cin.clear();
210    cout << "Please enter a character to exit\n";
211    char ch;
212    cin >> ch;
213    return;
214}

215
216inline void baoshi(time_t &timeval)
217{
218    (void)time(&timeval);
219    cout<<"当前北京时间为:"<<ctime(&timeval)<<"\n"<<endl;
220    return;
221}

posted on 2012-01-13 22:30 古月 阅读(3861) 评论(7)  编辑 收藏 引用 所属分类: C/C++

评论

# re: 鄙人这辈子编写的第一个游戏程序:猜拳! 好激动,共享下c++源代码[未登录] 2012-01-13 22:47 foxtail

....  回复  更多评论   

# re: 鄙人这辈子编写的第一个游戏程序:猜拳! 好激动,共享下c++源代码 2012-01-14 07:36 Mensch88

先鼓掌鼓励一下
不过我想以时间为种子用随机函数rand()会更好些  回复  更多评论   

# re: 鄙人这辈子编写的第一个游戏程序:猜拳! 好激动,共享下c++源代码 2012-01-14 09:02 right

代码乱,命名不规范,风格不统一,逻辑太简单,如果初学的话,也算正常,慢慢的会懂,如果不是的话,建议lz提高这些方面的修养  回复  更多评论   

# re: 鄙人这辈子编写的第一个游戏程序:猜拳! 好激动,共享下c++源代码 2012-01-14 13:08 古月

谢谢了,您说的那个rand()函数我还没有接触过,我研究下您说的思路,试试看@Mensch88
  回复  更多评论   

# re: 鄙人这辈子编写的第一个游戏程序:猜拳! 好激动,共享下c++源代码 2012-01-14 13:09 古月

非常感谢您的宝贵意见,确实有些乱,命名不太规范,以后一定注意提高,谢谢@right
  回复  更多评论   

# re: 鄙人这辈子编写的第一个游戏程序:猜拳! 好激动,共享下c++源代码 2012-01-14 17:32 Zblc

哈哈 已经算很不错啦 继续加油啊  回复  更多评论   

# re: 鄙人这辈子编写的第一个游戏程序:猜拳! 好激动,共享下c++源代码 2012-01-16 20:16 BreakMind

楼主,加油。

写得很不错,我当年连C++都搞不明白是什么东西,拿着C++当C语言使用。  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2012年9月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

导航

统计

常用链接

留言簿

随笔分类

随笔档案

文章档案

C++/C

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜