#include <windows.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <conio.h>#define STACK_SIZE 81#define TRUE 1#define FALSE 0typedef int ElemType;typedef struct{ int qp[15][15]; int sum[5]; int ch; int yon; }data;typedef struct Node{ ElemType data[10]; int top;}seqstack; void initStack(seqstack *s) { s->top = -1;}int Empty(seqstack *s) { return (s->top == -1);}int Full(seqstack *s) { return (s->top == STACK_SIZE - 1);}int push(seqstack *s, ElemType elem) { if(Full(s)) return FALSE; s->top++; s->data[s->top] = elem; return TRUE;}int pop(seqstack *s, ElemType *elem) { if(Empty(s)) return FALSE; *elem = s->data[s->top]; s->top--; return TRUE;}void wqizi(){ PRintf("●");} void bqizi(){ printf("○");} void gotoxy(int x,int y) //通过坐标获取光标位置 { COORD pos; pos.X=x; pos.Y=y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);} void qipan( )//棋盘界面 { int MAX=29; int i,j; for( i= 1; i<= MAX; ++i ) { for( j= 1; j<=MAX; ++j ) { if( i== 1 ) { if( j== 1 ) printf( "┏" ); else if( j== MAX ) printf( "┓/n" ); else if( j%2 ) printf( "┳" ); // 横向占两个坐标位,竖向占一个坐标位 else printf( "━" ); } else if( i== MAX ) { if( j== 1 ) printf( "┗" ); else if( j== MAX ) printf( "┛/n" ); else if( j%2 ) printf( "┻" ); else printf( "━" ); } else { if( j== 1 ) { if( i% 2 ) printf( "┣" ); else printf( "┃" ); } else if( j== MAX ) { if( i% 2 ) printf( "┫/n" ); else printf( "┃/n" ); } else { if( i% 2 ) { if( j% 2 ) printf( "╋" ); else printf( "━" ); } else { if( j% 2 ) printf( "┃" ); else printf( " " ); } } } } } gotoxy(60,12); printf("上下左右分别通"); gotoxy(60,14); printf("过W,S,A,D按键"); gotoxy(60,16); printf("来控制,落子通"); gotoxy(60,18); printf("过按键Y来实现");}judgeL(seqstack *le,data *da,int x,int y,int xz)//判断水平方向是否满足获胜条件 { int r1,m; r1=x; da->sum[1]=0; initStack(le); while(da->qp[r1][y]==xz) { r1--; } m=r1+1; while(da->qp[m][y]==xz) { push(le, da->qp[m][y]); m++; } while(!Empty(le)) { int tmp; pop(le, &tmp); da->sum[1]=da->sum[1]+tmp; }}judgeV(seqstack *le,data *da,int x,int y,int xz)//判断竖直方向是否满足获胜条件 { int r1,m; r1=y; da->sum[2]=0; initStack(le); while(da->qp[x][r1]==xz) { r1--; } m=r1+1; while(da->qp[x][m]==xz) { push(le, da->qp[x][m]); m++; } while(!Empty(le)) { int tmp; pop(le, &tmp); da->sum[2]=da->sum[2]+tmp; }}judge45(seqstack *le,data *da,int x,int y,int xz)//判断向左45度是否满足获胜条件 { int r1,r2,m1,m2; r1=x; r2=y; da->sum[3]=0; initStack(le); while(da->qp[r1][r2]==xz) { r1--; r2--; } m1=r1+1; m2=r2+1; while(da->qp[m1][m2]==xz) { push(le, da->qp[m1][m2]); m1++; m2++; } while(!Empty(le)) { int tmp; pop(le, &tmp); da->sum[3]=da->sum[3]+tmp; }}judge135(seqstack *le,data *da,int x,int y,int xz)//判断向右45度是否满足获胜条件 { int r1,r2,m1,m2; r1=x; r2=y; da->sum[4]=0; initStack(le); while(da->qp[r1][r2]==xz) { r1++; r2--; } m1=r1-1; m2=r2+1; while(da->qp[m1][m2]==xz) { push(le,da->qp[m1][m2]); m1--; m2++; } while(!Empty(le)) { int tmp; pop(le, &tmp); da->sum[4]=da->sum[4]+tmp; }}void weizhi(data *da,int x,int y)//用来判断此位置是否已经落子 { if(da->qp[x][y]==1 || da->qp[x][y]==2) { gotoxy(65,10); printf("此位置不合法"); Sleep(1000); gotoxy(65,10); printf(" "); fflush(stdout); da->ch=1; }}zlyj(seqstack *le,data *da)//让用户选择是否再来一局 { int s=0; da->yon=0; gotoxy(20,9); printf("按Y再来一局,按N退出"); da->yon=getch(); while(da->yon!='Y' && da->yon!='y' && da->yon!='N' && da->yon!='n') { da->yon=getch(); } if(da->yon=='Y' || da->yon=='y'){gotoxy(0,0);qipan();dire(le,da);} if(da->yon=='N' || da->yon=='n')da->yon=1;}void dire(seqstack *le,data *da)//用来控制棋子的移动及落子操作的实现 { int x=0,y=0,a,b,n=1,pd=2; int i,j,m,o[3]={0,0,0}; gotoxy(65,5); printf("执黑子行"); gotoxy(x,y); for(i=0;i<=15;i++) for(j=0;j<=15;j++) da->qp[i][j]=0; da->qp[x][y]=0; while(1) { int sum1,sum2; a=getch(); b=pow(-1,n); if(a=='a' || a=='A') { if(x<1) continue; gotoxy(4*(x-1),y*2); x=x-1; pd=1; } if(a=='d' || a=='D') { if(x>13) continue; gotoxy((x+1)*4,y*2); x=x+1; pd=1; } if(a=='w' || a=='W') { if(y<1) continue; gotoxy(x*4,(y-1)*2); y=y-1; pd=1; } if(a=='s' || a=='S') { if(y>13) continue; gotoxy(x*4,(y+1)*2); y=y+1; pd=1; } if(b==-1 && (a=='y' || a=='Y') && pd==1) { weizhi(da,x,y); if(da->ch==1){da->ch=0;continue;} bqizi(); o[1]++; n++; pd=0; da->qp[x][y]=1; gotoxy(65,5); printf("执白子行"); gotoxy(x*4+2,y*2); judgeL(le,da,x,y,1); judgeV(le,da,x,y,1); judge45(le,da,x,y,1); judge135(le,da,x,y,1); if(da->sum[1]>5 || da->sum[2]>5 || da->sum[3]>5 || da->sum[4]>5) { gotoxy(20,5); printf("由禁手规则,白棋获胜!"); zlyj(le,da); if(da->yon==1)return 0; } if(da->sum[1]==5 || da->sum[2]==5 || da->sum[3]==5 || da->sum[4]==5) { gotoxy(25,5); printf("黑棋胜!"); zlyj(le,da); if(da->yon==1)return 0; } } if(b==1 && (a=='y' || a=='Y') && pd==1) { weizhi(da,x,y); if(da->ch==1){da->ch=0;continue;} wqizi(); o[0]++; n++; pd=0; da->qp[x][y]=2; gotoxy(65,5); printf("执黑子行"); gotoxy(x*4+2,y*2); judgeL(le,da,x,y,2); judgeV(le,da,x,y,2); judge45(le,da,x,y,2); judge135(le,da,x,y,2); if(da->sum[1]>=10 || da->sum[2]>=10 || da->sum[3]>=10 || da->sum[4]>=10) { gotoxy(25,7); printf("白棋胜!"); zlyj(le,da); if(da->yon==1)return 0; } } if(pd==2 && (a=='y' || a=='Y')) { bqizi(); o[2]=1; n++; pd=0; da->qp[x][y]=1; gotoxy(65,5); printf("执白子行"); gotoxy(x*4+2,y*2); } if(o[0]+o[1]+o[2]==225) { gotoxy(25,7); printf("棋局已满"); zlyj(le,da); if(da->yon==1)return 0; } }}int main(){ gotoxy(32,10); printf("欢迎使用双人对战五子棋系统!"); Sleep(2000); system("cls"); fflush(stdout); seqstack le; data da; system("mode con cols=80 lines=40"); qipan(); dire(&le,&da);}
新闻热点
疑难解答