Wednesday, 28 September 2016

HORSE RACE GAME PROGRAM CODE IN CPP


#include<iostream.h>
#include<stdlib.h>
#include<time.h>

void title_screen();
void generate_odds(int odds[],int size);
void get_cash(int stats[], int pl_num);
void bet(int stats[],int pl_num, int odds[]);
void disp_odds(int odds[]);
int move_horse(int odds[], int horse);
int payoff(int winner, int player[], int pl_num);
void disp_race(int positions[]);
void final_results(int player1[],int player2[]);

int main()
{
    int odds[8];
    int player1[5], player2[5];
    int position[8]={0,0,0,0,0,0,0,0};
    int count;
    int winner;
    char more_race='Y';

//Player array, slot0=money total, slot1=horse bet on, slot2=bet amount, slot3=odds of bet
//slot4=original cash level.
    srand(time(0));

    title_screen();
    get_cash(player1,1);
    get_cash(player2,2);

    do
    {
    for(count=0;count<8;count++)
        position[count]=0;
    winner=6000;
    generate_odds(odds,8);
    disp_odds(odds);
    bet(player1,1,odds);
    disp_odds(odds);
    bet(player2,2,odds);

    do
    {
    for(count=0;count<8;count++)
        {   
        position[count]+=move_horse(odds, count);
        if(position[count]>=50)
            winner=count;
        }
    disp_race(position);
    }
    while(winner==6000);
   
    cout<<"\nThe winning horse is horse "<<winner+1<<endl;
    player1[0]+=payoff(winner, player1,1);
    player2[0]+=payoff(winner, player2,2);

    if((player1[0]<=0)||(player2[0]<=0))
        more_race='n';
    else
        {
        cout<<"\nWould you like another race? (Y/N)\n";
        cin>>more_race;
        }
    }
    while((more_race=='Y')||(more_race=='y'));

    final_results(player1,player2);

    return 0;
}

void title_screen()
{

cout<<"         LET'S RACE AND WIN   ";

}

void generate_odds(int odds[], int size)
{
//This function calculates the odds for each horse at the begining of each race
    int count;

    for(count=0;count<size;count++)
        {
        odds[count]=((rand()%5)+1)*2;
        }
}

void get_cash(int stats[], int pl_num)
{
//Gets the player's initial cash fund.
//This function may eventually be replaced by a set amount of cash.
    cout<<"How much money will player "<<pl_num<<" start with?\n";
    cin>> stats[0];
    stats[4]=stats[0];
}

void bet(int stats[],int pl_num, int odds[])
{
//This function takes bets at the begining of a race.  It is designed to
//Only allow bets on real horses and to only let pleyers bet within thier bank accout
    int horse_num;
    cout<<"\nPlayer "<<pl_num<<", you have "<<stats[0]<<" dollars.\n";
   
    do
    {
    cout<<"Which horse will you bet on?\n";
    cin>> horse_num;

    stats[1]=horse_num;

    if((stats[1]<=0)||(stats[1]>=9))
        cout<<"That is an invalid choice\n\n";

    }
    while((stats[1]<=0)||(stats[1]>=9));

    stats[3]=odds[horse_num-1];

    do
    {
    cout<<"\nHow much will you bet on that horse?\n";
    cin>> stats[2];

    if(stats[2]>stats[0])
        cout<<"\nYou can't bet more then you have!\n\n";
    else if(stats[2]<=0)
        cout<<"\nYou must bet at least 1 dollar.\n\n";

    }
    while((stats[2]>stats[0])||(stats[2]<=0));
   
    stats[0]-=stats[2];

    cout<<endl;
}

void disp_odds(int odds[])
{
//This function displays the odds for each horse at the begining of each race
    int count;
   
    cout<<endl;

    for(count=0;count<8;count++)
        {
        cout<<"The odds on Horse "<<count+1<<" are: 1 in "<<odds[count]<<endl;
        }
}

int move_horse(int odds[], int horse)
{
//This function will move a horse based on it's odds of winning
    int move;
    move=5-(odds[horse])/2+(rand()%6);
    return move;
}

int payoff(int winner, int player[], int pl_num)
{
//This function pays out any winning bets
    int amount=0;

    if((player[1]-1)==winner)
        {
        cout<<"\nCongratulations player "<<pl_num<<", you are a winner.\n";
        amount+=player[3]*player[2];
        cout<<"\nYou've won "<<amount<<" dollars!\n";
        }
    else
        cout<<"\nSorry player "<<pl_num<<", your horse lost.\n";

    return amount;
}

void disp_race(int positions[])
{
//This function displays the race as a series of Xs for each horse's movement
    int count, count2;
    char nothing;

    cout<<"\nHorse       Distance                                          |FIN\n";

    for(count=0;count<8;count++)
        {
        cout<<"Horse "<<count+1<<"     ";
       
        for(count2=0;count2<positions[count];count2++)
            cout<<"X";

        cout<<endl;
        }

    cout<<"\n Type 'C' to continue\n";
    cin>>nothing;

    if(nothing=='E')
        cout<<"\nEASTER EGG!  ARRAYS SHOULD BE NUMBERED STARTING AT 1! THINGS WOULD BE EASIER!\n";
    if(nothing=='G')
        cout<<"\nWhat are you trying to prove?\n";

    return;
}

void final_results(int player1[],int player2[])
{
//This function should calculate the winner based on who gained the most.
//It should be altered to figure based on percentage gained and not actual gain
//As a person with 10000 to bet will surely be able to gain more then a person with 100.
    cout<<"\nPlayer 1 ended up with "<<player1[0]<<" dollars for a gain of: ";
    cout<<(player1[0]-player1[4])<<".\n";
    cout<<"\nPlayer 2 ended up with "<<player2[0]<<" dollars for a gain of: ";
    cout<<(player2[0]-player2[4])<<".\n";

    if((player1[0]-player1[4])>(player2[0]-player2[4]))
        cout<<"\nPlayer 1 is the winner.\n";
    else if((player2[0]-player2[4])>(player1[0]-player1[4]))
        cout<<"\nPlayer 2 is the winner.\n";
    else
        cout<<"\nIt's a tie!\n";
}

Murder Case Game Program Code in C++










#include<iostream>
#include<string>
#include<stdlib>

using namespace std;

int main()
{
    int ans1, ans2, ans3;
    int answer;

    cout << "\n Who killed Mr. Boddy! \n 1. Ms. Scarlet,\n 2. Colonel Mustard,\n 3. Mrs. White \n 4. Mr. Green,\n 5. Mrs. Peacock,\n 6. Professor Plum \n\n ";
    cin >> ans1;
    int i=1;
    while(i<7) {
        answer = rand() % i + 1;
        i++;
    }
    cout<<"\n The right answer is option  : "<<answer;
    if(answer==ans1)
        cout<<"You've done it! You've solved the case!";
    switch(answer) {
    case 1:
        cout<<" It was Ms. Scarlet \n ";
        break;
    case 2:
        cout<<"It was Colonel Mustard \n ";
        break;
    case 3:
        cout<<"It was Mrs. White \n !";
        break;
    case 4:
        cout<<"It was Mr. Green \n ";
        break;
    case 5:
        cout<<"It was Mrs. Peacock \n";
        break;
    case 6:
        cout<<"It was Professor Plum \n";
        break;
    default:
        cout<<"Sorry! Invalid Choice! ";
    }

    cout << "\n What Weapon Was Used? \n \n 1. Candlestick \n 2. Knife  \n 3. Lead pipe \n 4. Revolver \n 5. Rope \n 6. Wrench";
    cin >> ans2;
    i=1;
    while(i<7) {
        answer = rand() % i + 1;
        i++;
    }
    cout<<"\n The right answer is option  : "<<answer;
    if(ans2==answer)
        cout<<"You've done it! You've solved the case!";
    switch (answer) {
    case 1:
        cout<<" It was by  Candlestick \n ";
        break;
    case 2:
        cout<<"It was by Knife \n ";
        break;
    case 3:
        cout<<"It was by Lead pipe \n !";
        break;
    case 4:
        cout<<"It was by  Revolver \n ";
        break;
    case 5:
        cout<<"It was by  Rope  \n";
        break;
    case 6:
        cout<<"It was by  Wrench  \n";
        break;
    default:
        cout<<"Sorry! Invalid Choice! \n";
    }

    cout << "\n Where was Mr. Boddy Killed? \n \n 1. Lounge \n 2. Humanities Building \n 3. Parking Lot \n 4. Kitchen \n 5. Ball room  \n 6. Conservatory \n 7. Billiard room \n 8. Library 9. Study room \n  ";
    cin >> ans3;
    i=1;
    while(i<10) {
        answer = rand() % i + 1;
        i++;
    }
    cout<<"\n The right answer is option  : "<<answer;
    if(ans3==answer)
        cout<<"You've done it! You've solved the case! \n";
    switch (answer) {
    case 1:
        cout<<" at 1. Hall \n ";
        break;
    case 2:
        cout<<"at 2. Loung \n ";
        break;
    case 3:
        cout<<"at 3. Dining room \n ";
        break;
    case 4:
        cout<<"at 4. Kitchen \n ";
        break;
    case 5:
        cout<<"at 5. Ball room \n";
        break;
    case 6:
        cout<<"at 6. Conservatory \n";
        break;
    case 7:
        cout<<"at 7. Billiard room \n";
        break;
    case 8:
        cout<<"at 8. Library \n";
        break;
    case 9:
        cout<<"at 9. Study room \n ";
        break;
    default:
        cout<<"Sorry! Invalid Choice! \n ";
    }
    return 0;
}

Thursday, 22 September 2016

Polymorphism


Before getting any deeper into this chapter, you should have a proper understanding of pointers and class inheritance. If you are not really sure of the meaning of any of the following expressions, you should review the indicated sections:
Statement:
Explained in:
int A::b(int c) { }
a->b
class A: public B {};

Pointers to base class
One of the key features of class inheritance is that a pointer to a derived class is type-compatible with a pointer to its base class. Polymorphism is the art of taking advantage of this simple but powerful and versatile feature.

The example about the rectangle and triangle classes can be rewritten using pointers taking this feature into account:
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
// pointers to base class
#include <iostream>
using namespace std;

class Polygon {
  protected:
    int width, height;
  public:
    void set_values (int a, int b)
      { width=a; height=b; }
};

class Rectangle: public Polygon {
  public:
    int area()
      { return width*height; }
};

class Triangle: public Polygon {
  public:
    int area()
      { return width*height/2; }
};

int main () {
  Rectangle rect;
  Triangle trgl;
  Polygon * ppoly1 = &rect;
  Polygon * ppoly2 = &trgl;
  ppoly1->set_values (4,5);
  ppoly2->set_values (4,5);
  cout << rect.area() << '\n';
  cout << trgl.area() << '\n';
  return 0;
}
20
10


Function 
main declares two pointers to Polygon (named ppoly1 and ppoly2). These are assigned the addresses of rect andtrgl, respectively, which are objects of type Rectangle and Triangle. Such assignments are valid, since both Rectangleand Triangle are classes derived from Polygon.

Dereferencing 
ppoly1 and ppoly2 (with *ppoly1 and *ppoly2) is valid and allows us to access the members of their pointed objects. For example, the following two statements would be equivalent in the previous example:
1
2
ppoly1->set_values (4,5);
rect.set_values (4,5);


But because the type of 
ppoly1 and ppoly2 is pointer to Polygon (and not pointer to Rectangle nor pointer to Triangle), only the members inherited from Polygon can be accessed, and not those of the derived classes Rectangle and Triangle. That is why the program above accesses the area members of both objects using rect and trgl directly, instead of the pointers; the pointers to the base class cannot access the area members.

Member 
area could have been accessed with the pointers to Polygon if area were a member of Polygon instead of a member of its derived classes, but the problem is that Rectangle and Triangle implement different versions of area, therefore there is not a single common version that could be implemented in the base class.


Virtual members
A virtual member is a member function that can be redefined in a derived class, while preserving its calling properties through references. The syntax for a function to become virtual is to precede its declaration with the virtual keyword:
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
// virtual members
#include <iostream>
using namespace std;

class Polygon {
  protected:
    int width, height;
  public:
    void set_values (int a, int b)
      { width=a; height=b; }
    virtual int area ()
      { return 0; }
};

class Rectangle: public Polygon {
  public:
    int area ()
      { return width * height; }
};

class Triangle: public Polygon {
  public:
    int area ()
      { return (width * height / 2); }
};

int main () {
  Rectangle rect;
  Triangle trgl;
  Polygon poly;
  Polygon * ppoly1 = &rect;
  Polygon * ppoly2 = &trgl;
  Polygon * ppoly3 = &poly;
  ppoly1->set_values (4,5);
  ppoly2->set_values (4,5);
  ppoly3->set_values (4,5);
  cout << ppoly1->area() << '\n';
  cout << ppoly2->area() << '\n';
  cout << ppoly3->area() << '\n';
  return 0;
}
20
10
0


In this example, all three classes (
PolygonRectangle and Triangle) have the same members: widthheight, and functions set_values and area.

The member function 
area has been declared as virtual in the base class because it is later redefined in each of the derived classes. Non-virtual members can also be redefined in derived classes, but non-virtual members of derived classes cannot be accessed through a reference of the base class: i.e., if virtual is removed from the declaration of area in the example above, all three calls to area would return zero, because in all cases, the version of the base class would have been called instead.

Therefore, essentially, what the 
virtual keyword does is to allow a member of a derived class with the same name as one in the base class to be appropriately called from a pointer, and more precisely when the type of the pointer is a pointer to the base class that is pointing to an object of the derived class, as in the above example.

A class that declares or inherits a virtual function is called a polymorphic class.

Note that despite of the virtuality of one of its members, 
Polygon was a regular class, of which even an object was instantiated (poly), with its own definition of member area that always returns 0.


Abstract base classes
Abstract base classes are something very similar to the Polygon class in the previous example. They are classes that can only be used as base classes, and thus are allowed to have virtual member functions without definition (known as pure virtual functions). The syntax is to replace their definition by =0 (an equal sign and a zero):

An abstract base 
Polygon class could look like this:
1
2
3
4
5
6
7
8
9
// abstract class CPolygon
class Polygon {
  protected:
    int width, height;
  public:
    void set_values (int a, int b)
      { width=a; height=b; }
    virtual int area () =0;
};


Notice that 
area has no definition; this has been replaced by =0, which makes it a pure virtual function. Classes that contain at least one pure virtual function are known as abstract base classes.

Abstract base classes cannot be used to instantiate objects. Therefore, this last abstract base class version of 
Polygoncould not be used to declare objects like:

Polygon mypolygon;   // not working if Polygon is abstract base class


But an abstract base class is not totally useless. It can be used to create pointers to it, and take advantage of all its polymorphic abilities. For example, the following pointer declarations would be valid:
1
2
Polygon * ppoly1;
Polygon * ppoly2;


And can actually be dereferenced when pointing to objects of derived (non-abstract) classes. Here is the entire example:
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
// abstract base class
#include <iostream>
using namespace std;

class Polygon {
  protected:
    int width, height;
  public:
    void set_values (int a, int b)
      { width=a; height=b; }
    virtual int area (void) =0;
};

class Rectangle: public Polygon {
  public:
    int area (void)
      { return (width * height); }
};

class Triangle: public Polygon {
  public:
    int area (void)
      { return (width * height / 2); }
};

int main () {
  Rectangle rect;
  Triangle trgl;
  Polygon * ppoly1 = &rect;
  Polygon * ppoly2 = &trgl;
  ppoly1->set_values (4,5);
  ppoly2->set_values (4,5);
  cout << ppoly1->area() << '\n';
  cout << ppoly2->area() << '\n';
  return 0;
}
20
10


In this example, objects of different but related types are referred to using a unique type of pointer (
Polygon*) and the proper member function is called every time, just because they are virtual. This can be really useful in some circumstances. For example, it is even possible for a member of the abstract base class Polygon to use the special pointerthis to access the proper virtual members, even though Polygon itself has no implementation for this function:
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
// pure virtual members can be called
// from the abstract base class
#include <iostream>
using namespace std;

class Polygon {
  protected:
    int width, height;
  public:
    void set_values (int a, int b)
      { width=a; height=b; }
    virtual int area() =0;
    void printarea()
      { cout << this->area() << '\n'; }
};

class Rectangle: public Polygon {
  public:
    int area (void)
      { return (width * height); }
};

class Triangle: public Polygon {
  public:
    int area (void)
      { return (width * height / 2); }
};

int main () {
  Rectangle rect;
  Triangle trgl;
  Polygon * ppoly1 = &rect;
  Polygon * ppoly2 = &trgl;
  ppoly1->set_values (4,5);
  ppoly2->set_values (4,5);
  ppoly1->printarea();
  ppoly2->printarea();
  return 0;
}
20
10


Virtual members and abstract classes grant C++ polymorphic characteristics, most useful for object-oriented projects. Of course, the examples above are very simple use cases, but these features can be applied to arrays of objects or dynamically allocated objects.

Here is an example that combines some of the features in the latest chapters, such as dynamic memory, constructor initializers and polymorphism:
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
// dynamic allocation and polymorphism
#include <iostream>
using namespace std;

class Polygon {
  protected:
    int width, height;
  public:
    Polygon (int a, int b) : width(a), height(b) {}
    virtual int area (void) =0;
    void printarea()
      { cout << this->area() << '\n'; }
};

class Rectangle: public Polygon {
  public:
    Rectangle(int a,int b) : Polygon(a,b) {}
    int area()
      { return width*height; }
};

class Triangle: public Polygon {
  public:
    Triangle(int a,int b) : Polygon(a,b) {}
    int area()
      { return width*height/2; }
};

int main () {
  Polygon * ppoly1 = new Rectangle (4,5);
  Polygon * ppoly2 = new Triangle (4,5);
  ppoly1->printarea();
  ppoly2->printarea();
  delete ppoly1;
  delete ppoly2;
  return 0;
}
20
10


Notice that the 
ppoly pointers:
1
2
Polygon * ppoly1 = new Rectangle (4,5);
Polygon * ppoly2 = new Triangle (4,5);



are declared being of type "pointer to 
Polygon", but the objects allocated have been declared having the derived class type directly (Rectangle and Triangle).