首页 > 学院 > 开发设计 > 正文

简易双人五子棋

2019-11-06 09:07:56
字体:
来源:转载
供稿:网友
    在最初学习了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 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);}


上一篇:磁盘分区常识

下一篇:学习笔记

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表