游戏不能正常工作 [英] game not working properly

查看:77
本文介绍了游戏不能正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  class 移动
{
private
short x;
short y;
int value ;
public
moving( short xa, ya, int va);
void gotoxy( short x, short y);
void gotoxy( short x, short y, bool clear);
void shiftright( short x, short y, int value );

short get_x();
short get_y();
int get_value();

void set_x( short newx);
void set_y( short newy);
void set_value( int newvalue);

int generate_number();
void generate_random_number();



};





这是类移动的主头文件



  #include     moving.h 
#include < iostream >
#include < conio.h >
#include < windows.h >
#include < ctime > //使用时间函数
#include < cstdlib >
使用 命名空间标准;
moving :: moving( short xa, short ya, int va)
{
x = xa;
y = ya;
value = va;
}

void moving :: gotoxy( short x, 简短 y) // 用于设置坐标
{
COORD pos = {x,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}

void moving :: gotoxy( short x, 简短 y, bool clear) // 设置坐标并删除后面值
{
COORD pos = {x,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
cout<< ;
}

void moving :: shiftright( short x, short y, int value // 转移功能
{
gotoxy(x,y);
cout<< value;

}





移动: :get_x()
{
return x;
}

short moving :: get_y()
{
返回 y;
}

int moving :: get_value()
{
返回 ;
}





void moving :: set_x(< span class =code-keyword> short newx)
{
x = newx;
}

void moving :: set_y( short newy)
{
y = newy;
}

void moving :: set_value( int newvalue)
{
value = newvalue;
}





int moving :: generate_number() // 生成随机数
{
srand(time(NULL));
int value = rand()% 10 ;
return value ;
}

void moving :: generate_random_number() // 生成随机坐标并传递随机数
{srand(time(NULL));
x = rand()% 50 ;

y = rand()% 50 ;

// 返回y;

gotoxy (X,Y);
int rand_num = generate_number();
cout<< rand_num;
// 返回rand_num;
}



这是移动的ccp文件





  #include   <  移动。 h  >  
#include < iostream >
#include < conio.h >
#include < windows.h >
#include < span class =code-keyword>< ctime > //使用时间函数
#include < cstdlib >
使用 命名空间标准;

int main()
{move m1( 0 0 0 );
移动m2( 0 0 0 );


m1.shiftright(m1.get_x(),m1.get_y(),m1.get_value());
m2.shiftright(m2.get_x(),m2.get_y(),m2.get_value());

m2.generate_random_number();

// while(m1.get_value()< = 500)
// {
unsigned char a;


while 1
{
A =的getch();


switch (a)
{
case 77
m1.gotoxy(m1.get_y(),m1.get_x(),m1.get_value());
m1.set_y(m1.get_y()+ 1 );
if (m1.get_y()> 50)
m1.set_y( 50 );
m1.shiftright(m1.get_y(),m1.get_x(),m1.get_value());
break ;
case 75
m1.gotoxy(m1.get_y(),m1 .get_x(),m1.get_value());
m1.set_y(m1.get_y() - 1 );
if (m1.get_y()< 0)
m1.set_y( 0 );
m1.shiftright(m1.get_y(),m1.get_x(),m1.get_value());
break ;
case 72
m1.gotoxy(m1.get_y(),m1 .get_x(),m1.get_value());
m1.set_x(m1.get_x() - 1 );
if (m1.get_x()< 0)
m1.set_x( 0 );
m1.shiftright(m1.get_y(),m1.get_x(),m1.get_value());
break ;
case 80
m1.gotoxy(m1.get_y(),m1 .get_x(),m1.get_value());
m1.set_x(m1.get_x()+ 1);
if (m1.get_x()> 50)
m1.set_x( 50 );
m1.shiftright(m1.get_y(),m1.get_x(),m1.get_value());
break ;
case ' e'
break ;
} // 开关

if (m1.get_x()== m2.get_x()&& m1.get_y()== m2.get_y())
{
// m1.set_value(m1.get_value()+ m2.get_value());
< span class =code-comment> //
m1.set_x(0);
// m1.set_y(0);
// m1.shiftright(m1.get_x(),m1.get_y(),m1.get_value());
// m2.shiftright(m2.get_x(),m2.get_y(),m2.get_value());
m2.generate_random_number() ;
}
} // 而cordinates匹配
// } // while< 500

} // itn main



这是主程序



面临的问题是,当我运行程序时,它显示一个随机数,然后我用箭头键得到那个数字然后它不生成另一个randon数字意味着if语句不是working

解决方案

在设置移动坐标时,看起来你已经翻转了 X Y 坐标主程序。

 m1.gotoxy(m1.get_y(),m1.get_x(),m1.get_value()); 



to

 m1.gotoxy(m1.get_x(),m1.get_y(),m1.get_value()); 





或更改

 gotoxy(x,y); 



in moving :: generate_random_number() to

 gotoxy(y,x); 



它更快。



希望这会有所帮助,

Fredrik


看过这个节目后,我来到了与Fredrik相同的结论。

我还注意到keyCodes使用了硬编码值。

此外,每次执行程序时只需要调用一次srand。我已经从重复调用的函数中删除了对它的所有调用,而是将其作为main中的第一个调用。



我建议以下代码有效并给出一个输出类似于游戏'蛇'。



<前一个=c ++> #include < span class =code-preprocessor> < iostream >
#include < conio.h >
#include < windows .h >
#include < ctime > //使用时间function
#include < cstdlib >
#include < cstdio >

#include < iostream >
使用 命名空间标准;


class 移动
{
private
short x;
short y;
int value ;
public
moving( short xa, ya, int va);
void gotoxy( short x, short y);
void gotoxy( short x, short y, bool clear);
void shiftright( short x, short y, int value );

short get_x();
short get_y();
int get_value();

void set_x( short newx);
void set_y( short newy);
void set_value( int newvalue);

int generate_number();
void generate_random_number();
};

/// /////////////// //////////////////////////////////////////

// #includemoving.h
moving :: moving( short xa, short ya, int va )
{
x = xa;
y = ya;
value = va;
}

void moving :: gotoxy( short x, 简短 y) // 用于设置坐标
{
COORD pos = {x,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}

void moving :: gotoxy( short x, 简短 y, bool clear) // 设置坐标并删除后面值
{
COORD pos = {x,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
cout<< ;
}

void moving :: shiftright( short x, short y, int value // 转移功能
{
gotoxy(x,y);
cout<< value;

}

short moving :: get_x()
{
返回 x;
}

short moving :: get_y()
{
返回 y;
}

int moving :: get_value()
{
返回 ;
}

void moving :: set_x( short newx)
{
x = newx;
}

void moving :: set_y( short newy)
{
y = newy;
}

void moving :: set_value( int newvalue)
{
value = newvalue;
}

int moving :: generate_number() // 生成随机数
{
int value = rand()% 10 ;
return value ;
}

void moving :: generate_random_number() // 生成随机坐标并传递随机数
{
x = rand()% 50 ;
y = rand()% 50 ;

gotoxy(x,y);
int rand_num = generate_number();
cout<< rand_num;
}






const int leftKey = 75 ;
const int rightKey = 77 ;
const int upKey = 72 ;
const int downKey = 80 ;

/// /////////////// //////////////////////////////////////////

int main()
{
srand(time(NULL));

移动m1( 0 0 0 );
移动m2( 0 0 ' *');


m1.shiftright(m1.get_x(),m1.get_y(),m1.get_value());
m2.shiftright(m2.get_x(),m2.get_y(),m2.get_value());

m2.generate_random_number();
printf( m1:%d,%d,%c \ n, m1.get_x(),m1.get_y(),m1.get_value());
printf( m2:%d,%d,%c \ n, m2.get_x(),m2.get_y(),m2.get_value());
getch();

// while(m1.get_value()< = 500)
// {
unsigned char a;


while 1
{
A =的getch();

switch (a)
{
case downKey:
m1.gotoxy(m1.get_x(),m1.get_y(),m1.get_value());
m1.set_y(m1.get_y()+ 1 );
if (m1.get_y()> 50)
m1.set_y( 50 );
m1.shiftright(m1.get_x(),m1.get_y(),m1.get_value());
break ;
case upKey:
m1.gotoxy(m1.get_x(),m1.get_y(),m1.get_value());
m1.set_y(m1.get_y() - 1 );
if (m1.get_y()< 0)
m1.set_y( 0 );
m1.shiftright(m1.get_x(),m1.get_y(),m1.get_value());
break ;
case leftKey:
m1.gotoxy(m1.get_x(),m1.get_y(),m1.get_value());
m1.set_x(m1.get_x() - 1 );
if (m1.get_x()< 0)
m1.set_x( 0 );
m1.shiftright(m1.get_x(),m1.get_y(),m1.get_value());
break ;
case rightKey:
m1.gotoxy(m1.get_x(),m1.get_y(),m1.get_value());
m1.set_x(m1.get_x()+ 1);
if (m1.get_x()> 50)
m1.set_x( 50 );
m1.shiftright(m1.get_x(),m1.get_y(),m1.get_value());
break ;
case ' e'
break ;
}

if (m1.get_x()== m2.get_x()&& m1.get_y() == m2.get_y())
{
m2.generate_random_number();
}
}
}


class moving
{
private :
	short x;
	short y;
	int value;
public :
	moving (short xa ,short ya,int va);
	void gotoxy(short x, short y);
	void gotoxy(short x, short y,bool clear);
	void shiftright(short x, short y,int value);

	short get_x() ;
	short get_y()  ;
	int   get_value();

	void set_x(short newx );
	void set_y(short newy);
	void set_value(int newvalue);

	int generate_number();
	void  generate_random_number();



};



this is the main header file of class moving

#include "moving.h"
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <ctime> // to use the time function
#include <cstdlib>
using namespace std;
moving ::moving(short xa ,short ya,int va)
{
	x = xa ;
	y = ya ;
	value =va ;
}

void moving :: gotoxy(short x , short y)   //for setting the cordinates
{
	COORD pos = {x, y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

void moving ::gotoxy(short x ,short y,bool clear) //setting the cordinates and remove the back value
{
	COORD pos = {x, y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
cout<<" ";
}

void moving::shiftright(short x ,short y ,int value ) //function for shifting
{
		gotoxy(x,y);
	cout<<value;

}





short moving ::get_x()
{
	return x ;
}

short moving ::get_y()
{
	return y ;
}

int moving ::get_value()
{
	return value ;
}





void moving ::set_x(short newx)
{
	x=newx;
}

void moving ::set_y(short newy)
{
	y=newy ;
}

void moving ::set_value(int newvalue)
{
	value=newvalue ;
}





int moving::generate_number() //generate random number
{
    srand(time(NULL));
    int value= rand() % 10;
    return value;
}

void moving ::generate_random_number() //generate random cordinates and pass the the random number
{       srand(time(NULL));
	 x= rand() % 50;

    y= rand() % 50;

    //return y;

    gotoxy(x,y);
    int rand_num=generate_number();
    cout<<rand_num;
	//return rand_num;
}


this is the ccp file of moving


#include <moving.h>
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <ctime> // to use the time function
#include <cstdlib>
using namespace std;

int main ()
{   moving m1(0,0,0);
    moving m2 (0,0,0);


   m1.shiftright(m1.get_x(), m1.get_y(), m1.get_value());
   m2.shiftright(m2.get_x(), m2.get_y(), m2.get_value());

   m2.generate_random_number();

   //while(m1.get_value() <= 500)
    //{
        unsigned char  a;


             while(1)
             {
                a=getch();


                switch(a)
                {
                    case 77:
                        m1.gotoxy(m1.get_y(),m1.get_x(),m1.get_value());
                        m1.set_y(m1.get_y() + 1);
                        if(m1.get_y()>50)
                        m1.set_y(50);
                        m1.shiftright(m1.get_y(),m1.get_x(),m1.get_value());
                        break;
                    case 75:
                        m1.gotoxy(m1.get_y(),m1.get_x(),m1.get_value());
                        m1.set_y(m1.get_y()-1);
                        if(m1.get_y()<0)
                        m1.set_y(0);
                        m1.shiftright(m1.get_y(),m1.get_x(),m1.get_value());
                        break;
                    case 72:
                         m1.gotoxy(m1.get_y(),m1.get_x(),m1.get_value());
                        m1.set_x(m1.get_x()-1);
                        if(m1.get_x()<0)
                        m1.set_x(0);
                        m1.shiftright(m1.get_y(),m1.get_x(),m1.get_value());
                        break;
                    case 80:
                         m1.gotoxy(m1.get_y(),m1.get_x(),m1.get_value());
                        m1.set_x(m1.get_x()+1);
                        if(m1.get_x()>50)
                        m1.set_x(50);
                        m1.shiftright(m1.get_y(),m1.get_x(),m1.get_value());
                        break;
                    case 'e':
                    break;
                } //switch

                 if(m1.get_x()==m2.get_x() && m1.get_y()==m2.get_y())
                 {
                     //m1.set_value(m1.get_value() + m2.get_value());
                     //m1.set_x(0);
                     //m1.set_y(0);
                     //m1.shiftright(m1.get_x(), m1.get_y(), m1.get_value());
                     //m2.shiftright(m2.get_x(), m2.get_y(), m2.get_value());
                     m2.generate_random_number();
                 }
             } //while cordinates matches
     //} // while <500

}//itn main


this is the main program

the problem em facing is that when i run the program it display a random number and then i get that number with arrows key then it not generate the other randon number mean that if statement is not working

解决方案

It looks like you've flipped your X and Y coordinates when setting the moving's coordinates in the main program.

m1.gotoxy(m1.get_y(),m1.get_x(),m1.get_value());


to

m1.gotoxy(m1.get_x(),m1.get_y(),m1.get_value());



Or change

gotoxy(x,y);


in moving::generate_random_number() to

gotoxy(y,x);


It's quicker.

Hope this helps,
Fredrik


Having looked at the program, I've come to the same conclusion as Fredrik.
I also note that used hard-coded values for keyCodes.
Also, you only need to call srand once per program execution. I've removed all calls to it from functions that are repeatedly called, instead placing it as the first call inside main.

I suggest the following code works and gives an output that resembles the game 'snake'.

#include <iostream>
#include <conio.h>
#include <windows.h>
#include <ctime> // to use the time function
#include <cstdlib>
#include <cstdio>

#include <iostream>
using namespace std;


class moving
{
private :
    short x;
    short y;
    int value;
public :
    moving (short xa ,short ya,int va);
    void gotoxy(short x, short y);
    void gotoxy(short x, short y,bool clear);
    void shiftright(short x, short y,int value);

    short get_x() ;
    short get_y()  ;
    int   get_value();

    void set_x(short newx );
    void set_y(short newy);
    void set_value(int newvalue);

    int generate_number();
    void  generate_random_number();
};

////////////////////////////////////////////////////////////

//#include "moving.h"
moving ::moving(short xa ,short ya,int va)
{
    x = xa ;
    y = ya ;
    value =va ;
}

void moving::gotoxy(short x , short y)   //for setting the cordinates
{
    COORD pos = {x, y};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

void moving ::gotoxy(short x ,short y,bool clear) //setting the cordinates and remove the back value
{
    COORD pos = {x, y};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
    cout<<" ";
}

void moving::shiftright(short x ,short y ,int value ) //function for shifting
{
    gotoxy(x,y);
    cout<<value;

}

short moving ::get_x()
{
    return x ;
}

short moving ::get_y()
{
    return y ;
}

int moving ::get_value()
{
    return value ;
}

void moving ::set_x(short newx)
{
    x=newx;
}

void moving ::set_y(short newy)
{
    y=newy ;
}

void moving ::set_value(int newvalue)
{
    value=newvalue ;
}

int moving::generate_number() //generate random number
{
    int value= rand() % 10;
    return value;
}

void moving ::generate_random_number() //generate random cordinates and pass the the random number
{
    x= rand() % 50;
    y= rand() % 50;

    gotoxy(x,y);
    int rand_num=generate_number();
    cout<<rand_num;
}






const int leftKey = 75;
const int rightKey = 77;
const int upKey = 72;
const int downKey = 80;

////////////////////////////////////////////////////////////

int main ()
{
    srand(time(NULL));

    moving m1(0,0,0);
    moving m2 (0,0,'*');


    m1.shiftright(m1.get_x(), m1.get_y(), m1.get_value());
    m2.shiftright(m2.get_x(), m2.get_y(), m2.get_value());

    m2.generate_random_number();
    printf("m1: %d,%d,%c\n", m1.get_x(), m1.get_y(), m1.get_value());
    printf("m2: %d,%d,%c\n", m2.get_x(), m2.get_y(), m2.get_value());
    getch();

    //while(m1.get_value() <= 500)
    //{
    unsigned char  a;


    while(1)
    {
        a=getch();

        switch(a)
        {
        case downKey:
            m1.gotoxy(m1.get_x(),m1.get_y(),m1.get_value());
            m1.set_y(m1.get_y() + 1);
            if(m1.get_y()>50)
                m1.set_y(50);
            m1.shiftright(m1.get_x(),m1.get_y(),m1.get_value());
            break;
        case upKey:
            m1.gotoxy(m1.get_x(),m1.get_y(),m1.get_value());
            m1.set_y(m1.get_y()-1);
            if(m1.get_y()<0)
                m1.set_y(0);
            m1.shiftright(m1.get_x(),m1.get_y(),m1.get_value());
            break;
        case leftKey:
            m1.gotoxy(m1.get_x(),m1.get_y(),m1.get_value());
            m1.set_x(m1.get_x()-1);
            if(m1.get_x()<0)
                m1.set_x(0);
            m1.shiftright(m1.get_x(),m1.get_y(),m1.get_value());
            break;
        case rightKey:
            m1.gotoxy(m1.get_x(),m1.get_y(),m1.get_value());
            m1.set_x(m1.get_x()+1);
            if(m1.get_x()>50)
                m1.set_x(50);
            m1.shiftright(m1.get_x(),m1.get_y(),m1.get_value());
            break;
        case 'e':
            break;
        }

        if(m1.get_x()==m2.get_x() && m1.get_y()==m2.get_y())
        {
            m2.generate_random_number();
        }
    }
}


这篇关于游戏不能正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆