简易双人五子棋
在最初學習了C語言和數據結構后就嘗試著寫寫一個較為高端的程序,這個高端也是相對于當時掌握的只是來說的,于是我便寫了這個簡易小游戲,雙人五子棋。由于水平有限,寫的很粗糙,不過不管怎么說也是第一個獨自完成的大點的程序,還有就是這個調試環境為DEV C++。下面是這個程序的代碼:
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define STACK_SIZE 81
#define TRUE 1
#define FALSE 0
typedef 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( "┳" ); // 橫向占兩個坐標位,豎向占一個坐標位 elseprintf( "━" );}else if( i== MAX ){if( j== 1 )printf( "┗" );else if( j== MAX )printf( "┛\n" );else if( j%2 )printf( "┻" );elseprintf( "━" );}else{if( j== 1 ){if( i% 2 )printf( "┣" );elseprintf( "┃" );}else if( j== MAX ){if( i% 2 )printf( "┫\n" );elseprintf( "┃\n" );}else{if( i% 2 ){if( j% 2 )printf( "╋" );elseprintf( "━" );}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);
}
總結
- 上一篇: python 虚拟mac地址_随机生成M
- 下一篇: 内存颗粒位宽和容量_【存储器】浅谈SDR