Advancing the Pokemon

I’m not unstuck yet, but I am advancing a bit.

I just finished playing with the code a bit trying to tackle one small problem at a time rather than trying to solve the whole thing all at once. This strategy has proven more and more successful as the program has grown.

Please note that there are several superfluous statements here in order to follow the process more closely. At this point I have been trying to get the points taken care of properly and recognize when someone has less that 1 pt left (making them dead). 

The next steps are to pop dead pokemon out of the player / computer’s hand and then advance the remaining pokemon to the fore.

Here’s a copy of the text from the latest run:

**************

**********

Player’s hand is empty.

**********

Computer’s hand is empty.

**********

**********

IDNumber = 1, name = Pikachu

IDNumber = 2, name = Froky

IDNumber = 3, name = FurFrou

IDNumber = 4, name = Meowth

IDNumber = 5, name = BunnleBy

IDNumber = 6, name = BeeDrill

IDNumber = 7, name = Gloom

IDNumber = 8, name = Diglett

**********

Player, please choose a Pokemon from the draw pile (enter ID number)

4

You chose number 4, Meowth

player’s hand:

IDNumber = 4, name = Meowth

IDNumber = 0, name = 

**********

IDNumber = 1, name = Pikachu

IDNumber = 2, name = Froky

IDNumber = 3, name = FurFrou

IDNumber = 5, name = BunnleBy

IDNumber = 6, name = BeeDrill

IDNumber = 7, name = Gloom

IDNumber = 8, name = Diglett

**********

**********

computer’s hand:

IDNumber = 5, name = BunnleBy

IDNumber = 0, name = 

**********

IDNumber = 1, name = Pikachu

IDNumber = 2, name = Froky

IDNumber = 3, name = FurFrou

IDNumber = 6, name = BeeDrill

IDNumber = 7, name = Gloom

IDNumber = 8, name = Diglett

**********

Player, please choose a Pokemon from the draw pile (enter ID number)

7

You chose number 7, Gloom

player’s hand:

IDNumber = 4, name = Meowth

IDNumber = 7, name = Gloom

**********

IDNumber = 1, name = Pikachu

IDNumber = 2, name = Froky

IDNumber = 3, name = FurFrou

IDNumber = 6, name = BeeDrill

IDNumber = 8, name = Diglett

**********

**********

computer’s hand:

IDNumber = 5, name = BunnleBy

IDNumber = 2, name = Froky

**********

Finished drawing cards.

 

 

 

 

 

 

**********

IDNumber = 4, name = Meowth

IDNumber = 7, name = Gloom

**********

IDNumber = 5, name = BunnleBy

IDNumber = 2, name = Froky

**********

**********

Which Pokemon will you send into battle? (select ID number)

IDNumber = 4, name = Meowth

IDNumber = 7, name = Gloom

7

Gloom is the player’s current Pokemon.

Froky is the computer’s current Pokemon.

 

 

 

 

 

 

 

 

 

 

Player’s Deck

—————

IDNumber = 4 Name = Meowth, hp = 100 Status: alive

IDNumber = 7 Name = Gloom, hp = 100 Status: alive

 

 

Computer’s Deck

—————

IDNumber = 5 Name = BunnleBy, hp = 100 Status: alive

IDNumber = 2 Name = Froky, hp = 100 Status: alive

Select an attack (by number):

Attack 1 = Acid

Attack 2 = Swwet Scent

Attack 3 = Poison Powder

3

Gloom attacks Froky using Poison Powder

Begin Battle

Yes! Hit.

Gloom scores 45 using Poison Powder.

End Battle

player turn = false

 

 

 

 

 

 

 

 

 

 

Player’s Deck

—————

IDNumber = 4 Name = Meowth, hp = 100 Status: alive

IDNumber = 7 Name = Gloom, hp = 100 Status: alive

 

 

Computer’s Deck

—————

IDNumber = 5 Name = BunnleBy, hp = 100 Status: alive

IDNumber = 2 Name = Froky, hp = 55 Status: alive

 

 

 

 

 

 

 

 

 

 

Player’s Deck

—————

IDNumber = 4 Name = Meowth, hp = 100 Status: alive

IDNumber = 7 Name = Gloom, hp = 100 Status: alive

 

 

Computer’s Deck

—————

IDNumber = 5 Name = BunnleBy, hp = 100 Status: alive

IDNumber = 2 Name = Froky, hp = 55 Status: alive

Select an attack (by number):

Attack 1 = Acid

Attack 2 = Swwet Scent

Attack 3 = Poison Powder

3

Gloom attacks Froky using Poison Powder

Begin Battle

missed – Drat!!

End Battle

player turn = false

 

 

 

 

 

 

 

 

 

 

Player’s Deck

—————

IDNumber = 4 Name = Meowth, hp = 100 Status: alive

IDNumber = 7 Name = Gloom, hp = 100 Status: alive

 

 

Computer’s Deck

—————

IDNumber = 5 Name = BunnleBy, hp = 100 Status: alive

IDNumber = 2 Name = Froky, hp = 55 Status: alive

 

 

 

 

 

 

 

 

 

 

Player’s Deck

—————

IDNumber = 4 Name = Meowth, hp = 100 Status: alive

IDNumber = 7 Name = Gloom, hp = 100 Status: alive

 

 

Computer’s Deck

—————

IDNumber = 5 Name = BunnleBy, hp = 100 Status: alive

IDNumber = 2 Name = Froky, hp = 55 Status: alive

Select an attack (by number):

Attack 1 = Acid

Attack 2 = Swwet Scent

Attack 3 = Poison Powder

3

Gloom attacks Froky using Poison Powder

Begin Battle

Yes! Hit.

Gloom scores 45 using Poison Powder.

End Battle

player turn = false

 

 

 

 

 

 

 

 

 

 

Player’s Deck

—————

IDNumber = 4 Name = Meowth, hp = 100 Status: alive

IDNumber = 7 Name = Gloom, hp = 100 Status: alive

 

 

Computer’s Deck

—————

IDNumber = 5 Name = BunnleBy, hp = 100 Status: alive

IDNumber = 2 Name = Froky, hp = 10 Status: alive

Froky attacks Gloom using water drip

Begin Battle

Yes! Hit.

Froky scores 20 using water drip.

End Battle

 

 

 

 

 

 

 

 

 

 

Player’s Deck

—————

IDNumber = 4 Name = Meowth, hp = 100 Status: alive

IDNumber = 7 Name = Gloom, hp = 80 Status: alive

 

 

Computer’s Deck

—————

IDNumber = 5 Name = BunnleBy, hp = 100 Status: alive

IDNumber = 2 Name = Froky, hp = 10 Status: alive

Select an attack (by number):

Attack 1 = Acid

Attack 2 = Swwet Scent

Attack 3 = Poison Powder

3

Gloom attacks Froky using Poison Powder

Begin Battle

missed – Drat!!

End Battle

player turn = false

 

 

 

 

 

 

 

 

 

 

Player’s Deck

—————

IDNumber = 4 Name = Meowth, hp = 100 Status: alive

IDNumber = 7 Name = Gloom, hp = 80 Status: alive

 

 

Computer’s Deck

—————

IDNumber = 5 Name = BunnleBy, hp = 100 Status: alive

IDNumber = 2 Name = Froky, hp = 10 Status: alive

Froky attacks Gloom using quick attack

Begin Battle

missed – Drat!!

End Battle

 

 

 

 

 

 

 

 

 

 

Player’s Deck

—————

IDNumber = 4 Name = Meowth, hp = 100 Status: alive

IDNumber = 7 Name = Gloom, hp = 80 Status: alive

 

 

Computer’s Deck

—————

IDNumber = 5 Name = BunnleBy, hp = 100 Status: alive

IDNumber = 2 Name = Froky, hp = 10 Status: alive

Select an attack (by number):

Attack 1 = Acid

Attack 2 = Swwet Scent

Attack 3 = Poison Powder

2

Gloom attacks Froky using Swwet Scent

Begin Battle

Yes! Hit.

Gloom scores 15 using Swwet Scent.

Froky is dead.

<<<<<<<<<<<<<+++++++++>>>>>>>>>>>>>>>>>>>

End Battle

player turn = false

 

 

 

 

 

 

 

 

 

 

Player’s Deck

—————

IDNumber = 4 Name = Meowth, hp = 100 Status: alive

IDNumber = 7 Name = Gloom, hp = 80 Status: alive

 

 

Computer’s Deck

—————

IDNumber = 5 Name = BunnleBy, hp = 100 Status: alive

IDNumber = 2 Name = Froky, hp = -5 Status: dead

Froky attacks Gloom using water drip

Begin Battle

missed – Drat!!

End Battle

Popping 1 Pokemon, named Froky

Computer has advanced BunnleBy into attack position.

Player’s Deck

—————

IDNumber = 4 Name = Meowth, hp = 100 Status: alive

IDNumber = 7 Name = Gloom, hp = 80 Status: alive

 

 

 

 

Computer’s Deck

—————

IDNumber = 5 Name = BunnleBy, hp = 100 Status: alive

IDNumber = 2 Name = Froky, hp = -5 Status: dead

Select an attack (by number):

Attack 1 = Acid

Attack 2 = Swwet Scent

Attack 3 = Poison Powder

(I quit the program here)

Advertisements

Xcode 6 and SWIFT

dasdas-copy2

From the 2014 WWDC

Apple unveiled the new programming language that it wants developers to use in making iOS and OSX apps this week. This sent me scrambling to a place where I could download large files for free (not my house) to get the new version of XCode so I could try it out. I also liked the idea of starting on the ground floor with every other developer on the day it was released.

About 24 hours later, I finally have the new XCode beta downloaded and installed on my computer (storage space on my MacBook Air is always at a premium). I have not yet been able to install the new iOS on my phone because I simply have too many pictures cluttering up the storage space there too – I’ll deal with that later, when I can hook up to my external drive – and I have not been able to download Yosemite yet for some other reason. I know this isn’t the storage problem – at least not yet. But I still haven’t worked out the kinks on that one.

So… what can we expect from this new SWIFT / XCode combination? One thing that I’m certain a lot of people have been looking forward to, is a more integrated coding space. Bret Victor gave a talk at the 2012 CUSEC (Canadian University Software Engineering Conference) presenting this idea in a pretty solid demo that illustrated everything from side-by-side coding and output for graphics and even a simple sorting loop. In both examples, we see how easily this kind of work environment leads to debugging before you are even finished typing in the buggy line of code.

I was going to clip a section of the talk to show the moments where Bret really nailed his idea, but the whole talk is just so remarkable, I suggest you watch it all – if you haven’t already. And if you have, watch it again. It’s that good.

Back to today…

Does this mean that I’ve been cranking out new Swift code all day? No. Sadly.

There’s a couple (maybe three) roadblocks in place for me before I can do that.

  1. Even though I have XCode up and running, I can’t figure out how to start playing with Swift in the playground.
  2. I have studying for that Chemistry content exam I need to take.
  3. I keep getting distracted by writing posts for my blogs.

That said. I’m back to it. By the way, I really have to hand it to KhanAcademy. It’s made studying a much more engaging pursuit. I highly recommend this site for any student in a class covered by his material.

Here’s a clip of video from the Swift announcement at WWDC. Compare it to what you just saw from Ken Victor.

Transformation – a plan of attack

Image

Click this image to try to catch up with Jason Wellborn – The image was easier to find than the attribution

I have to admit, with yesterday’s release of Apple’s new Swift programming language, it is tempting to try to remake this whole thing as a swift program in XCode. I think for now I’ll stick with C++, but I just downloaded the Swift programming guide from the iBook store…

 

Project: Transform the clown car simulation into a game of Pokemon.

Requirements:

  1. Make a Draw pile (deck) with all the Pokemon that will be included in the game
  • Use vectors for decks
  • Pokemon each have a name, an ID number, hit points, and three attacks
  1. Make two separate piles (decks) for the player and the computer (opponent)
  2. allow player to select Pokemon from the Draw Pile (select Pokemon by ID number) – select 2
  3. computer selects Pokemon from Draw Pile (randomized, by position in vector) – select 2
  4. Import the player’s and computer’s decks to a battle function
  5. Battle Function
  • Player and Computer select first Pokemon to fight
  • battle function or some other subset function will need to distinguish the two decks as attacker and defender
  • take turns selecting attacks (attack success should have inverse probability  of hit chance and damage done – set base to 50%, then use modifiers to adjust for each attack)
  • be sure to manage hp properly – use clown car model
  • if a Pokemon is reduced to <= 0 hp, it is defeated and that player’s other Pokemon is advanced to fighting position.
  • If second Pokemon is defeated, declare other team winner

The next hiccup – making random random and getting organized

I admit that I have a problem.

But first, start here for a little science. Or just go ahead and get straight to the code below.

Claire: What’s wrong with you? Why don’t you like yourself?

Brian: ‘Cause I’m stupid…’cause I’m failing shop. See we had this assignment, to make this ceramic elephant, and um–and we had eight weeks to do it and we’re s’posed ta, and it was like a lamp, and when you pull the trunk the light was s’posed to go on. My light didn’t go on, I got a F on it. Never got a F in my life. When I signed up, you know, for the course I mean. I thought I was playing it real smart, you know. ‘Cause I thought, I’ll take shop, it’ll be such an easy way to maintain my grade point average.

What’s supposed to happen:

1. populate a clown car with five clowns

2. each clown is an object, with a name, an ID number and three attacks, each with unique damage

3. scroll through the clowns (once through = a turn)

       a. pick a target clown

       b. pick an attack

       c. write out the attack, score damage against the target clown

       d. see if clown is down below 0 ‘hit points’, if so, he’s dead – kick him out of the car

       e. manage the data handling (clown objects are stored in a vector, shrink the vector after kicking out clowns.

       f. report on who is left and how many hit points each clown has left

My code:

//

//  main.cpp

//  clowncar

//

//  Created by Jack on 5/4/14.

//

 

 

//problem calculating damage and reducing hp appropriately.

//problems generating random targets

//problems restricting targets to available clowns (i.e. not dead ones)

 

 

#include <iostream>

#include <vector>

#include <time.h>

#include <stdio.h>

#include <stdlib.h>

#include <cstdlib>

#include <ctime>

 

usingnamespacestd;

using std::vector;

 

 

 

class IdNumbers{     // a place to store a counter for creating idNumbers

public:

    IdNumbers(){

    }

static int getANewNumber(){

counter++;

return counter;

    }

protected:

static int counter;

}; //end IdNumbers

 

 

class Clown{   // the clown objects

public:

    Clown(){};

    ~Clown(){};

    Clown(int clownId){

idNum = clownId;

    };

    Clown(string nameOfClown, IdNumbers theNumber, string attackIn1, int attackIn1Damage, string attackIn2, int attackIn2Damage, string attackIn3, int attackIn3Damage ){

clownName = nameOfClown;

idNum = theNumber.getANewNumber();

attack1 = attackIn1;

attack2 = attackIn2;

attack3 = attackIn3;

attack1Damage = attackIn1Damage;

attack2Damage = attackIn2Damage;

attack3Damage = attackIn3Damage;

hitPoints = 100;

dead = false;

    };

int getClownId(void){

return idNum;

    }

string getName(void){

return clownName;

    }

void printClown(void){

cout<<“idNumber = “<<idNum<<endl;

cout<<“name = “<<clownName<<endl;

    };

void printClown2(void){

        cout<<“Clown idNumber = “<<idNum<<“, name = “<<clownName<<endl;

    };

void printClown3(void){

        cout<<“Clown Name = “<<clownName<<“, hp = “<<hitPoints<<endl;

    };

int getNumAttacks(void){

return numAttacks;

    };

string getAttack1(){

return attack1;

    };

string getAttack2(){

return attack2;

    };

string getAttack3(){

return attack3;

    };

int getDamage1(){

        returnattack1Damage;

    };

int getDamage2(){

        returnattack2Damage;

    };

int getDamage3(){

        returnattack3Damage;

    };

int getHP(){

return hitPoints;

    };

void setHP(int damage){

this->hitPoints = this->hitPoints – damage;

if (this->hitPoints <= 0){

dead = true;

        }

    }

bool getDead(){

return dead;

    }

private:

string clownName;

int idNum;

int numAttacks = 3;

string attack1;

int attack1Damage;

string attack2;

int attack2Damage;

string attack3;

int attack3Damage;

int hitPoints;

bool dead;

};    //end clown

 

//functions

void printVectorContents(vector<Clown> &);

void printVectorContents2(vector<Clown> &);

void askWhoToPop(vector<Clown> &);

void popClown(vector<Clown> &, int);

void popThisClown(vector<Clown> &car, int popWho);

void directFight(vector<Clown> &car);

 

int IdNumbers ::counter = 0;

 

 

//*********************************************************************************************

 

int main(int argc, const char * argv[])

{

IdNumbers theCounter;

    srand (time(NULL));                     //<—–should seed random numbers appropriately…

    vector<Clown> clowncar;     //sets up a vector for fish

int vectorSize = 0;

    vectorSize = clowncar.size(); //get array size

Clown pennywise(“Pennywise”, theCounter, “bite”, 30, “claw”, 20, “defenestrate”, 1000);

    clowncar.push_back(pennywise);

    Clown jwgacy(“John Wayne Gacy”, theCounter, “creep out”, 30, “molest”, 50, “defenestrate”, 1000);

    clowncar.push_back(jwgacy);

    vectorSize = clowncar.size(); //get array size

    Clown bozo(“Bozo”, theCounter, “nose honk”, 5, “flower squirt”, 10, “defenestrate”, 1000);

    clowncar.push_back(bozo);

    Clown krusty(“Krusty”, theCounter, “tease”, 15, “step on foot”, 20, “defenestrate”, 1000);

    clowncar.push_back(krusty);

    vectorSize = clowncar.size(); //get array size

 

 

    Clown ronald(“Ronald McDonald”, theCounter, “smile”, 30, “arterie clog”, 30, “defenestrate”, 1000);

    clowncar.push_back(ronald);

    vectorSize = clowncar.size(); //get array size

    cout<<“**************”<<endl;

    cout<<“**********”<<endl;

    clowncar.shrink_to_fit();

    //cout<<“current capacity is: “<<clowncar.capacity()<<endl;

    //cout<<“vector is size: “<<vectorSize<<endl;

    printVectorContents2(clowncar);

directFight(clowncar);

return 0;

}

//****************************************************************************

 

 

//Non-Member functions

void printVectorContents(vector<Clown> &car){

for(int i=0; i < car.size(); i++){

        car[i].printClown();

    }

}

 

void printVectorContents2(vector<Clown> &car){

for(int i=0; i < car.size(); i++){

        car[i].printClown2();

    }

}

void printVectorContents3(vector<Clown> &car){

for(int i=0; i < car.size(); i++){

        car[i].printClown3();

    }

}

 

void askWhoToPop(vector<Clown> &car){

int popWho;

char uPick;

    bool picked = false;   // ensures that an appropriate choice was made

while (picked == false) {   //this seems to work

        cout<<“Would you like to (p)ick a clown to Pop, or should we do it (r)andomly?”<<endl;

cin>>uPick;

if ((uPick == ‘p’) || (uPick == ‘P’)) {

            cout<<“Please enter an ID number of a clown to kick out of the car: “;

cin>>popWho;

            picked = true;

break;

        }

if ((uPick == ‘r’) || (uPick == ‘R’)) {

            //generate random number 0 – vector size, identify and kick out – works

            popWho = rand()%car.size();

            cout<<“you picked random”<<endl;

            picked = true;

break;

        }

else{

            picked = false;

            cout<<“Try again – you (p)ick or (r)andom”<<endl;

cin>>uPick;

continue;

        }

    }

popThisClown(car, popWho);

cout<<endl;

}

 

void popThisClown(vector<Clown> &car, int popWho){   //how to selectively delete from a vector????

for (int j = 0; j < car.size(); j++)

    {

if(car[j].getClownId() == popWho)

        {

            car.erase (car.begin()+j);

        }

    }// end for

};

 

 

void directFight(vector<Clown> &car){      //handles the fighting

bool victor = false;

bool targetIdentified = false;

string winner;

int attackerID;

int targetID;

string attackerName;

string targetName;

int attackNum;

string attackType;

int attackDamage;

while (victor == false){

for (int j=0;j<car.size();j++){                             //scrolls through attackers

        attackerName = car[j].getName();

            attackerID = car[j].getClownId();

            //cout<<“Attacker “<<attackerID<<” is “<<attackerName<<endl;     // verification step

            targetID = rand()%car.size();               // (5 + 1);    //<——problem with this randomizer

            //cout<<“Target “<<targetID<<” is “<<car[targetID].getName()<<endl;

while (targetIdentified == false){

                //targetID = rand()%5+1;        //car.size();    //<—–problem    <replace with number now>

                //cout<<“In while”<<endl;

if (targetID == attackerID){

                    targetIdentified = false;

                    targetID = rand()%5+1;

                    cout<<“Identified self – trying again”<<endl;

                }

else if (targetID != attackerID){

                    targetIdentified = true;

for(int i=0;i<car.size();i++){

if (targetID == car[i].getClownId()){

                            targetName = car[targetID].getName();

cout<<“Target of “<<attackerName<<” is “<<targetName<<endl;

                            targetID = i;

                        }

                    }

//temp verification step

break;

                }

else{

                    cout<<“this isn’t supposed to happen. AttackerID is “<<attackerID<<” target ID is “<<targetID<<endl;

                }

            }

        attackNum = rand()%3 + 1;    //choose attack (gets a random number)

for (int i=0;i<car[attackerID].getNumAttacks(); i++){   //loop through attackers attacks

            //cout<<“numAttacks is “<<car[attackerID].getNumAttacks();

            //cout<<“attackNum is “<<attackNum<<endl;

switch ( attackNum ) {

case 1 :

                    attackType = car[attackerID].getAttack1();

                    //cout<<“returning “<<car[attackerID].getAttack1()<<endl;

break;

case 2 :

                    attackType = car[attackerID].getAttack2();

                    //cout<<“returning “<<attackType<<endl;

break;

case 3 :

                    attackType = car[attackerID].getAttack3();

                    //cout<<“returning “<<attackType<<endl;

break;

default :

                    cout<<“error in attackNum switch statement”<<endl;

            }

switch ( attackNum ) {

case 1 :

                    attackDamage = car[attackerID].getDamage1();

break;

case 2 :

                    attackDamage = car[attackerID].getDamage2();

break;

case 3 :

                    attackDamage =  car[attackerID].getDamage3();

break;

default :

                    cout<<“error in attackNum switch statement”<<endl;

            }

        }

cout<<“AttackDamage is :”<<attackDamage<<endl;

    //choose target

cout<<attackerName<<” attacks “<<targetName<<” with “<<attackType<<” attack “<<” for “<<attackDamage<<” damage.”<<endl;

            //report attacker, attack, target AND score damage

            car[targetID].setHP(attackDamage);       //call to adjust hps according to damage

if (car[targetID].getDead() == true){    //thrown dead from the car

popThisClown(car, targetID);

                car.shrink_to_fit();

            }

            cout<<“<<<<<<<<<*************>>>>>>>>>>>>>”<<endl;

            printVectorContents3(car);

if(car.size() == 1){

                victor = true;

                winner = car[0].getName();

            }

    //printVector3 – clown name, hp

    //isWinner, i.e. is there only one clown left in the car?

    }

    }

cout<<“Winner is “<<winner<<endl;

};

 

 

My Output:

**************

**********

Clown idNumber = 1, name = Pennywise

Clown idNumber = 2, name = John Wayne Gacy

Clown idNumber = 3, name = Bozo

Clown idNumber = 4, name = Krusty

Clown idNumber = 5, name = Ronald McDonald

AttackDamage is :30

Pennywise attacks  with creep out attack  for 30 damage.

<<<<<<<<<*************>>>>>>>>>>>>>

Clown Name = Pennywise, hp = 70

Clown Name = John Wayne Gacy, hp = 100

Clown Name = Bozo, hp = 100

Clown Name = Krusty, hp = 100

Clown Name = Ronald McDonald, hp = 100

AttackDamage is :5

John Wayne Gacy attacks  with nose honk attack  for 5 damage.

<<<<<<<<<*************>>>>>>>>>>>>>

Clown Name = Pennywise, hp = 70

Clown Name = John Wayne Gacy, hp = 100

Clown Name = Bozo, hp = 100

Clown Name = Krusty, hp = 95

Clown Name = Ronald McDonald, hp = 100

AttackDamage is :20

Bozo attacks  with step on foot attack  for 20 damage.

<<<<<<<<<*************>>>>>>>>>>>>>

Clown Name = Pennywise, hp = 70

Clown Name = John Wayne Gacy, hp = 100

Clown Name = Bozo, hp = 80

Clown Name = Krusty, hp = 95

Clown Name = Ronald McDonald, hp = 100

AttackDamage is :30

Krusty attacks  with arterie clog attack  for 30 damage.

<<<<<<<<<*************>>>>>>>>>>>>>

Clown Name = Pennywise, hp = 70

Clown Name = John Wayne Gacy, hp = 70

Clown Name = Bozo, hp = 80

Clown Name = Krusty, hp = 95

Clown Name = Ronald McDonald, hp = 100

AttackDamage is :1000

Ronald McDonald attacks  with defenestrate attack  for 1000 damage.

<<<<<<<<<*************>>>>>>>>>>>>>

Clown Name = Pennywise, hp = 70

Clown Name = John Wayne Gacy, hp = 70

Clown Name = Krusty, hp = -905

Clown Name = Ronald McDonald, hp = 100

AttackDamage is :30

Pennywise attacks  with creep out attack  for 30 damage.

<<<<<<<<<*************>>>>>>>>>>>>>

Clown Name = Pennywise, hp = 70

Clown Name = John Wayne Gacy, hp = 70

Clown Name = Krusty, hp = -905

Clown Name = Ronald McDonald, hp = 70

AttackDamage is :20

John Wayne Gacy attacks  with step on foot attack  for 20 damage.

<<<<<<<<<*************>>>>>>>>>>>>>

Clown Name = Pennywise, hp = 70

Clown Name = John Wayne Gacy, hp = 70

Clown Name = Krusty, hp = -905

Clown Name = Ronald McDonald, hp = 50

etc., etc……

adding a few more layers

Image

Nighty-night.

With the clown car program working fairly well, I want to add a layer of complexity…

Well, I’d rather not add complexity at all, but I do want my code to do something. Since my son has recently discovered Pokemon (and taught me how to play), I thought I would set up this clown car as something of a cage match for the clowns.  Here’s the basic plan:

Vector practice – clown car CAGE MATCH!

add some element to the clown object that can be changed

  • how about hit points(hp)?
  • make them fight, damage is subtracted from hp

(can I make the whole fight a separate document to #include?)

Fight will proceed in turns

Basic Turn Outline

o   scroll through clowns remaining in the car (i.e. each clown gets a chance to attack each turn – unless they’re killed)

o   randomize attack (each has 50% chance of hit) – have ~3 attacks available per clown

o   randomize target among clowns remaining in the car (clown cannot attack itself)

o   report attacker, attack, target and damage (and if Kill) as a cout

  • throw slain targets from the car

o   end of round: update each clown’s hp

  • update and output damage each round – pause before advancing to next round (also number the rounds)

 Table of Clowns with hot points, attacks and respective damage:

Name Hp Attacks Damage
Pennywise 100 Bite/Claw/defenestration 30/20/auto kill
Jw Gacy 75 Creep out/Molest / defenestration 30/50/auto kill
Bozo 50 Honk/squirting flower defenestration 5/10/auto kill
Krusty 75 Laugh/step on foot defenestration 5/20/auto kill
Ronald McD 50 Smile/clog arteries defenestration 10/50/auto kill

 

 

 

A debt of gratitude

Thank you very much to CTphpnwb on </ dream.in.code> for helping me to gain a better understanding of how to work with references – and why this is important.

The basic problem I was facing was that I was passing the whole factor of objects into my functions. When you do this, it actually creates a copy of the vector and manipulates that. What I wanted to have happen was to pass a reference to my vector (i.e. the vector’s address in the computer) so that no copy was made, and all changes were done to the original vector.

I’ve tried playing with shrink_to_fit, but I think I may be exploring territory that isn’t going to actually help me at this point.

the successful code:

//

//  main.cpp

//  clowncar

//

//  Created by Jack on 5/4/14.

//  Copyright (c) 2014 Jack Treml. All rights reserved.

//

 

 

 

/*

 1. empty car (0)

 2. pick up Pennywise and John Wayne Gacy (2)

 3. Pick up Bozo and Krusty (4)

 4. Pick up Ronald McDonald (5)

 5. print out list of clowns

 6. As for a name of a clown (or ID number) to kick out of the car

 7. Kick only that individual out, then re-print list

 */

 

#include <iostream>

#include <vector>

usingnamespacestd;

using std::vector;

 

class IdNumbers{     // a place to store a counter for creating idNumbers

public:

    IdNumbers(){

    }

static int getANewNumber(){

counter++;

return counter;

    }

protected:

static int counter;

};

 

class Clown{   // the clown objects

public:

    Clown(){};

    ~Clown(){};

    Clown(int clownId){

idNum = clownId;

    };

    Clown(string nameOfClown, IdNumbers theNumber){

clownName = nameOfClown;

idNum = theNumber.getANewNumber();

    };

int getClownId(void){

return idNum;

    }

void printClown(void){

cout<<“idNumber = “<<idNum<<endl;

cout<<“name = “<<clownName<<endl;

    };

void printClown2(void){

        cout<<“Clown idNumber = “<<idNum<<“, name = “<<clownName<<endl;

    };

private:

string clownName;

int idNum;

};

 

//functions

void printVectorContents(vector<Clown> &);

void printVectorContents2(vector<Clown> &);

void askWhoToPop(vector<Clown> &);

void popClown(vector<Clown> &, int);

void popThisClown(vector<Clown> &car, int popWho);

 

int IdNumbers ::counter = 0;

 

int main(int argc, const char * argv[])

{

IdNumbers theCounter;

    vector<Clown> clowncar;     //sets up a vector for fish

int vectorSize = 0;

    vectorSize = clowncar.size(); //get array size

    cout<<“**************”<<endl;

cout<<“vector is size: “<<vectorSize<<endl;

Clown pennywise(“Pennywise”, theCounter);

    clowncar.push_back(pennywise);

Clown jwgacy(“John Wayne Gacy”, theCounter);

    clowncar.push_back(jwgacy);

    vectorSize = clowncar.size(); //get array size

    cout<<“**************”<<endl;

cout<<“vector is size: “<<vectorSize<<endl;

    //printVectorContents(clowncar);

    printVectorContents2(clowncar);

Clown bozo(“Bozo”, theCounter);

    clowncar.push_back(bozo);

Clown krusty(“Krusty”, theCounter);

    clowncar.push_back(krusty);

    vectorSize = clowncar.size(); //get array size

    cout<<“**************”<<endl;

cout<<“vector is size: “<<vectorSize<<endl;

    //printVectorContents(clowncar);

    printVectorContents2(clowncar);

Clown ronald(“Ronald McDonald”, theCounter);

    clowncar.push_back(ronald);

    vectorSize = clowncar.size(); //get array size

    cout<<“**************”<<endl;

    cout<<“current capacity is: “<<clowncar.capacity()<<endl;

cout<<“vector is size: “<<vectorSize<<endl;

    //printVectorContents(clowncar);

    //list clowns with ID numbers

    printVectorContents2(clowncar);

    //ask for an ID number of a clown to evict

askWhoToPop(clowncar);

    cout<<“**********”<<endl;

    clowncar.shrink_to_fit();

    cout<<“current capacity is: “<<clowncar.capacity()<<endl;

cout<<“vector is size: “<<vectorSize<<endl;

    printVectorContents2(clowncar);

return 0;

}

 

 

//Non-Member functions

void printVectorContents(vector<Clown> &car){

for(int i=0; i < car.size(); i++){

        car[i].printClown();

    }

}

 

void printVectorContents2(vector<Clown> &car){

for(int i=0; i < car.size(); i++){

        car[i].printClown2();

    }

}

 

void askWhoToPop(vector<Clown> &car){

int popWho;

    cout<<“Please enter an ID number of a clown to kick out of the car: “;

cin>>popWho;

popThisClown(car, popWho);

cout<<endl;

}

 

void popThisClown(vector<Clown> &car, int popWho){   //how to selectively delete from a vector????

for (int j = 0; j < car.size(); j++)

    {

        cout<<“is “<<j<<” the right guy to bump?”<<endl;

if(car[j].getClownId() == popWho)

        {

            cout<<“yeah, I’m here lookin’ at erasing clown “<<j<<endl;

            //car.erase(j);   //tried this – didn’t work

            car.erase (car.begin()+j);

        }

    }// end for

};

 

output:

**************

vector is size: 0

**************

vector is size: 2

Clown idNumber = 1, name = Pennywise

Clown idNumber = 2, name = John Wayne Gacy

**************

vector is size: 4

Clown idNumber = 1, name = Pennywise

Clown idNumber = 2, name = John Wayne Gacy

Clown idNumber = 3, name = Bozo

Clown idNumber = 4, name = Krusty

**************

current capacity is: 8

vector is size: 5

Clown idNumber = 1, name = Pennywise

Clown idNumber = 2, name = John Wayne Gacy

Clown idNumber = 3, name = Bozo

Clown idNumber = 4, name = Krusty

Clown idNumber = 5, name = Ronald McDonald

Please enter an ID number of a clown to kick out of the car: 3

is 0 the right guy to bump?

is 1 the right guy to bump?

is 2 the right guy to bump?

yeah, I’m here lookin’ at erasing clown 2

is 3 the right guy to bump?

 

**********

current capacity is: 4

vector is size: 5

Clown idNumber = 1, name = Pennywise

Clown idNumber = 2, name = John Wayne Gacy

Clown idNumber = 4, name = Krusty

Clown idNumber = 5, name = Ronald McDonald

Program ended with exit code: 0

in a rut

I’m stuck. I’ve been trying to re-jigger my code to add a dialog asking for an ID number to delete from the vector and then doing it, but so far, I’ve gotten nowhere. Sure, I can create the dialog and get the info from the user, but I have not yet been able to use that info to selectively delete a clown from the car.

Recall, the purpose of this exercise is to ensure that I can handle a vector of objects, adding and deleting objects at will. A secondary objective is to be sure that I am assigning unique ID numbers to each object so they can be tracked accurately.

my function asking who to delete:

void askWhoToPop(vector<Clown> car){

    int popWho;

    cout<<“Please enter an ID number of a clown to kick out of the car: “;

    cin>>popWho;

    Clown::popThisClown(car, popWho);

    cout<<endl;

}

 

my function for deleting an object:

void popThisClown(vector<Clown> car, int popWho){   //how to selectively delete from a vector????

for (int j = 0; j < car.size(); j++)

        {

if(car[j].idNum == popWho)

            {

delete car[j];

                car.pop_back();

            }

        }// end for

    };

suggestions????

 

Previous Older Entries