初涉c++ ——完善五子棋的保存加载功能

    技术2022-06-26  60

      前几周我们接到老师的题目,要我们编程实现五子棋的保存和加载功能,当时我们都傻眼了,才接触到c的指针,怎样去完成c++的保存呀!但是人都是被逼出来的,最终我可以做出来了。五子棋程序可以保存棋盘,加载后也可以悔棋。

      其实这很大程度归功于对c++中的cin的接触,我在上发了一个帖子,专门问了一下这个问题,一些高手居然肯屈尊来指教。其中一个网友说重载<<>>,当时我觉得很有道理,并思考是否Lf_saveFilecin是一样的是类中的文件输入流。于是套用在老师给的学生版中,先对一个数据进行存储,接着编译通过,然后再对下面的数据以同样的方法对数据进行存储。

      然而难题出现了,存储之后,我怎样将所存的问件打开并读取呢?一开始我以为一定要二进制才能有逆转化,结果在MSDN 上查询关于转格式的函数,比如char * itoavalue*str2)这样的函数。最后一位网友说为什么一定要二进制呀,其他格式也可以。只要可以存储且读取时可以识别信息任何符号都是可以的。于是我根据网络资料搜集到一个完成版,果然是不进行任何转换而是直接对数据进行存取。不过我不知道为何在装载bool类型的数据时会出错,于是我另外定义两变量,先将bool型的变量转换成int型的,居然可以。

      下面附上我的代码:

    void CMyDlg::OnSave() 

    {

    int i,j; //定义两个计数器,用于循环

    CString ls_fileName;//声明一个对象文件名

    ofstream lf_saveFile;//声明一个存储对象

    CFileDialog lcf_open(false,"wzq",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,

    "wzq files(*.wzq)||",NULL);//打开文件,添加文件名

    if (lcf_open.DoModal()==IDOK){

    ls_fileName = lcf_open.GetPathName();

    lf_saveFile.open (ls_fileName);  

      if(! lf_saveFile)             

      {

      AfxMessageBox("不能打开文件");  //  弹出消息框,提示不能打开文件

      return;

      }

    lf_saveFile<<twzq.nturn<<endl; //开始读入各种数据,直接读入无需转换

      lf_saveFile<<twzq.AItype<<endl;//其实只要保存和装载过程互逆且结果一一对应

      lf_saveFile<<twzq.Model<<endl;//就能起到存储和载入功能了

      for(i=0;i<15;i++)            

      for(j=0;j<15;j++)       

      lf_saveFile<<twzq.map[i][j]<<endl;     

       lf_saveFile<<twzq.nowd2<<endl;

       for(i=0;i<255;i++){

       lf_saveFile<<twzq.wzs[i].used<<endl;

            lf_saveFile<<twzq.wzs[i].color<<endl;

    lf_saveFile<<twzq.wzs[i].ix<<endl;

    lf_saveFile<<twzq.wzs[i].iy<<endl;

    }

    }

    lf_saveFile.close();}

    //以下是装载功能类

    void CMyDlg::OnLoad() 

    {

    int i,j;

    CString ls_fileName;

         ifstream lf_loadFile;

    CFileDialog lcf_open(true,"wzq",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,

    "wzq files(*.wzq)||",NULL);

    if (lcf_open.DoModal()==IDOK){

    //以上部分同onsave

    ls_fileName = lcf_open.GetPathName();

    lf_loadFile.open(ls_fileName);

    if(! lf_loadFile)             //判断是否可以装载文件 

    {

      AfxMessageBox("文件不能装载");    // 如不能则提示文件不能装载

      return;

      }

    twzq.NewGame();

    lf_loadFile>>twzq.nturn;//开始对文件进行读取

    lf_loadFile>>twzq.AItype;

    lf_loadFile>>twzq.Model;

    for(i=0;i<15;i++)

    for(j=0;j<15;j++)

    lf_loadFile>>twzq.map[i][j];

    lf_loadFile>>twzq.nowd2;

    for(i=0;i<225;i++)

    {

    int used,color;

    used=(int)twzq.wzs[i].used;//先将bool型转换成int型

    color=(int)twzq.wzs[i].color;//便于进行读取

    lf_loadFile>>used;

    lf_loadFile>>color;

    lf_loadFile>>twzq.wzs[i].ix;

    lf_loadFile>>twzq.wzs[i].iy;

    }

    }

    CMyDlg::m_back.EnableWindow(twzq.getbackble()); 

    twzq.draw();

    }

     不知道有没有更好的方法,或者哪里有错误,欢迎指教。

      从这次作业中得到的不只是正确的结果,更重要的是学会求教,学会怎样编写一些对自己比较有难度的程序。比如上论坛去求教,跟老师讨论,这些都是很好的方法。以后肯定会遇到更加具有挑战性的东西,而这些东西正是给我们带来快乐的东西。感谢给予我帮助的朋友,我不怕把我不成熟的想法表达出来,希望可以得到更加有益的指导。

                                                      2011.01.09 by bibodeng


    最新回复(0)