📄 five.c
字号:
#include "gaimfive.h"BeforeBox ReturnBox[400];BOOL WIN; //确定玩者是否赢BOOL Recycle=TRUE;BOOL TempRecycle=TRUE;int Level=2;BOOL OpenGame; //响应变菜单处理int LastX,LastY; //用户最后一次下子对应ChessBox 参数int i,j,LeftMan; //棋盘未下子个数 int BackPictureCode=0;Setxy Bmpxy;int ActionNumber=0;int x1,y1,x2,y2;ChessMan Action;ChessMan ChessBox[20][20];DealDialog GameStyle;static unsigned char background_color[4]={255, 255, 255, 0};static unsigned char line_clolr[4]={0, 0, 0, 0};static unsigned char player_color[4]={80, 120, 80, 0};static unsigned char computer_color[4]={170, 130, 170, 250};const char *save_filename="five_data.dat";Setxy Getxy(int x,int y){ int i,j; Setxy xy; for(i=1;i<=19;i++) if (x>=i*20-10 && x<i*20+10) xy.x=i*20; for(j=1;j<=17;j++) if (y>=j*20-10 && y<j*20+10) xy.y=j*20; return xy;}void InitGame() { ActionNumber=0; GameStyle=normal; WIN=FALSE; OpenGame=TRUE; Action=WhiteMan; LeftMan=323; for(i=0;i<=19;i++) for(j=0;j<=19;j++) *(*(ChessBox+i)+j)=NoMan; for(i=0;i<200;i++) { ReturnBox[i].player.x=0; ReturnBox[i].player.y=0; ReturnBox[i].com.x=0; ReturnBox[i].com.y=0; }}BOOL OppositeRecycle(BOOL style){ if (style==TRUE) return FALSE; else return TRUE;}ChessMan Opposite(ChessMan man) { switch(man) { case WhiteMan: return BlackMan; case BlackMan: return WhiteMan; default: return NoMan; }}BOOL CheckFive(int it,int jt) //判断五子是否连线 { int m1=1,m2=1,n1=1,n2=1,a=1,b=1,total=1; for(;;) { if (a==1 && it-m1>=1 && *(*(ChessBox+it-(m1++))+jt)==Action) total++; else a=0; if (b==1 && it+m2<=19 && *(*(ChessBox+it+(m2++))+jt)==Action) total++; else b=0; if (a==0 && b==0 || total>=5) break; } if (total>=5) return TRUE; m1=1;n1=1;m2=1;n2=1;a=1;b=1;total=1; for(;;) { if (a==1 && jt-n1>=1 && *(*(ChessBox+it)+jt-(n1++))==Action) total++; else a=0; if (b==1 && jt+n2<=19 && *(*(ChessBox+it)+jt+(n2++))==Action) total++; else b=0; if (a==0 && b==0 || total>=5) break; } if (total>=5) return TRUE; m1=1;n1=1;m2=1;n2=1;a=1;b=1;total=1; for(;;) { if (a==1 && it-m1>=1 && jt-n1>=1 && *(*(ChessBox+it-(m1++))+jt-(n1++))==Action) total++; else a=0; if (b==1 && it+m2<=19 && jt+n2<=17 && *(*(ChessBox+it+(m2++))+jt+(n2++))==Action) total++; else b=0; if (a==0 && b==0 || total>=5) break; } if (total>=5) return TRUE; m1=1;n1=1;m2=1;n2=1;a=1;b=1;total=1; for(;;) { if (a==1 && it+m1<=19 && jt-n1>=1 && *(*(ChessBox+it+(m1++))+jt-(n1++))==Action) total++; else a=0; if (b==1 && it-m2>=1 && jt+n2<=19 && *(*(ChessBox+it-(m2++))+jt+(n2++))==Action) total++; else b=0; if (a==0 && b==0 || total>=5) break; } if (total>=5) return TRUE; return FALSE;}int GetManNum(ChessMan style,int it,int jt) //得到该位置最大连线子个数{ int lasttotal=1; int m1=1,m2=1,n1=1,n2=1,a=1,b=1; int total=1; for(;;) { if (a==1) { if(it-m1>=1 && *(*(ChessBox+it-(m1++))+jt)==style) total++; else if(*(*(ChessBox+it-(m1++))+jt)==Opposite(style)) { total-=1; a=0; } else a=0; } if (b==1) { if (it+m2<=19 && *(*(ChessBox+it+(m2++))+jt)==style) total++; else if( *(*(ChessBox+it+(m2++))+jt)==Opposite(style)) { total-=1; b=0; } else b=0; } if (a==0 && b==0) break; } if (total>=lasttotal) lasttotal=total; m1=1,m2=1,n1=1,n2=1,a=1,b=1; total=1; for(;;) { if (a==1) { if(jt-n1>=1 && *(*(ChessBox+it)+jt-(n1++))==style) total++; else if(*(*(ChessBox+it)+jt-(n1++))==Opposite(style)) { total-=1; a=0; } else a=0; } if (b==1 && jt+n2<=17 && *(*(ChessBox+it)+jt+(n2++))==style) total++; else if(*(*(ChessBox+it)+jt+(n2++))==Opposite(style)) { b=0; total-=1; } else b=0; if (a==0 && b==0) break; } if (total>=lasttotal) lasttotal=total; m1=1,m2=1,n1=1,n2=1,a=1,b=1; total=1; for(;;) { if (a==1) { if (it-m1>=1 && jt-n1>=1 && *(*(ChessBox+it-(m1++))+jt-(n1++))==style) total++; else if (*(*(ChessBox+it-(m1++))+jt-(n1++))==Opposite(style)) { total-=1; a=0; } else a=0; } if (b==1) { if (it+m2<=19 && jt+n2<=17 && *(*(ChessBox+it+(m2++))+jt+(n2++))==style) total++; else if(*(*(ChessBox+it+(m2++))+jt+(n2++))==Opposite(style)) { total-=1; b=0; } else b=0; } if (a==0 && b==0) break; } if (total>=lasttotal) lasttotal=total; m1=1,m2=1,n1=1,n2=1,a=1,b=1; total=1; for(;;) { if (a==1) { if(it+m1<=19 && jt-n1>=1 && *(*(ChessBox+it+(m1++))+jt-(n1++))==style) total++; else if (*(*(ChessBox+it+(m1++))+jt-(n1++))==Opposite(style)) { total-=1; a=0; } else a=0; } if (b==1) { if(it-m2>=1 && jt+n2<=17 && *(*(ChessBox+it-(m2++))+jt+(n2++))==style) total++; else if(*(*(ChessBox+it-(m2++))+jt+(n2++))==Opposite(style)) { total-=1; b=0; } else b=0; } if (a==0 && b==0) break; } if (total>=lasttotal) lasttotal=total; return lasttotal;}Setxy GetMaxMan(ChessMan man) { int it,jt; int temp,total=1; Setxy xy; for(it=1;it<=19;it++) { for(jt=1;jt<=19;jt++) { if (*(*(ChessBox+it)+jt)==NoMan) { temp=GetManNum(man,it,jt); if (total<=temp) { total=temp; xy.x=it;xy.y=jt; } } } } return xy;}void Savedat() { FILE *fp=NULL; static char SaveDat[402]=""; int k = 0;; fp = fopen(save_filename, "wb"); assert(fp); for(j=0;j<20;j++) { for(i=0;i<20;i++) { if (ChessBox[i][j]==WhiteMan) SaveDat[k++]='1'; else if (ChessBox[i][j]==BlackMan) SaveDat[k++]='2'; else SaveDat[k++]='0'; } } if (Level==1) SaveDat[401]='1'; else if (Level==2) SaveDat[401]='2'; else SaveDat[401]='3'; fwrite((void *)SaveDat, 402, 1, fp);}BOOL Loaddat() { char LoadDat[402]=""; FILE *fp = NULL; int k=0, LeftMan=0; fp = fopen(save_filename, "rb"); assert(fp); fread((void *)LoadDat, 402, 1, fp); for(k=0;k<400;k++) { i=k/20; j=k%20; if (LoadDat[k]=='1') ChessBox[i][j]=WhiteMan; else if (LoadDat[k]=='2') ChessBox[i][j]=BlackMan; else { ChessBox[i][j]=NoMan; LeftMan++; } } if (LoadDat[401]=='1') Level=1; else if (LoadDat[401]=='2') Level=2; else Level=3; return TRUE;}void user_play(int x, int y){ int i=x, j=y; if (Action==WhiteMan && LeftMan>=1 && x>=0 && x<=19 && y>=0 && y<=19 && OpenGame==TRUE && *(*(ChessBox+x)+y)==NoMan) { ActionNumber++; LastX=x; LastY=y; *(*(ChessBox+x)+y)=WhiteMan; LeftMan--; fb_draw_chess(player_color, 200+10+x*17, 200+10+y*17); ReturnBox[ActionNumber].player.x=x; ReturnBox[ActionNumber].player.y=y; if (CheckFive(x,y)==TRUE) { Action=NoMan; WIN=TRUE; } else Action=BlackMan; if (LeftMan==0 && WIN==FALSE) { //message title } }}void computer_play(){ if (Action==BlackMan && OpenGame==TRUE && LeftMan>=1) { Setxy xy,Whitexy,Blackxy; Blackxy=GetMaxMan(BlackMan); Whitexy=GetMaxMan(WhiteMan); switch(Level) { case LEVEL_EASE: if (GetManNum(WhiteMan,Whitexy.x,Whitexy.y)>GetManNum(BlackMan,Blackxy.x,Blackxy.y)-2) xy=Whitexy; else xy=Blackxy; break; case LEVEL_NORMAL: if (GetManNum(WhiteMan,Whitexy.x,Whitexy.y)>GetManNum(BlackMan,Blackxy.x,Blackxy.y)-1) xy=Whitexy; else xy=Blackxy; break; case LEVEL_HARD: if (GetManNum(WhiteMan,Whitexy.x,Whitexy.y)>GetManNum(BlackMan,Blackxy.x,Blackxy.y)) xy=Whitexy; else xy=Blackxy; break; } *(*(ChessBox+xy.x)+xy.y)=BlackMan; LeftMan--; LastX=xy.x; LastY=xy.y; fb_draw_chess(computer_color, 200+10+LastX*17, 200+10+LastY*17); ReturnBox[ActionNumber].com.x=LastX; ReturnBox[ActionNumber].com.y=LastY; if (CheckFive(xy.x,xy.y)==TRUE) { Action=NoMan; WIN=FALSE; } else Action=WhiteMan; }}void redraw_gui(){ background_init(); for(i=1;i<=19;i++) { for(j=1;j<=19;j++) { if (*(*(ChessBox+i)+j)==WhiteMan) { fb_draw_chess(player_color, 200+10+i*17, 200+10+j*17); } if (*(*(ChessBox+i)+j)==BlackMan) { fb_draw_chess(computer_color, 200+10+i*17, 200+10+j*17); } } }}void background_init(){ int i=0; fb_draw_rect(background_color, 200, 200, 20*17+20, 20*17+20); fb_draw_horizontal_line(line_clolr, 200+10, 200+10, 20*17, 2); fb_draw_horizontal_line(line_clolr, 200+10, 200+10+(20*17), 20*17+1, 2); fb_draw_vertical_line(line_clolr, 200+10, 200+10, 20*17, 2); fb_draw_vertical_line(line_clolr, 200+10+(17*20), 200+10, 20*17, 2); for (i=1; i<=19; i++) { fb_draw_horizontal_line(line_clolr, 200+10, 200+10+(17*i), 20*17, 1); fb_draw_vertical_line(line_clolr, 200+10+(17*i), 200+10, 20*17, 1); }}int main(){ char pchar=0; int k=0, m=0; printf("\033[H\033[J"); fflush(stdout); fb_mmap_buffer(); background_init(); InitGame(); user_play(10, 10); computer_play(); user_play(13, 13); computer_play(); user_play(2, 2); computer_play(); user_play(7, 7); computer_play(); user_play(7, 16); computer_play(); user_play(4, 4); computer_play();/* while (1) { pchar = getchar(); switch (pchar) { case '8': k = k - 1; if (k<0) k= 0; break; case '2': k = k + 1; if (k>19) k = 19; break; case '4': m = m + 1; if (m>19) m = 19; break; case '6': m = m - 1; if (m < 0) m = 0; break; case '5': user_play(m, k); computer_play(); break; } }*/ return 1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -