简易双人五子棋
来源:互联网 发布:oracle 实例端口 编辑:程序博客网 时间:2024/04/30 01:37
在最初学习了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);}
0 0
- 简易双人五子棋
- 初学者:五子棋双人总结
- [Win32] 五子棋双人版
- 双人五子棋改进版
- 【java】双人五子棋代码
- 网页版双人单机五子棋
- 【java】简单的双人五子棋
- 分享Android双人五子棋对战
- java小游戏-双人五子棋小案例
- 简易五子棋 V1.1.0
- canvas简易人机五子棋
- 简易五子棋 c语言
- 简易五子棋,供参考
- Java简易五子棋
- 基于opencv与MFC实现的双人五子棋
- 400行代码实现双人对战五子棋(适合新手入门)
- C语言实现三维五子棋(双人对战版)
- C++应用:简易五子棋游戏
- JRE 和 JDK
- 关于模型抖动解决方案
- 北大 C++ 3.4 静态成员变量和静态成员函数
- WebGL学习系列-片元着色器简介
- UVA.10881 Piotr's Ants (思维题)
- 简易双人五子棋
- 数塔问题--经典的动态规划问题
- WPF中使用文件浏览对话框的几种方式
- 文章标题
- 虚机操作之launch instance日志跟踪
- 1000个赞的《快乐码农》期刊第 10 期
- javaScript的变量的数据类型判定
- 1057.Stack (30)...to be continued...
- 【请您到此查看完整卡密】