鄙人這輩子編寫的第一個游戲程序:猜拳! 好激動,共享下c++源代碼
石頭剪子布的猜拳游戲,在VC下編譯運行下,生成的.EXE文件,就可以單獨拿出來玩游戲了。這個游戲屬于1.1版本,最原始的1.0版本主要部分和這個差不多,1.1主要是在原來的基礎上與玩家的交互做了一些更加友好的改進(感謝提出改進意見的宿舍兄弟)
程序基本沒有太大的技術含量,自認為程序核心的部分:電腦隨機給出的猜拳。本人想到了一個很簡單但自認為挺巧妙的方法(小小的驕傲下),不多說了看代碼吧,如果代碼有什么潛在的bug漏洞,或者有更好的改進,請留言回復,非常謝謝。
1
#include<iostream>
2
#include<ctime>
3
using namespace std;
4
5
int win_or_loss(int);//判斷輸贏的子函數
6
void baoshi(time_t&);//給出當前系統時間的子函數
7
void keep_window_open();//讓程序運行完畢后,窗口不立馬消失
8
int 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
//游戲核心代碼,判斷輸贏
130
int 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
}
207
inline 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
216
inline void baoshi(time_t &timeval)
217
{
218
(void)time(&timeval);
219
cout<<"當前北京時間為:"<<ctime(&timeval)<<"\n"<<endl;
220
return;
221
}
#include<iostream>2
#include<ctime>3
using namespace std;4

5
int win_or_loss(int);//判斷輸贏的子函數6
void baoshi(time_t&);//給出當前系統時間的子函數7
void keep_window_open();//讓程序運行完畢后,窗口不立馬消失8
int 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
}else80
{81
cout<<"第"<<i+1<<"次猜拳游戲 ";82
if(t==1)83
cout<<"您猜的拳是:石頭"<<endl;84
else if(t==2)85
cout<<"您猜的拳是:剪刀"<<endl;86
else87
cout<<"您猜的拳是:布"<<endl;88
int n=win_or_loss(t);89
if(n==0)90
++ping;91
else if(n>0)92
++win;//統計贏的次數93
else94
++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
else120
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
//游戲核心代碼,判斷輸贏130
int 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
else176
{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
else188
{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
else200
{201
cout<<"哈哈,笨蛋!輸給電腦了吧!"<<endl;202
return -1;203
}204
break;205
}206
}207
inline 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

216
inline 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 古月 閱讀(3987) 評論(7) 編輯 收藏 引用 所屬分類: C/C++



