#include <stdlib.h> #include <stdio.h> #include <conio.h> #include <string.h> #include <malloc.h> struct rcd;//声明节点结构 typedef struct rcd* Record;//节点指针别名 typedef struct rcd record;//节点别名 #define MAXIMUS 15 //定义棋盘大小 int p[MAXIMUS][MAXIMUS];//存储对局信息 char buff[MAXIMUS*2+1][MAXIMUS*4+3];//输出缓冲器 int Cx,Cy;//当前光标位置 int Now;//当前走子的玩家,1代表黑,2代表白 int wl,wp;//当前写入缓冲器的列数和行数位置 char* showText;//在棋盘中央显示的文字信息 int count;//回合数 int Putable;//指示当前是否可以走棋 int Exiting;//1为当场上无子并按ESC时询问是否退出程序的状态,2为非此状态 int ExiRep;//1为当回放到最后一回合并按向后时询问是否退出回放的状态,2为非此状态 Record RecBeg,RecNow;//记录的开始节点和当前节点 struct rcd//记录节点结构,双链表形式 { int X;//此记录走棋的X坐标 int Y;//此记录走棋的Y坐标 Record Next;//前一个记录 Record Back;//后一个记录 }; Record newRecord()//记录节点构造函数 { Record r=(Record)malloc(sizeof(record));//申请一个节点对象 r->Next=NULL;//给予前后节点初值NULL r->Back=NULL; return r; } void Exit()//检查退出程序 { int input; if(Exiting)//如果是第二次按下ESC { exit(0); } else//如果是第一次按下ESC则询问是否退出程序 { showText="是否退出?再次按下ESC退出,其他键返回"; Exiting=1;//指示已经按下过ESC } } void ExitRep()//检查退出回放 { int input; if(ExiRep)//如果是第二次后移 { ExiRep=3; } else//如果是第一次后移则询问是否退出回放 { showText="是否退出?再次后移退出回放,其他键返回"; ExiRep=1;//指示已经按下过后移 } } void AddRecord()//添加记录 { RecNow->X=Cx;//记录坐标 RecNow->Y=Cy; RecNow->Next=newRecord();//创建下一个记录节点 RecNow->Next->Back=RecNow;//完成双链表 RecNow=RecNow->Next;//当前记录推至下一个记录节点 } int DelRecord()//删除当前记录节点,1为删除成功,0为删除失败 { Record b;//上一个节点 if(RecNow->Back!=NULL)//越界检查 { b=RecNow->Back;//缓存上一个节点 free(RecNow);//释放当前节点 RecNow=b;//当前记录回至上一个记录节点 return 1; } else { return 0;//没有节点可删除时 } } void CleanRecord()//清理所有记录 { Record n;//下一个节点 while(RecBeg->Next!=NULL)//删除所有记录,直到越界前为止 { n=RecBeg->Next;//记下下一个节点 free(RecBeg);//释放当前节点 RecBeg=n;//当前记录推至下一个记录节点 } } char* Copy(char* strDest,const char* strSrc)//修改过的字符串复制函数,会忽略末端的 { char* strDestCopy = strDest; while (*strSrc!='