blob: 96e3b7e618ce0508b9a6dee9cdc3cbd329e015b8 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
|
// **********************************************************************
//
// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
//
// This copy of Ice is licensed to you under the terms described in the
// ICE_LICENSE file included in this distribution.
//
// **********************************************************************
#include <Ice/Ice.h>
#include <IceUtil/IceUtil.h>
#include <Casino.h>
#include <stdlib.h>
using namespace std;
class CasinoClient : public Ice::Application
{
public:
virtual int run(int, char*[]);
private:
void printBalances(Casino::PlayerPrxSeq&) const;
};
int
main(int argc, char* argv[])
{
CasinoClient app;
return app.main(argc, argv, "config.client");
}
int
CasinoClient::run(int argc, char* argv[])
{
if(argc > 1)
{
cerr << appName() << ": too many arguments" << endl;
return EXIT_FAILURE;
}
//
// Initialize pseudo-random number generator
//
srand((unsigned int)IceUtil::Time::now().toMicroSeconds());
cout << "Retrieve bank and players... " << flush;
Casino::BankPrx bank = Casino::BankPrx::uncheckedCast(communicator()->propertyToProxy("Bank.Proxy"));
Casino::PlayerPrxSeq players = bank->getPlayers();
cout << "ok" << endl;
cout << "Starting balances" << endl;
printBalances(players);
cout << "Current bank earnings: " << bank->getEarnings() << " chips" << endl;
cout << "All chips accounted for? " << (bank->checkAllChips() ? "yes" : "no") << endl;
cout << "Each player buys 3,000 chips... " << flush;
for(size_t i = 0; i < players.size(); ++i)
{
Casino::PlayerPrx player = players[i];
if(player != 0)
{
if(!bank->buyChips(3000, player))
{
cout << "(" << player->ice_getIdentity().name << "is gone) " << flush;
players[i] = 0;
}
}
}
cout << "ok" << endl;
cout << "All chips accounted for? " << (bank->checkAllChips() ? "yes" : "no") << endl;
cout << "Create 500 10-chips bets... " << flush;
int b;
for(b = 0; b < 500; ++b)
{
Casino::BetPrx bet = bank->createBet(10, 200 + rand() % 4000);
for(size_t i = 0; i < players.size(); ++i)
{
Casino::PlayerPrx player = players[i];
if(player != 0)
{
try
{
bet->accept(player);
}
catch(const Ice::ObjectNotExistException&)
{
//
// Bet already resolved
//
}
catch(const Casino::OutOfChipsException&)
{
cout << "(" << player->ice_getIdentity().name << " is out) " << flush;
players[i] = 0;
}
}
}
}
cout << " ok" << endl;
cout << "Live bets: " << bank->getLiveBetCount() << endl;
int index = rand() % players.size();
Casino::PlayerPrx gonner = players[index];
players[index] = 0;
if(gonner != 0)
{
cout << "Destroying " << gonner->ice_getIdentity().name + "... " << flush;
try
{
gonner->destroy();
}
catch(const Ice::ObjectNotExistException&)
{
//
// Ignored
//
}
cout << "ok" << endl;
}
cout << "All chips accounted for? " << (bank->checkAllChips() ? "yes" : "no") << endl;
cout << "Sleep for 2 seconds" << endl;
IceUtil::ThreadControl::sleep(IceUtil::Time::seconds(2));
cout << "Live bets: " << bank->getLiveBetCount() << endl;
cout << "Create 100 10-chips bets... " << flush;
for(b = 0; b < 100; ++b)
{
Casino::BetPrx bet = bank->createBet(10, 200 + rand() % 4000);
for(size_t i = 0; i < players.size(); ++i)
{
Casino::PlayerPrx player = players[i];
if(player != 0)
{
try
{
bet->accept(player);
}
catch(const Ice::ObjectNotExistException&)
{
//
// Bet already resolved
//
}
catch(const Casino::OutOfChipsException&)
{
cout << "(" << player->ice_getIdentity().name << " is out) " << flush;
players[i] = 0;
}
}
}
}
cout << " ok" << endl;
cout << "Live bets: " << bank->getLiveBetCount() << endl;
cout << "Sleep for 10 seconds" << endl;
IceUtil::ThreadControl::sleep(IceUtil::Time::seconds(10));
cout << "Live bets: " << bank->getLiveBetCount() << endl;
cout << "Ending balances" << endl;
printBalances(players);
cout << "Current bank earnings: " << bank->getEarnings() << " chips" << endl;
cout << "All chips accounted for? " << (bank->checkAllChips() ? "yes" : "no") << endl;
return 0;
}
void
CasinoClient::printBalances(Casino::PlayerPrxSeq& players) const
{
for(size_t i = 0; i < players.size(); ++i)
{
Casino::PlayerPrx player = players[i];
if(player != 0)
{
try
{
int chips = player->getChips();
cout << player->ice_getIdentity().name << ": " << chips << " chips" << endl;
}
catch(const Ice::ObjectNotExistException&)
{
//
// This player is gone
//
players[i] = 0;
}
}
}
}
|