📄 scgo_219.txt
字号:
//重走times步棋
{
int i;
while(times--)
{
if(RmvdFlagStack_Top==RedoTimesMax){
Beep();Message("已到局末!",50);
DrawFullScreen();
return;
}
ReUnSta(0);
RmvdFlagStack_Top++;
Shou++;
}
}
void PutDown(int x,int y)
//经判断确定,在x,y处走棋
{
int t;
if(!IsInBoard(x,y))return;
Board[x][y]=1+Turn;
RemoveRound(x,y);
Push(x,y);
if(!BuZi)Turn=1-Turn;
if(FlashAlert){
t=FlashSwitch;
FlashSwitch=0;
Undo(1);Redo(1);
FlashSwitch=t;
}
DoTimes++;
}
int InputFileName(int s)
{
int i,t;
char ch,Caps,HuoZuiCap;
i=0;
Caps=1;
HuoZuiCap=1;
FileName[0]=0;
Locate(0,0);
printf("%s目录:LavaData\\SCGO\n文件:*\n\n",s,FileName);
printf("********************");
Locate(3,0);printf("CAPS: [F1] [F3]");
do
{
Locate(2,5);
printf("%s ",FileName);
Locate(2,14);
if(HuoZuiCap)printf(".SGO");
else printf(".sgo");
Box(40,31,150,48,1,2);
ch=getchar();
if(ch==F1)Caps=1-Caps;
if(ch==F3)HuoZuiCap=1-HuoZuiCap;
if((ch==F2||ch==LEFT)&&i>0){
i--;
FileName[i]=0;
}
if((ch>='a'&&ch<='z')||ch==BLANKKEY)
{
if(i<8)
{
if(ch==BLANKKEY)ch=95;
else if(Caps)ch=ch-32;
FileName[i++]=ch;
FileName[i]=0;
}
}
}
while(!(ch==ENTER||ch==JUMP));
if(HuoZuiCap)
strcat(FileName,".SGO");
else strcat(FileName,".sgo");
ClearScreen();
if(ch==JUMP)return 0;
else return 1;
}
void putw(int i,int fp)
{
putc(i,fp);
i=i/0x100;
putc(i,fp);
}
int getw(int fp)
{
return getc(fp)+getc(fp)*0x100;
}
void Save()
{
int i,k;
char c,fp;
if(Message("保存棋局?",1))
{if(!InputFileName("*****[保存棋局]*****")){return;}
if((fp=fopen(FileName, "r"))!=NULL)
{
fclose(fp);
if(Message("棋谱已存在!覆盖?",YES))ClearScreen();
else {return;}
}
if((fp=fopen(FileName, "w+"))==NULL) {
Message("文件操作失败!",YES);
return ;
}
//else
fwrite("[SCGO_SGO]",NULL,10,fp);
for(i=0;i<73;i++)
{
c=0;
for(k=i*5;k<i*5+5;k++)c=c*3+Board[0][k];
putc(c,fp);
}
putc(Turn,fp);
putc(RmvdStkTop,fp);
putw(RedoTimesMax,fp);
putw(Shou,fp);
putw(RmvdFlagStack_Top,fp);
fwrite(PutDownXY_Stack[0],NULL,2*RedoTimesMax+2,fp);
fwrite(RmvdFlagStack,NULL,RedoTimesMax+1,fp);
fwrite(RemovedStack[0],NULL,2*RmvdStkTop+2,fp);
fclose(fp);
DoTimes=0;
Message("保存成功!",500);
}
return;
}
void RemindSaving()
{if(DoTimes>10){WDO=30;Save();WDO=0;}}
void LoadSGO()
{
int i,k;
char c,fp,temp[11];temp[10]=0;
if((fp=fopen(FileName, "r"))==NULL)
{
Beep();
Message("无法打开!",YES);
return ;
}
fread(temp,NULL,10,fp);
if(strcmp(temp,"[SCGO_SGO]")){
Message("这不是本程序存档!",YES);
return;
}
Init();
for(i=0;i<73;i++)
{
c=getc(fp);
for(k=i*5+4;k>=i*5;k--)
{
Board[0][k]=c%3;
c=c/3;
}
}
Turn=getc(fp);
RmvdStkTop=getc(fp);
RedoTimesMax=getw(fp);
Shou=getw(fp);
RmvdFlagStack_Top=getw(fp);
fread(PutDownXY_Stack[0],NULL,2*RedoTimesMax+2,fp);
fread(RmvdFlagStack,NULL,RedoTimesMax+1,fp);
fread(RemovedStack[0],NULL,2*RmvdStkTop+2,fp);
fclose(fp);
Message("读取成功!",500);
ClearScreen();
}
void ExitScgo()
{
int i;
RemindSaving();
ClearScreen();
for(i=0;i<6;i++)
Block(1+i,1+i,159-i,79-i,2);
TextOut(50,18,"<谢谢使用>",1);
TextOut(44,34,"<山 尘 制 作>",1);
TextOut(34,50,"<QQ : 185027516>",1);
Refresh();
while(!Inkey());
exit(0xff);
}
void PrintINFO()
{
ClearScreen();
SetScreen(1);
printf("********[棋谱信息]********%s",QIPUINFO);
getchar();
}
void LoadSGF()
{
int i,k,fp,t,flag;
char ch,ch1,ch2;
ch=0;i=0;
SetScreen(1);
if((fp=fopen(FileName, "r"))==NULL)
{
Beep();
Message("无法打开!",YES);
return ;
}
FlashAlert=FALSE;
Message("数据处理中...",10);
Init();
while(1)
{
while(ch!=';'&&!feof(fp))
{
ch=getc(fp);
QIPUINFO[i++]=ch;
if(i>129)i--;
}
ch=getc(fp);
QIPUINFO[i++]=ch;
if(i>128)i--;
if(ch=='B'||ch=='b')Turn=BLACKTURN;
else if(ch=='W'||ch=='w')Turn=WHITETURN;
else if(!feof(fp))continue;
ch=getc(fp);
QIPUINFO[i++]=ch;
if(i>128)i--;
if(ch!='['&&(!feof(fp)))continue;
else break;
}
i=i-2;
QIPUINFO[i]=')';
QIPUINFO[++i]=NULL;
while(!feof(fp))
{
ch1=tolower(getc(fp))-'a';
ch2=tolower(getc(fp))-'a';
if(ch1>18||ch2>18){Message("读取错误!",1000);return;}
PutDown(ch1,ch2);
do
{ch=getc(fp);}
while((ch!=';')&&(!feof(fp)));
do
{ch=getc(fp);}
while((ch!='[')&&(!feof(fp)));
}
fclose(fp);
ClearScreen();
Message("读取成功!",500);
DoTimes=0;
ClearScreen();
PrintINFO();
DrawFullScreen();
Message("现在是局末",1);
Message("按任意键回到局初",1);
Undo(RedoTimesMax);
FlashAlert=TRUE;
}
void Load()
{
int i,k;
char temp[5];
k=0;
if(!Message("读取棋谱?",YES))return;
RemindSaving();
if(!FileList(FileName))return;
i=strlen(FileName);
if(i>3)strcpy(temp,FileName+i-4);
for(i=0;i<strlen(temp);i++)
temp[i]=toupper(temp[i]);
if(!strcmp(".SGO",temp))LoadSGO();
else if(!strcmp(".SGF",temp))LoadSGF();
else Message("请选择SGO或SGF文件!",1000);
}
void OtherOptions()
{
char Key;
SetScreen(1);
printf("======== 其他选项 ========* 布子模式切换[- B -] \n* 自动提子开关[- A -] \n* 闪 动 开 关 [- F -]\n* 播 放 棋 谱 [- P -]\n* 播 放 间 隔 [- D -]");
Locate(5,22);
printf("%d秒",SplitDelayTime/1000);
Locate(3,22);
if(FlashSwitch)printf("开");
else printf("关");
Box(0,0,159,79,1,2);
Box(8,13,156,77,1,2);
Key=getchar();
if(Key== 'f'){FlashSwitch=1-FlashSwitch;
if(FlashSwitch)Message("闪动开",500);
else Message("闪动关",500);
}
if(Key== 'b'){if(BuZi){
BuZi=FALSE;
Auto=TRUE;
InitStack();
Message("退出布子模式",500);
}
else {
BuZi=TRUE;
Auto=FALSE;
RmvdFlagStack_Top=-1;
Shou=1;
Message("进入布子模式",500);
}
InitStack();
DrawFullScreen();
}
if(Key== 'a'){
if(!BuZi){
Auto=1-Auto;
if(Auto)Message("自动提子开",500);
else Message("自动提子关",500);
DrawFullScreen();
InitStack();
}
}
if(Key== 'p' ){
Message("~开始播放~",500);
DrawFullScreen();
FlashAlert=TRUE;
while(RmvdFlagStack_Top<RedoTimesMax && !Inkey())
{
Redo(1);
Delay(SplitDelayTime);
}
Message("~播放结束~",500);
DrawFullScreen();
}
if(Key=='d'){
SetScreen(1);
printf("请选择播放间隔时间:\n\1 2 3 4 5 6 7 8 9\n0-----------------------8S");
Key=getchar();
if(Key=='b')SplitDelayTime=10;
else if(Key=='n')SplitDelayTime=1000;
else if(Key=='m')SplitDelayTime=2000;
else if(Key=='g')SplitDelayTime=3000;
else if(Key=='h')SplitDelayTime=4000;
else if(Key=='j')SplitDelayTime=5000;
else if(Key=='t')SplitDelayTime=6000;
else if(Key=='y')SplitDelayTime=7000;
else if(Key=='u')SplitDelayTime=8000;
else return;
printf("播放间隔设置成[%d]秒",SplitDelayTime/1000);
getchar();
}
}
void DisplayState() //F4
{
int i;
char ch;
FlashAlert=FALSE;
ClearScreen();
SetScreen(1);
printf("==== 山尘围棋 ver2.19 ====");
if(BuZi)printf("*-布子模式");
else if(Auto)printf("* 自动提子");
else printf("* 手动提子");
printf(" 第 [%d]手\n",Shou,RmvdFlagStack[RmvdFlagStack_Top]);
if(Auto)
printf("* 快进[O/L/-] 前进[%d]手\n* 快退[I/K/^] 后退[%d]手\n",
RedoTimesMax-RmvdFlagStack_Top,RmvdFlagStack_Top);
printf("* 其他[- E -] 提子[%d]枚\n* SGF [- S -] 信息[X]",RmvdFlagStack[RmvdFlagStack_Top]);
Box(0,0,159,79,1,2);
Box(8,13,156,77,1,2);
ch=getchar();
if(Auto)
{
if(ch=='i'){Message("后退10手!",500);Undo(10);}
if(ch=='k'){Message("后退50手!",500);Undo(50);}
if(ch=='o'){Message("前进10手!",500);Redo(10);}
if(ch=='l'){Message("前进50手!",500);Redo(50);}
if(ch==UP){Message("前进至局末!",500);Redo(RedoTimesMax-RmvdFlagStack_Top);}
if(ch==PGUP){Message("后退至初局!",500);Undo(RmvdFlagStack_Top);}
}
if(ch=='e')OtherOptions();
if(ch=='x')PrintINFO();
if(ch=='s')Load();
FlashAlert=TRUE;
ClearScreen();
DrawFullScreen();
}
void help()
{
SetScreen(1);
printf("******** 热线帮助 ********F1:新局 F2:存储 F3:读取\nF4:状态 1-9:快捷 AC:退出\n I:后退 O:前进 R:提子\nMr/Q:下子 SHFT:全屏\n 遇到提问框请按[Y]确认");
getchar();
SetScreen(1);
printf(" 若要连续移动请同时按[.]键及方向键\n 请在主界面按[F4],还有其他选项.\n\n BY:山尘(QQ:185027516)");
getchar();
DrawFullScreen();
}
//--------MAIN-----------
void main()
{
int Key,CursorFalshCount;
char LCDX,LCDY,Y;
Key=0;
CursorFalshCount=0;
ClearScreen();
Init();
if(!ChDir("/LavaData")){MakeDir("/LavaData");ChDir("/LavaData");}
if(!ChDir("SCGO")){MakeDir("SCGO");ChDir("SCGO");}
DrawFullScreen();
Message("[山尘围棋v2.19]",YES);
DrawFullScreen();
while(1)
{
Key=Inkey();
LCDX=CursorX*8+8;
LCDY=CursorY*8;
Y=CursorY+TopOffset;
CursorFalshCount=(CursorFalshCount+1)%5;
Delay(30);
if(CursorFalshCount==1)Box(LCDX-5,LCDY+3,LCDX-4,LCDY+4,1,1);
if(CursorFalshCount==2){Box(LCDX-4,LCDY+2,LCDX-4,LCDY+5,1,1);
Box(LCDX-6,LCDY+3,LCDX-3,LCDY+4,1,1);}
if(CursorFalshCount==3){Box(LCDX-6,LCDY+2,LCDX-3,LCDY+5,1,0);
Box(LCDX-5,LCDY+3,LCDX-4,LCDY+4,1,1);}
if(CursorFalshCount==4)Box(LCDX-6,LCDY+2,LCDX-3,LCDY+5,1,0);
if((Key==UP||Key== 's') || ((CheckKey(UP)||CheckKey('s'))&&CheckKey(DOT)))
{
if(CursorY>0){DrawCurrent();CursorY--;}
else
if(TopOffset>0){TopOffset--;DrawFullScreen();}
else Beep();
}
if((Key==DOWN||Key== 'x') || ((CheckKey(DOWN)||CheckKey('x'))&&CheckKey(DOT)))
{
if(CursorY<9)
{DrawCurrent();
CursorY++;}
else
if(TopOffset<9){TopOffset++;DrawFullScreen();}
else Beep();}
if((Key==LEFT||Key== 'z') || ((CheckKey(LEFT)||CheckKey('z'))&&CheckKey(DOT)))
{
DrawCurrent();
CursorX=(CursorX+18)%19;
}
if((Key==RIGHT||Key== 'c') || ((CheckKey(RIGHT)||CheckKey('c'))&&CheckKey(DOT)))
{
DrawCurrent();
CursorX=(CursorX+20)%19;
}
if(Key== PGUP||Key== 'a'){
if(TopOffset>0)
{
if(TopOffset>3)TopOffset=TopOffset-3;
else TopOffset=0;
DrawFullScreen();
}
else Beep();
}
if(Key== PGDN||Key== 'd' )
{
if(TopOffset<9)
{
if(TopOffset<6)TopOffset=TopOffset+3;
else TopOffset=9;
DrawFullScreen();
}
else Beep();
}
if(Key== ENTER||Key== 'q')
{
if(! Board[CursorX][Y])
{
Board[CursorX][Y]=1+Turn;
if(Auto)
{
if(IsDead(CursorX,Y))
{
if(IsDeadRound(CursorX,Y)&&IsDaJieJinShou(CursorX,Y)==FALSE)
{
PutDown(CursorX,Y);
}
else
{
Beep();
Board[CursorX][Y]=NOSTONE;
}
}
else PutDown(CursorX,Y);
}
else Turn=1-Turn;
if(BuZi)Turn=1-Turn;
DrawScroll();
}
else Beep();
DrawCurrent();
}
if(Key== F1){
if(Message("新开一局?",YES))
{RemindSaving();
Init();}
DrawFullScreen();
}
if(Key== F2){
Save();
DrawFullScreen();
}
if(Key== F3){
Load();
DrawFullScreen();
}
if(Key== F4){
DisplayState();
Refresh();
}
if(Key== 't'){TopOffset=0;CursorX=3;CursorY=3;DrawFullScreen();}
if(Key== 'y'){TopOffset=0;CursorX=9;CursorY=3;DrawFullScreen();}
if(Key== 'u'){TopOffset=0;CursorX=15;CursorY=3;DrawFullScreen();}
if(Key== 'g'){TopOffset=4;CursorX=3;CursorY=5;DrawFullScreen();}
if(Key== 'h'){TopOffset=4;CursorX=9;CursorY=5;DrawFullScreen();}
if(Key== 'j'){TopOffset=4;CursorX=15;CursorY=5;DrawFullScreen();}
if(Key== 'b'){TopOffset=9;CursorX=3;CursorY=6;DrawFullScreen();}
if(Key== 'n'){TopOffset=9;CursorX=9;CursorY=6;DrawFullScreen();}
if(Key== 'm'){TopOffset=9;CursorX=15;CursorY=6;DrawFullScreen();}
if(Key== 'l')
if(BuZi)
{
Turn=1-Turn;
DrawScroll();
Refresh();
}
if(Key== 'r')if(!Auto){
Board[CursorX][Y]=0;
DrawBoardXY(CursorX,Y);
DrawCurrent();
}
else Beep();
if(Key== SHIFT){ DrawFullBoard();
DrawFullScreen();
}
if(Key== 'i'&&Auto)Undo(1);
if(Key== 'o'&&Auto)Redo(1);
if(Key== HELP)help();
if(Key== EXIT)
if(Message("退出?",YES))ExitScgo();
else DrawFullScreen();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -