+ -
当前位置:首页 → 问答吧 → 实现相邻坐标之间的数据访问

实现相邻坐标之间的数据访问

时间:2011-11-30

来源:互联网

C/C++ code

#include<iostream>
#include<stdlib.h>
using namespace std;
class Coordinate
{
private:
   
public:
    string state;                        //坐标状态
    int x,y,life;                              //坐标以及该坐标上棋子的气数
    Coordinate *right;
    Coordinate *left;
    Coordinate *up;
    Coordinate *down;
    Coordinate()
    {    
        state="empty";                    //初始化气数为4
        life=4;
    }
    void GetPiece(string color)           //落子
    {
        state=color;
    }                     
    void lifeReduce()                   //气数减少,并判断棋子是否生存
    {
        life--;                          //气数减少
        if(life==0&&state.compare("black")==0)              //判断棋子是否生存,在边上的棋子,只要life为1时,就必须被消灭,在角上的,life为2时被消灭,其他life为0时被消灭
            state="empty";
        else if(life==0&&state.compare("white")==0)
            state="empty";
    }
};
class Chessboard
{    
public:
    int Size;
    Coordinate **goBoard;
    Chessboard()                                                   //构造具有19*19个坐标的棋盘
    {
        int choice;
mark:
        cout<<"请选择棋盘类型:1默认;2.自定义"<<endl;
        cin>>choice;
        if(choice==1)
        {
            Size=19;
            SetChessboard(Size);
        }
        else if(choice==2)
        {    
            cout<<"请输入棋盘大小"<<endl;
            cin>>Size;
            SetChessboard(Size); 
        }
        else
        {    
            cout<<"你的选择不正确!"<<endl;
            goto mark;
        }
    }
    void SetChessboard(int Size)                                   //构造具有size*size个坐标的棋盘
    {
        int i,j;
            // if((goBoard=(Coordinate**)malloc(Size*sizeof(Coordinate*)))==NULL)
        if( ( goBoard = new Coordinate*[Size] ) == NULL )          //用来存放指针的数组,其首要地址即指针的指针
        {    
            cout<<"内存初始化失败"<<endl;
            exit(0);
        }
        for(i=0;i<=Size;i++)
        {
            //if((goBoard[i]=(Coordinate*)malloc(Size*sizeof(Coordinate)))==NULL)
            if((goBoard[i] = new Coordinate[Size]()) == NULL )
            {
                cout<<"内存初始化失败"<<endl;
                exit(0);
            }
        } 
        for(i=0;i<Size;i++)                              //处理棋盘边界问题,并为各坐标之间建立联系
            for(j=0;j<Size;j++)
            {
                if(j%(Size-1)==0&&i%(Size-1)==0)
                    goBoard[i][j].life=goBoard[i][j].life-2;
                if((i%(Size-1)==0&&j%(Size-1)!=0)||(i%(Size-1)!=0&&j%(Size-1)==0))
                    goBoard[i][j].life--;
                goBoard[i][j].x=j;                       
                goBoard[i][j].y=i;
                if((j-1)<Size)                          //[color=#FF0000]让相邻坐标之间能相互访问[/color]
                    goBoard[i][j].left=&goBoard[i][j-1];
                if((j+1)>=0)
                    goBoard[i][j].right=&goBoard[i][j+1];
                if((i-1)<Size)
                    goBoard[i][j].up=&goBoard[i-1][j];
                if((i+1)>=0)
                    goBoard[i][j].down=&goBoard[i+1][j];
            }
        cout<<"棋盘初始化完成!"<<endl;
    }
    void showBoard()
    {
        int i,j;
        system("cls");
        for(j=0;j<Size;j++)
            for(i=0;i<Size;i++)
            {    
                cout<<goBoard[j][i].life<<" ";
                if(i==(Size-1))
                cout<<endl;
            }
    }
};

void main()
{
    Chessboard cboard;
    cboard.showBoard();
    cout<<cboard.goBoard[0][0].left->right<<endl;      //[color=#FF0000]这里出来的是地址,而不是数据,请问这是为什么[/color]
    system("pause");
}


作者: blackeagleX   发布时间: 2011-11-30

cboard.goBoard[0][0]->left得到的是Coordinate*指针类型
...->right得到的是也是Coordinate*指针,打印出来当然是地址了。

作者: xingfeng2510   发布时间: 2011-11-30