Ayuda!: Problema con objetos en C# (soy novato!!)

angel210s

Lanero Novato
19 Abr 2009
14
Hola a todos, tengo un problema con el C#, tengo poco tiempo aprendiendolo ya sabia algo de delphi pero la verdad es q estoy teniendo problemas al momento de "desmenuzar" el programa y separarlo en clases estructiras etc, he leido los libros y entiendo lo que dicen, pero a la hora de poner en practica las ideas....bueno...hay cosas que no funcionan como esperaba, ahorita estoy tratando de hacer una especie de tamagochy (aquella figurita virtual que habia q alimentar y todo eso) que saque de un libro, pero tengo problemas a la hora de querer colocar un simple y vulgar mensaje que muestre la edad :S.... :embarassed: :embarassed: :embarassed: el mayor problema es que no se donde declarar la funcion mostrar edad, parece que donde la pongo el mald$·&to visual studio no le gusta y me aparece el mensaje de "El nombre 'micritter' no existe en el contexto actual" ..aqui les paso el codigo pero tambien me ayudaria que me dieran una pequeña explicacion de por q es esto?..y en donde debo declararlo y por que?...si instancio el objeto en main con Critter micritter = new Critter(); podr'ia utilizarlo en cualquier clase no?...agregarle atributos me refiero....

Nota: el "programa" corre bien sin la funcion de mostraredad solo que ahora quiero ampliarlo






using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CritterMenu
{
class Menu
{


static int showMenu ()
{
int input = 1;
Console.WriteLine();
//primero intente colocar la funcion mostrar edad aqui, me salio la primera advertencia que el objeto no existia en contexto
Console.WriteLine();
Console.WriteLine();
Console.WriteLine();
Console.WriteLine("0)Exit");
Console.WriteLine("1)Escuchar al critter");
Console.WriteLine("2)alimentar al criter");
Console.WriteLine("3)jugar con el critter");
Console.WriteLine("4)renombrar al critter");

try
{
input = Convert.ToInt32(Console.ReadLine());
}
catch (FormatException)
{
Console.WriteLine("Entrada Incorrecta");
input = 1;
}
return input;
}






static void Main (string[] args)
{
bool keepGoing = true;
int choice;

Critter micritter = new Critter();
micritter.Name = "George";



while (keepGoing){

micritter.Age();
micritter.mostraredad(); //aqui parece que funcionaria, aunque no queda muy bien, solo falta declarar la funcion
//saber donde hacerlo :S
choice = showMenu();



switch (choice) {
case 0:
keepGoing = false;
break;

case 1:
micritter.talk();
Console.WriteLine("esta {0} feliz y tiene una edad de {1}",micritter.Happy, micritter.Age2 );
break;

case 2:
micritter.Eat();
Console.WriteLine("alimenta al critter");
break;

case 3:
micritter.Play();
Console.WriteLine("juegas con al critter");
break;

case 4:

Console.WriteLine("Nombre actual del critter: {0}",micritter.Name);
Console.WriteLine ("Cambiar nombre a: ");
micritter.Name = Console.ReadLine();
break;

default:
Console.WriteLine("no es una entrada valida");
break;
}//fin swith

}//fin while






}//fin main

}//fin class

class Critter {


private string name;
private int pFull = 10;
private int pHappy = 10;
private int pAge = 0;


public int Happy {
get{
return pHappy;
}
}

public int Age2{
get{
return pAge;
}
}


public string Talk(){
string message;
message = "el critter dice: \n ";


if (pHappy > 5){
Console.WriteLine("felicidad = {0}", pHappy);
message += "hola mi nombre es " +Name +"\n";
message += " me siento feliz hoy! \n";}

else if (pHappy>2){
Console.WriteLine("felicidad = {0}", pHappy);
message += " "+Name+" no se siente tan feliz :(...";}

else if (pHappy>0){
Console.WriteLine("felicidad = {0}", pHappy);
message += " "+Name+" esta MOLESTO..";}

else {
Console.WriteLine("felicidad = {0}", pHappy);
message += "apunto de morir";}
return message;
}




public void Play(){
pHappy +=3;

}


public void Eat(){
pFull += 4;

}


public void Age(){
pAge++;
pFull--;
pHappy--;

if (pFull < 3){
pHappy--;}

}




public string Name{
get{
return name;
}

set {
if (value.Length>8){
Console.WriteLine ("el nombre no puede ser cambiado a mas de 8 letras");
name = value;
name = name.Substring(0,8);
Console.WriteLine ("Cambiado el nombre a {0}",name);
} else {
name = value;
}
}



}//fin de getset

public void mostraredad () {
Console.WriteLine("Mi edad es {0}", micritter.Age2);
}

public void talk ()
{
Console.WriteLine("El criter dice: my nombre es {0}", name);
}
}

/* y la funcion mostraredad seria simplemente
public void mostraredad(){
Console.WriteLine("Mi edad es {0}", micritter.Age2);
el detalle es que no se donde ponerla
*/
}
 
Cambie la linea
Console.WriteLine("Mi edad es {0}", micritter.Age2); por
Console.WriteLine("Mi edad es {0}", this.Age2); o
Console.WriteLine("Mi edad es {0}", Age2); o
 
gracias!

Cambie la linea
Console.WriteLine("Mi edad es {0}", micritter.Age2); por
Console.WriteLine("Mi edad es {0}", this.Age2); o
Console.WriteLine("Mi edad es {0}", Age2); o

excelente...gracias..habia probado tambien el colocar Age2 solo pero no se me habia ocurrido colocar el this y tiene sentido...otra pregunta si tenes tiempo...estoy pensando en hacer que si le das mucha comida el criter se muera (un infarto o algo asi) por eso pensaba colocar una condicion en la funcion alimentar..si pasa de 20 pfull (que es el medidor de alimentacion) por ejemplo el critter muere...lo mas sencillo me parece q es que el keepGoing cambie a falso al cumplirse la condicion...pero esta variable esta dentro de main y creo que no la puedo utilizar desde afuera ni colocar publica, puedo manipular el keepGoing afuera del main?...gracias!
 
Fácil cambia el método eat por una función que devuelva 0 si no pasa de 20 y 1 si pasa de 20, en el main puedes evaluar el valor y matar la criatura.
 
sigo fastidiando!

Fácil cambia el método eat por una función que devuelva 0 si no pasa de 20 y 1 si pasa de 20, en el main puedes evaluar el valor y matar la criatura.

ok...bueno ya me estoy poniendo fastidioso...pero intente lo que me decis...y volvieron a aparecer los problemas...puse una variable vida inicializada en 1...que cambia a 0 si el animal pasa de 30 en el nivel de comida (pFull) y coloque un condicional en el main donde si vida es 0 mate al animal...el problema es que en el condicional me vuelve a aparecer lo que me sale siempre (el nombre no existe en el contexto actual)...originalmente vida era publica asi que suponia que la podia utilizar en cualquier sitio (si no es asi avisame) pero como no agarro decidi poner un GetSet y acceder a traves de Vida..aqui esta el codigo..GRACIAS de antmano



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CritterMenu {
class Menu {



static int showMenu () {
int input = 1;
Console.WriteLine();
//primero intente colocar la funcion mostrar edad aqui, me salio la primera advertencia que el objeto no existia en contexto
Console.WriteLine();
Console.WriteLine();
Console.WriteLine();
Console.WriteLine("0)Exit");
Console.WriteLine("1)Escuchar al critter");
Console.WriteLine("2)alimentar al criter");
Console.WriteLine("3)jugar con el critter");
Console.WriteLine("4)renombrar al critter");

try {
input = Convert.ToInt32(Console.ReadLine());
}
catch (FormatException) {
Console.WriteLine("Entrada Incorrecta");
input = 1;
}
return input;
}




static void Main (string[] args)
{

int choice;
bool keepGoing = true;


Critter micritter = new Critter();
micritter.Name = "George";

if (Vida==0) {keepGoing=false}; //AQUI ESTA EL CONDICIONAL YA DE SOLO PONERLO ME MARCA QUE VIDA NO existe EN EL CONTEXTO ACTUAL

while (keepGoing) {

micritter.Age();
//micritter.mostraredad(); //aqui parece que funcionaria, aunque no queda muy bien, solo falta declarar la funcion
//saber donde hacerlo :S
choice = showMenu();
micritter.mostraredad();




switch (choice) {
case 0:
keepGoing = false;
break;

case 1:
micritter.talk();
Console.WriteLine("esta {0} feliz y tiene una edad de {1}",micritter.Happy, micritter.Age2 );
break;

case 2:
micritter.Eat();
Console.WriteLine("alimenta al critter");
break;

case 3:
micritter.Play();
Console.WriteLine("juegas con al critter");
break;

case 4:

Console.WriteLine("Nombre actual del critter: {0}", micritter.Name);
Console.WriteLine ("Cambiar nombre a: ");
micritter.Name = Console.ReadLine();
break;

default:
Console.WriteLine("no es una entrada valida");
break;
}//fin swith

}//fin while






}//fin main

}//fin class










class Critter {


private string name;
private int pFull = 10;
private int pHappy = 10;
private int pAge = 0;
private int vida = 1; //PROBE HACIENDOLA PUBLICA Y TAMPOCO FUNCIONO

//POR ESO AGREGUE ESTE GET SET A VER SI POR "LOCURAS DE MICROSOFT" LO AGARRABA
public int Vida {
get {
return vida;
}
set {
vida = value;
}
}


public int Happy {
get {
return pHappy;
}
}

public int Age2 {
get {
return pAge;
}


}


public string Talk () {
string message;
message = "el critter dice: \n ";


if (pHappy > 5) {
Console.WriteLine("felicidad = {0}", pHappy);
message += "hola mi nombre es " + Name + "\n";
message += " me siento feliz hoy! \n";
}

else if (pHappy > 2) {
Console.WriteLine("felicidad = {0}", pHappy);
message += " " + Name + " no se siente tan feliz :(...";
}

else if (pHappy > 0) {
Console.WriteLine("felicidad = {0}", pHappy);
message += " " + Name + " esta MOLESTO..";
}

else {
Console.WriteLine("felicidad = {0}", pHappy);
message += "apunto de morir";
}
return message;
}




public void Play () {
pHappy += 3;

}

//AQUI ESTA LA FUNCION EAT SI COME MAS DE 30 Vida = 0
public void Eat () {
pFull += 4;
if ((pFull > 20) && (pFull < 30)) {
Console.WriteLine("el critter esta demasiado gordo..debe hacer ejercicio o puede tener un infarto");
}
if (pFull > 30) {
Console.WriteLine("el critter ha muerto de un infarto");
Vida = 0;

}
}



public void Age () {
pAge++;
pFull--;
pHappy--;

if (pFull < 3) {
pHappy--;
}

}


public string Name {
get {
return name;
}

set {
if (value.Length > 8) {
Console.WriteLine("el nombre no puede ser cambiado a mas de 8 letras");
name = value;
name = name.Substring(0, 8);
Console.WriteLine("Cambiado el nombre a {0}", name);
}
else {
name = value;
}
}

}//fin de getset

public void mostraredad () {
Console.WriteLine("Mi edad es {0}", this.Age2);
}


public void talk () {
Console.WriteLine("El criter dice: my nombre es {0}", name);
}






}
}
 
Hola men....el problema es que definiste mal tu variable porque tu definiste vida con v minuscula y en el if la utilisas con V mayuscula osea que: vida no es lo mismo que Vida

int Vida=0; //creo ke eso seria todo
 
ya probe

Hola men....el problema es que definiste mal tu variable porque tu definiste vida con v minuscula y en el if la utilisas con V mayuscula osea que: vida no es lo mismo que Vida

int Vida=0; //creo ke eso seria todo


si bueno...probe declarandola publica como Vida pero no sirvio..fue lo primero que hize..despues lo que hize fue colocarle el get set para q entrando por la funcion Vida poder manipular la variable vida y colocar vida privada..es algo medio complicado y tambien medio inutil en este caso :p pero igual no me quedaba otra q probar...pero com t dije probe poniendola con V mayuscula en todos lados al principio y como publica y no funka tampoco...gracias igual
 
No, le que decía era cambiar la función de Eat por:
public int Eat()
{
pFull += 4;
if (pFull > 20)
{
return 1;
}
else
return 0;
}

y en el main:

case 2:
die = micritter.Eat();
if (die == 1)
{
Console.WriteLine("critter die");
keepGoing = false;
}
else
Console.WriteLine("alimenta al critter");

break;

o como dice el otro lanero, cambia vida por pVida la privada y la propiedad como Vida la que se llama en el main. O mejor exponga la variable pFull con la propiedad Full así puede evaluar la vida de la criatura en cualquier momento.
 
sigue igual....

gracias nacotlan por unirte a la ayuda, hize lo que me dijistes y pensaba que iba a funcionar, pero sigue el mismo problema :enojado: (me dice que die no pertnce al contexto actual)...ya estoy comenzando a pensar que este visual studio esta maldito y no quiere que lo utilize...te adjunto el codigo para que lo veas...coo te dije hize exactamente lo q me dijistes y no tira ningun error de sintaxis ni nada de eso..el problema es la variable que no la ve la otra clase aunque sea publica...:confused:



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CritterMenu {
class Menu {



static int showMenu () {
int input = 1;
Console.WriteLine();
//primero intente colocar la funcion mostrar edad aqui, me salio la primera advertencia que el objeto no existia en contexto
Console.WriteLine();
Console.WriteLine();
Console.WriteLine();
Console.WriteLine("0)Exit");
Console.WriteLine("1)Escuchar al critter");
Console.WriteLine("2)alimentar al criter");
Console.WriteLine("3)jugar con el critter");
Console.WriteLine("4)renombrar al critter");

try {
input = Convert.ToInt32(Console.ReadLine());
}
catch (FormatException) {
Console.WriteLine("Entrada Incorrecta");
input = 1;
}
return input;
}




static void Main (string[] args)
{

int choice;
bool keepGoing = true;


Critter micritter = new Critter();
micritter.Name = "George";



while (keepGoing) {

micritter.Age();
//micritter.mostraredad(); //aqui parece que funcionaria, aunque no queda muy bien, solo falta declarar la funcion
//saber donde hacerlo :S
choice = showMenu();
micritter.mostraredad();




switch (choice) {
case 0:
keepGoing = false;
break;

case 1:
micritter.talk();
Console.WriteLine("esta {0} feliz y tiene una edad de {1}",micritter.Happy, micritter.Age2 );
break;

case 2:
die = micritter.Eat();
if (die == 1) {
Console.WriteLine("critter die");
keepGoing = false;
}
else
Console.WriteLine("alimenta al critter");

case 3:
micritter.Play();
Console.WriteLine("juegas con al critter");
break;

case 4:

Console.WriteLine("Nombre actual del critter: {0}", micritter.Name);
Console.WriteLine ("Cambiar nombre a: ");
micritter.Name = Console.ReadLine();
break;

default:
Console.WriteLine("no es una entrada valida");
break;
}//fin swith

}//fin while






}//fin main

}//fin class










class Critter {


private string name;
private int pFull = 10;
private int pHappy = 10;
private int pAge = 0;

public int die = 0;




public int Happy {
get {
return pHappy;
}
}

public int Age2 {
get {
return pAge;
}


}


public string Talk () {
string message;
message = "el critter dice: \n ";


if (pHappy > 5) {
Console.WriteLine("felicidad = {0}", pHappy);
message += "hola mi nombre es " + Name + "\n";
message += " me siento feliz hoy! \n";
}

else if (pHappy > 2) {
Console.WriteLine("felicidad = {0}", pHappy);
message += " " + Name + " no se siente tan feliz :(...";
}

else if (pHappy > 0) {
Console.WriteLine("felicidad = {0}", pHappy);
message += " " + Name + " esta MOLESTO..";
}

else {
Console.WriteLine("felicidad = {0}", pHappy);
message += "apunto de morir";
}
return message;
}




public void Play () {
pHappy += 3;

}


public int Eat () {
pFull += 4;
if (pFull > 20) {
return 1;
}
else
return 0;
}



public void Age () {
pAge++;
pFull--;
pHappy--;

if (pFull < 3) {
pHappy--;
}

}


public string Name {
get {
return name;
}

set {
if (value.Length > 8) {
Console.WriteLine("el nombre no puede ser cambiado a mas de 8 letras");
name = value;
name = name.Substring(0, 8);
Console.WriteLine("Cambiado el nombre a {0}", name);
}
else {
name = value;
}
}

}//fin de getset

public void mostraredad () {
Console.WriteLine("Mi edad es {0}", this.Age2);
}


public void talk () {
Console.WriteLine("El criter dice: my nombre es {0}", name);
}






}
}
 
ps mira define Vida aca:

static void Main(string[] args)
{

int choice;
bool keepGoing = true;
int Vida = 0;


Critter micritter = new Critter();
micritter.Name = "George";

if ( Vida==0) //{keepGoing=false}; //AQUI ESTA EL CONDICIONAL YA DE SOLO PONERLO ME MARCA QUE VIDA NO existe EN EL CONTEXTO ACTUAL

Yo la defini asi y ami si me corre el programa sin mostrarme errores, sin embargo creo ke hay ke chekearlo aver si no tiene mas errores...
 
objeto c#

Le falto declarar la variable die, yo la habia declarado antes. int die = micritter.Eat(); y falta el break; al case.


hola nacotlan, bueno si la declare...fijate en la ultima copia que puse del codigo...esta justo debajo de la clase critter...mas alla de declararla en algun lado o en otro, no se supone que si la declaras publica la podes utilizar donde sea?...la verdad mas alla de solucionar el problema con este codigo quiero entender bien por q pasa esto...si sabes y me podes explicar me serviria mucho, sino...sera otro misterio del c#>D...


class Critter {


private string name;
private int pFull = 10;
private int pHappy = 10;
private int pAge = 0;

public int die = 0;
 
No hay ningún misterio, cuando Ud. declara una variable publica en una clase, la puede utilizar pero a través de la clase, no sola. Ejemplo: no puede utilizar die en el main, porque en el main no existe, para poder utilizarla debe llamar la clase y después la variable: micritter.die, Le recomiendo que busque documentación sobre el alcance de las variables.
 
bien

ps mira define Vida aca:

static void Main(string[] args)
{

int choice;
bool keepGoing = true;
int Vida = 0;


Critter micritter = new Critter();
micritter.Name = "George";

if ( Vida==0) //{keepGoing=false}; //AQUI ESTA EL CONDICIONAL YA DE SOLO PONERLO ME MARCA QUE VIDA NO existe EN EL CONTEXTO ACTUAL

Yo la defini asi y ami si me corre el programa sin mostrarme errores, sin embargo creo ke hay ke chekearlo aver si no tiene mas errores...




bien..por fin lo arregle...gracias bro..ya arregle otros errores q tenia:p...gracias por la ayuda
 
pero no me sirvio

ok..entiendo lo que que decis..pero eso lo probe y no funciono...era algo mas o menos asi



class Critter {


private string name;
private int pFull = 10;
private int pHappy = 10;
private int pAge = 0;

public int die = 0; ///aqui esta la variable






y despues al invocarlo en el main case 2
case 2:
Critter.die = micritter.Eat(); //clase Critter
if (Critter.die == 1) {
Console.WriteLine("critter die");
keepGoing = false;




siendo Critter la clase en este caso me dice "se requiere una referencia de objeto para el campo, metodo o propiedad no estatico" ??...
 
oye pon de nuevo el codigo fuente de tu programa con lo ke le has añadido hasta ahora, o adjuntalo y asi talvez te pueda ayudar mejor....ya ke en tu programa cada vez ke uno soluciona un error..sale otro...jejeje....eso si ke pasa pero bueno de los errores se aprende...entonces yas sabe men o ud vera si me da su correo y ps te ayudo por msn....
 
ok..entiendo lo que que decis..pero eso lo probe y no funciono...era algo mas o menos asi



class Critter {


private string name;
private int pFull = 10;
private int pHappy = 10;
private int pAge = 0;

public int die = 0; ///aqui esta la variable






y despues al invocarlo en el main case 2
case 2:
Critter.die = micritter.Eat(); //clase Critter
if (Critter.die == 1) {
Console.WriteLine(&quot;critter die&quot;);
keepGoing = false;




siendo Critter la clase en este caso me dice &quot;se requiere una referencia de objeto para el campo, metodo o propiedad no estatico&quot; ??...

No, se complico mucho la función micritter.Eat() devuelve un entero y debe ser recibida por una variable de main Ejemplo:

int die = micritter.Eat();
if (die == 1) {
Console.WriteLine("critter die");
keepGoing = false;
}

Die del main y die de Critter son totalmente diferentes están en ámbitos diferentes. En este caso Critter.die no está haciendo nada la puede eliminar y además para consultarla la debe llamarla por la instancia: micritter.die.
 
vale

oye pon de nuevo el codigo fuente de tu programa con lo ke le has añadido hasta ahora, o adjuntalo y asi talvez te pueda ayudar mejor....ya ke en tu programa cada vez ke uno soluciona un error..sale otro...jejeje....eso si ke pasa pero bueno de los errores se aprende...entonces yas sabe men o ud vera si me da su correo y ps te ayudo por msn....


vale...mejor t doy mi correo agregame angelcrespo21 hotmail ya yo arregle algunos pero todavia hay cosas que no funkan..
 
Si necesitás ayuda.. acá hay un ingeniero en informática en formación que le encanta programar y ayudar
 

Los últimos temas