/[eliot]/eliot/game/bag.cpp
ViewVC logotype

Diff of /eliot/game/bag.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.4 by ipkiss, Sun Oct 23 14:53:43 2005 UTC revision 1.4.2.1 by afrab, Sun Oct 23 17:16:23 2005 UTC
# Line 36  Bag::Bag() Line 36  Bag::Bag()
36  void Bag::init()  void Bag::init()
37  {  {
38      m_ntiles = 0;      m_ntiles = 0;
39      const list<Tile>& allTiles = Tile::getAllTiles();      const std::list<Tile>& allTiles = Tile::getAllTiles();
40      list<Tile>::const_iterator it;      std::list<Tile>::const_iterator it;
41      for (it = allTiles.begin(); it != allTiles.end(); it++)      for (it = allTiles.begin(); it != allTiles.end(); it++)
42      {          {
43          m_tilesMap[*it] = it->maxNumber();              m_tilesMap[*it] = it->maxNumber();
44          m_ntiles += it->maxNumber();              m_ntiles += it->maxNumber();
45      }          }
46  }  }
47    
48    
49  unsigned int Bag::in(const Tile &iTile) const  unsigned int Bag::in(const Tile &iTile) const
50  {  {
51      map<Tile, int>::const_iterator it = m_tilesMap.find(iTile);      std::map<Tile, int>::const_iterator it = m_tilesMap.find(iTile);
52      if (it != m_tilesMap.end())      if (it != m_tilesMap.end())
53          return (*it).second;          return (*it).second;
54      return 0;      return 0;
# Line 57  unsigned int Bag::in(const Tile &iTile) Line 57  unsigned int Bag::in(const Tile &iTile)
57    
58  unsigned int Bag::nVowels() const  unsigned int Bag::nVowels() const
59  {  {
60      map<Tile, int>::const_iterator it;      std::map<Tile, int>::const_iterator it;
61      int v = 0;      int v = 0;
62    
63      for (it = m_tilesMap.begin(); it != m_tilesMap.end(); it++)      for (it = m_tilesMap.begin(); it != m_tilesMap.end(); it++)
64      {          {
65          if (it->first.isVowel())              if (it->first.isVowel())
66              v += it->second;                  v += it->second;
67      }          }
68      return v;      return v;
69  }  }
70    
71    
72  unsigned int Bag::nConsonants() const  unsigned int Bag::nConsonants() const
73  {  {
74      map<Tile, int>::const_iterator it;      std::map<Tile, int>::const_iterator it;
75      int c = 0;      int c = 0;
76    
77      for (it = m_tilesMap.begin(); it != m_tilesMap.end(); it++)      for (it = m_tilesMap.begin(); it != m_tilesMap.end(); it++)
78      {          {
79          if (it->first.isConsonant())              if (it->first.isConsonant())
80              c += it->second;                  c += it->second;
81      }          }
82      return c;      return c;
83  }  }
84    
85    
86  void Bag::takeTile(const Tile &iTile)  Tile Bag::selectRandom()
87  {  {
88      ASSERT(in(iTile),      std::map<Tile, int>::const_iterator it;
89             string("The bag does not contain the letter ") + iTile.toChar());      int n;
90        double max = m_ntiles;
91    
92        n = (int)(max * rand() / (RAND_MAX + 1.0));
93        for (it = m_tilesMap.begin(); it != m_tilesMap.end(); it++)
94            {
95                if (n < it->second)
96                    return it->first;
97                n -= it->second;
98            }
99        ASSERT(false, "We should not come here");
100        return Tile::dummy();
101    }
102    
103    
104    void Bag::takeTile(const Tile &iTile)
105    {
106        ASSERT(in(iTile), std::string("The bag does not contain the letter ") + iTile.toChar());
107      m_tilesMap[iTile]--;      m_tilesMap[iTile]--;
108      m_ntiles--;      m_ntiles--;
109  }  }
110    
111    
112  void Bag::replaceTile(const Tile &iTile)  int  Bag::takeRandomTiles(int n, std::vector< Tile >& oTiles)
113    {
114        int i = 0;
115        Tile t;
116        oTiles.clear();
117        while (nTiles() > 0 && i < n)
118            {
119                t = selectRandom();
120                takeTile(t);
121                oTiles.push_back(t);
122                i++;
123            }
124        return (i == n) ? 0 : 1;
125    }
126    
127    
128    void Bag::putbackTile(const Tile &iTile)
129  {  {
130      ASSERT(in(iTile) < iTile.maxNumber(),      ASSERT(in(iTile) < iTile.maxNumber(),
131             string("Cannot replace tile: ") + iTile.toChar());             std::string("Cannot replace tile: ") + iTile.toChar());
132    
133      m_tilesMap[iTile]++;      m_tilesMap[iTile]++;
134      m_ntiles++;      m_ntiles++;
135  }  }
136    
137    
138  Tile Bag::selectRandom()  void Bag::putbackTiles(const std::vector<Tile>& tiles)
139  {  {
140      map<Tile, int>::const_iterator it;      unsigned int i;
141      int n;      for(i=0; i < tiles.size(); i++)
142      double max = m_ntiles;          {
143                putbackTile(tiles[i]);
144      n = (int)(max * rand() / (RAND_MAX + 1.0));          }
     for (it = m_tilesMap.begin(); it != m_tilesMap.end(); it++)  
     {  
         if (n < it->second)  
             return it->first;  
         n -= it->second;  
     }  
     ASSERT(false, "We should not come here");  
     return Tile::dummy();  
145  }  }
146    
147    
148  void Bag::operator=(const Bag &iOther)  void Bag::operator=(const Bag &iOther)
149  {  {
150      m_tilesMap = iOther.m_tilesMap;      m_tilesMap = iOther.m_tilesMap;
151      m_ntiles = iOther.m_ntiles;      m_ntiles   = iOther.m_ntiles;
152  }  }
153    
154    
155  void Bag::dumpAll() const  std::string Bag::toString() const
156  {  {
157      map<Tile, int>::const_iterator it;      char buff[20];
158        std::string rs = "";
159        std::map<Tile, int>::const_iterator it;
160      for (it = m_tilesMap.begin(); it != m_tilesMap.end(); it++)      for (it = m_tilesMap.begin(); it != m_tilesMap.end(); it++)
161      {          {
162          if (it->second)              if (it->second)
163              fprintf(stderr, "%c[%i] ", it->first.toChar(), it->second);                  {
164      }  #ifdef DEBUG
165      fprintf(stderr, "\n");                      sprintf(buff, "%c[%02d][%02d] ",
166  }                              it->first.toChar(),
167                                it->second,
168                                it->second - it->first.maxNumber());
169    #else
170                        sprintf(buff, "%c[%02d] ", it->first.toChar(), it->second);
171    #endif
172                        rs += buff;
173                    }
174            }
175        return rs;
176    }
177    
178    
179    /// Local Variables:
180    /// mode: hs-minor
181    /// c-basic-offset: 4
182    /// End:

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.4.2.1

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26