这是WIN32
有点难度了啊
**********************************************************//* 程序中用到的库函数所在头文件应用 #include 命令包含进来 */#include <>#include <>#include <>#include <>#include <>/**********************************************************//* 定义符号常量 *//*定义画棋盘所需的制表符*/#define CROSSRU 0xbf /*右上角点*/#define CROSSLU 0xda /*左上角点*/#define CROSSLD 0xc0 /*左下角点*/#define CROSSRD 0xd9 /*右下角点*/#define CROSSL 0xc3 /*左边*/#define CROSSR 0xb4 /*右边*/#define CROSSU 0xc2 /*上边*/#define CROSSD 0xc1 /*下边*/#define CROSS 0xc5 /*十字交叉点*//*定义棋盘左上角点在屏幕上的位置*/#define MAPXOFT 5#define MAPYOFT 2/*定义1号玩家的操作键键码*/#define PLAY1UP 0x1157/*上移--'W'*/#define PLAY1DOWN 0x1f53/*下移--'S'*/#define PLAY1LEFT 0x1e41/*左移--'A'*/#define PLAY1RIGHT 0x2044/*右移--'D'*/#define PLAY1DO 0x3920/*落子--空格键*//*定义2号玩家的操作键键码*/#define PLAY2UP 0x4800/*上移--方向键up*/#define PLAY2DOWN 0x5000/*下移--方向键down*/#define PLAY2LEFT 0x4b00/*左移--方向键left*/#define PLAY2RIGHT 0x4d00/*右移--方向键right*/#define PLAY2DO 0x1c0d/*落子--回车键Enter*//*若想在游戏中途退出, 可按 Esc 键*/#define ESCAPE 0x011b/*定义棋盘上交叉点的状态, 即该点有无棋子 *//*若有棋子, 还应能指出是哪个玩家的棋子 */#define CHESSNULL 0 //没有棋子#define CHESS1 'O'//一号玩家的棋子#define CHESS2 'X'//二号玩家的棋子/*定义按键类别*/#define KEYEXIT 0/*退出键*/#define KEYFALLCHESS 1/*落子键*/#define KEYMOVECURSOR 2/*光标移动键*/#define KEYINVALID 3/*无效键*//*定义符号常量: 真, 假 --- 真为1, 假为0 */#define TRUE 1#define FALSE 0/**********************************************************//* 定义数据结构 *//*棋盘交叉点坐标的数据结构*/struct point{ int x,y;};/**********************************************************//*自定义函数原型说明 */void Init(void);int GetKey(void);int CheckKey(int press);int ChangeOrder(void);int ChessGo(int Order,struct point Cursor);void DoError(void);void DoOK(void);void DoWin(int Order);void MoveCursor(int Order,int press);void DrawCross(int x,int y);void DrawMap(void);int JudgeWin(int Order,struct point Cursor);int JudgeWinLine(int Order,struct point Cursor,int direction);void ShowOrderMsg(int Order);void EndGame(void);/**********************************************************//**********************************************************//* 定义全局变量 */int gPlayOrder; /*指示当前行棋方 */struct point gCursor; /*光标在棋盘上的位置 */char gChessBoard[19][19];/*用于记录棋盘上各点的状态*//**********************************************************//**********************************************************//*主函数*/void main(){ int press; int bOutWhile=FALSE;/*退出循环标志*/ Init();/*初始化图象,数据*/ while(1) { press=GetKey();/*获取用户的按键值*/ switch(CheckKey(press))/*判断按键类别*/ { /*是退出键*/ case KEYEXIT: clrscr();/*清屏*/ bOutWhile = TRUE; break; /*是落子键*/ case KEYFALLCHESS: if(ChessGo(gPlayOrder,gCursor)==FALSE)/*走棋*/ DoError();/*落子错误*/ else { DoOK();/*落子正确*/ /*如果当前行棋方赢棋*/ if(JudgeWin(gPlayOrder,gCursor)==TRUE) { DoWin(gPlayOrder); bOutWhile = TRUE;/*退出循环标志置为真*/ } /*否则*/ else /*交换行棋方*/ ChangeOrder(); } break; /*是光标移动键*/ case KEYMOVECURSOR: MoveCursor(gPlayOrder,press); break; /*是无效键*/ case KEYINVALID: break; } if(bOutWhile==TRUE) break; } /*游戏结束*/ EndGame();}/**********************************************************//*界面初始化,数据初始化*/void Init(void){ int i,j; char *Msg[]= { "Player1 key:", " UP----w", " DOWN--s", " LEFT--a", " RIGHT-d", " DO----space", "", "Player2 key:", " UP----up", " DOWN--down", " LEFT--left", " RIGHT-right", " DO----ENTER", "", "exit game:", " ESC", NULL, }; /*先手方为1号玩家*/ gPlayOrder = CHESS1; /*棋盘数据清零, 即棋盘上各点开始的时候都没有棋子*/ for(i=0;i<19;i++) for(j=0;j<19;j++) gChessBoard[i][j]=CHESSNULL; /*光标初始位置*/ ; /*画棋盘*/ textmode(C40); DrawMap(); /*显示操作键说明*/ i=0; textcolor(BROWN); while(Msg[i]!=NULL) { gotoxy(25,3+i); cputs(Msg[i]); i++; } /*显示当前行棋方*/ ShowOrderMsg(gPlayOrder); /*光标移至棋盘的左上角点处*/ gotoxy();}/*画棋盘*/void DrawMap(void){ int i,j; clrscr(); for(i=0;i<19;i++) for(j=0;j<19;j++) DrawCross(i,j);}/*画棋盘上的交叉点*/void DrawCross(int x,int y){ gotoxy(x+MAPXOFT,y+MAPYOFT); /*交叉点上是一号玩家的棋子*/ if(gChessBoard[x][y]==CHESS1) { textcolor(LIGHTBLUE); putch(CHESS1); return; } /*交叉点上是二号玩家的棋子*/ if(gChessBoard[x][y]==CHESS2) { textcolor(LIGHTBLUE); putch(CHESS2); return; } textcolor(GREEN); /*左上角交叉点*/ if(x==0&&y==0) { putch(CROSSLU); return; } /*左下角交叉点*/ if(x==0&&y==18) { putch(CROSSLD); return; } /*右上角交叉点*/ if(x==18&&y==0) { putch(CROSSRU); return; } /*右下角交叉点*/ if(x==18&&y==18) { putch(CROSSRD); return; } /*左边界交叉点*/ if(x==0) { putch(CROSSL); return; } /*右边界交叉点*/ if(x==18) { putch(CROSSR); return; } /*上边界交叉点*/ if(y==0) { putch(CROSSU); return; } /*下边界交叉点*/ if(y==18) { putch(CROSSD); return; } /*棋盘中间的交叉点*/ putch(CROSS);}/*交换行棋方*/int ChangeOrder(void){ if(gPlayOrder==CHESS1) gPlayOrder=CHESS2; else gPlayOrder=CHESS1; return(gPlayOrder);}/*获取按键值*/int GetKey(void){ char lowbyte; int press; while (bioskey(1) == 0) ;/*如果用户没有按键,空循环*/ press=bioskey(0); lowbyte=press&0xff; press=press&0xff00 + toupper(lowbyte); return(press);}/*落子错误处理*/void DoError(void){ sound(1200); delay(50); nosound();}/*赢棋处理*/void DoWin(int Order){ sound(1500);delay(100); sound(0); delay(50); sound(800); delay(100); sound(0); delay(50); sound(1500);delay(100); sound(0); delay(50); sound(800); delay(100); sound(0); delay(50); nosound(); textcolor(RED+BLINK); gotoxy(25,20); if(Order==CHESS1) cputs("PLAYER1 WIN!"); else cputs("PLAYER2 WIN!"); gotoxy(25,21); cputs(" \\<^+^>/"); getch();}/*走棋*/int ChessGo(int Order,struct point Cursor){ /*判断交叉点上有无棋子*/ if(gChessBoard[][]==CHESSNULL) { /*若没有棋子, 则可以落子*/ gotoxy(); textcolor(LIGHTBLUE); putch(Order); gotoxy(); gChessBoard[][]=Order; return TRUE; } else return FALSE;}/*判断当前行棋方落子后是否赢棋*/int JudgeWin(int Order,struct point Cursor){ int i; for(i=0;i<4;i++) /*判断在指定方向上是否有连续5个行棋方的棋子*/ if(JudgeWinLine(Order,Cursor,i)) return TRUE; return FALSE;}/*判断在指定方向上是否有连续5个行棋方的棋子*/int JudgeWinLine(int Order,struct point Cursor,int direction){ int i; struct point pos,dpos; const int testnum = 5; int count; switch(direction) { case 0:/*在水平方向*/ (testnum-1); ; ; ; break; case 1:/*在垂直方向*/ ; (testnum-1); ; ; break; case 2:/*在左下至右上的斜方向*/ (testnum-1); (testnum-1); ; ; break; case 3:/*在左上至右下的斜方向*/ (testnum-1); (testnum-1); ; ; break; } count=0; for(i=0;i
//但是这些代码由于编译器的原因,在TC下仍无法运行。请使用VC。#include <>#include <>#include <>#include <>int ChessData[15][15] ={0};int GuangbiaoData[2]={8,8};int ChessStepData[255][2]={0};void gotoxy(int x, int y) //gotoxy在TC中是在一个系统自带的函数,但是在VC中没有这个函数,所以在网上找到了这个函数以实现同样的功能。//只有这一个函数是网上找的,别的全部我自己写的。{ COORD c; ; ; SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c); }void GotoChess(int x,int y){x=3*x-2;y=2*y-1;gotoxy(x,y);}void Move(int MoveData) //输入参数为用户输入的方向(1表示上,2表示下,3表示左,4表示右){switch (MoveData){case 1:GuangbiaoData[1]-=1;break;case 2:GuangbiaoData[1]+=1;break;case 3:GuangbiaoData[0]-=1;break;case 4:GuangbiaoData[0]+=1;break;default:printf("Move函数出错");}GotoChess(GuangbiaoData[0],GuangbiaoData[1]);}int Get(int *data) //该函数的功能是用户的按键,并转化为01234567(0表示输入错误,1表示上,2表示下,3表示左,4表示右,5表示落子,6表示悔棋,7表示退出。){ //并返回输入的用户号码(共同键返回3),错误则返回0int temp;B: temp=getch();if (temp==224) { temp=getch(); switch (temp) { case 72:*data=1;break; case 80:*data=2;break; case 75:*data=3;break; case 77:*data=4;break; default:goto B; } return 2;}else { switch (temp) { case 'w': case 'W':*data=1;return 1;break; case 's': case 'S':*data=2;return 1;break; case 'a': case 'A':*data=3;return 1;break; case 'd': case 'D':*data=4;return 1;break; case 13 :*data=5;return 2;break; case 32 :*data=5;return 1;break; case 8 :*data=6;break; case 27 :*data=7;break; default:*data=0 ;return 0;break; } return 3;}}void MoveToEnd(){gotoxy(1,30);}int LogicBeOut(int a,int b){if (a==-1||a==15||b==-1||b==15) return 1;else return 0;}int win(int v){int i=1,j=1,a=0,b=0;while (ChessData[a=GuangbiaoData[0]-i-1][b=GuangbiaoData[1]-i-1]==v*2&&!LogicBeOut(a,b)) i++;while (ChessData[a=GuangbiaoData[0]+j-1][b=GuangbiaoData[1]+j-1]==v*2&&!LogicBeOut(a,b)) j++;if (i+j-1>=5) return 1;i=1,j=1,a=0,b=0;while (ChessData[a=GuangbiaoData[0]+i-1][b=GuangbiaoData[1]-i-1]==v*2&&!LogicBeOut(a,b)) i++;while (ChessData[a=GuangbiaoData[0]-j-1][b=GuangbiaoData[1]+j-1]==v*2&&!LogicBeOut(a,b)) j++;if (i+j-1>=5) return 1;i=1,j=1,a=0,b=0;while (ChessData[a=GuangbiaoData[0]-i-1][b=GuangbiaoData[1]-1]==v*2&&!LogicBeOut(a,b)) i++;while (ChessData[a=GuangbiaoData[0]+j-1][b=GuangbiaoData[1]-1]==v*2&&!LogicBeOut(a,b)) j++;if (i+j-1>=5) return 1;i=1,j=1,a=0,b=0;while (ChessData[a=GuangbiaoData[0]-1][b=GuangbiaoData[1]-i-1]==v*2&&!LogicBeOut(a,b)) i++;while (ChessData[a=GuangbiaoData[0]-1][b=GuangbiaoData[1]+j-1]==v*2&&!LogicBeOut(a,b)) j++;if (i+j-1>=5) return 1;return 0;}void NewShow() //新棋局的开始{int i,j;for (i=0;i<15;i++) for (j=0;j<15;j++) ChessData[i][j]=0;system("cls");for (i=1;i<=29;i++){ for (j=1;j<=43;j++) if(i%2==1) printf("-"); else if (j%3==1) printf("|"); else printf(" "); printf("\n");}GuangbiaoData[0]=8;GuangbiaoData[1]=8;MoveToEnd();printf("现在请用户1下棋 \n");printf("用户1使用 w,s,a,d移动光标,空格键落子\n");printf("用户2使用各方向键移动光标,回车键落子\n");printf("按下Backspace键悔棋,按下esc返回主菜单\n");GotoChess(8,8);}int BeOut(int data){int Xiuzheng[2],New[2];switch (data){case 1:Xiuzheng[0]=0;Xiuzheng[1]=-1 ;break;case 2:Xiuzheng[0]=0;Xiuzheng[1]=1;break;case 3:Xiuzheng[0]=-1;Xiuzheng[1]=0;break;case 4:Xiuzheng[0]=1;Xiuzheng[1]=0 ;break;case 5:Xiuzheng[0]=0;Xiuzheng[1]=0 ;break;default:printf("BeOut函数出错");}New[0]=GuangbiaoData[0]+Xiuzheng[0];New[1]=GuangbiaoData[1]+Xiuzheng[1];if (New[0]>15||New[0]<1||New[1]>15||New[1]<1) return 1;else return 0; }void UserChoose(int * choice){ system("cls");printf("________________________________________________________________________________");printf("________________________________________________________________________________");printf(" $1.单人游戏 ");printf(" 2.双人游戏 ");printf(" 3.退出游戏 ");printf(" 4.游戏帮助 ");printf("________________________________________________________________________________");printf("________________________________________________________________________________");printf(" ");printf(" 开心五子棋 ");printf(" ");printf(" 出品人:张云聪 ");printf(" 学号:067108034 ");printf(" 指导老师:邵艳玲 ");printf(" ");printf(" ");printf(" 温馨提示,游戏时请把窗口最大化,以达到最佳效果 ");printf("________________________________________________________________________________");int temp=0,i=0;do{ if ((temp=getch())==224) { temp=getch(); if (temp==72&&i!=0) { gotoxy(34,3+i); printf(" "); i--; gotoxy(34,3+i); printf("$"); gotoxy(0,0); } else if(temp==80&&i!=3) { gotoxy(34,3+i); printf(" "); i++; gotoxy(34,3+i); printf("$"); gotoxy(0,0); } } else if (temp==13) {*choice=i+1;return;} else if (temp==27) {*choice=3;return;} else if (temp=='1'||temp=='2'||temp=='3'||temp=='4') {*choice=temp-48;return;}}while(1);}int CannotDo(int v1,int v2,int MoveData,int choice) //第一个输入值为按键的用户号,第二个是本应该按键的用户号,第三个为按下键的对应值,第四个键代表游戏模式。{if (v1==3) return 0; //如果用户输入的为共用按键,则CannotDo为假else if (v1==0) return 1;//如果用户输入错误,则CannotDo为真else if (v1!=v2&&choice==2) return 1; //如果不该此用户输入,而用户进行了输入,则CannotDo为真if (BeOut(MoveData)) return 1; //如果移动出边界则CannotDo为真return 0;}int CannotLuozi() //判断是否可以落子。{if (ChessData[GuangbiaoData[0]-1][GuangbiaoData[1]-1]) return 1;else return 0;}int luozi(int v) //玩家v落子。{ ChessData[GuangbiaoData[0]-1][GuangbiaoData[1]-1]+=v*2;if (v==1) printf("O");else if (v==2) printf("X");else printf("luozi函数出错");if (win(v)) {MoveToEnd();printf("玩家%d获得了胜利! \n",v);for (int i=1;i<=240;i++) printf(" ");GotoChess(GuangbiaoData[0],GuangbiaoData[1]);getch();return 1;}MoveToEnd();printf("现在请用户%d下棋 ",v%2+1);GotoChess(GuangbiaoData[0],GuangbiaoData[1]);return 0;}void HuiQi(int step) //输入的是当前的要悔的棋是第几步{GuangbiaoData[0]=ChessStepData[step-1][0];GuangbiaoData[1]=ChessStepData[step-1][1];ChessData[GuangbiaoData[0]-1][GuangbiaoData[1]-1]=0;GotoChess(GuangbiaoData[0],GuangbiaoData[1]);printf("-");MoveToEnd();printf("现在请用户%d下棋 ",(step+1)%2+1);GotoChess(GuangbiaoData[0],GuangbiaoData[1]);}int DataGetAndChoose(int choice) { int MoveData=0,i=0,temp; //MoveData 0表示不可移动,1表示上,2表示下,3表示左,4表示右,5表示落子,6表示悔棋,7表示退出。while(1){loop: while (temp=Get(&MoveData),CannotDo(temp,i%2+1,MoveData,choice)); switch (MoveData) { case 1: case 2: case 3: case 4:Move(MoveData);break; case 7:return 0; case 6: if (i==0) {MoveToEnd();printf("现在无法悔棋 ");GotoChess(GuangbiaoData[0],GuangbiaoData[1]);} else HuiQi(i--); break; case 5: if (CannotLuozi()) goto loop; if(luozi(i%2+1)) return 0; ChessStepData[i][0]=GuangbiaoData[0]; ChessStepData[i][1]=GuangbiaoData[1]; i++; break; default:printf("DataGetAndChoose函数出错");break; }}return 1; }void ShowHelp(){system("cls");printf("********************************************************************************");printf("********************************************************************************");printf("****** 单人游戏供用户一个人自己与自己下棋研究棋局之用 ******");printf("****** 双人游戏中,用户1使用wsad控制方向,按空格落子 ******");printf("****** 用户2按方向键控制方向,回车键落子 ******");printf("****** 游戏过程中按esc返回主菜单 ******");printf("****** 游戏过程中退格键悔棋 ******");printf("****** 双人模式中某人下棋时,另一个用户无法控制光标与落子 ******");printf("****** ******"); printf("****** 帮助 ******"); printf("****** 按任意键返回 ******"); printf("********************************************************************************"); printf("********************************************************************************");getch();}int main(){int choice=0;system("color 2b");choose: UserChoose(&choice);if (choice<1||choice>4) goto choose;if (choice==3) {gotoxy(1,18);
printf("\n谢谢您的使用,再见 "); getch();return 0;}if (choice==4) {ShowHelp(); goto choose;}NewShow();DataGetAndChoose(choice);main();return 0;}
C语言的我倒是没有、、Java的我倒是有个五子棋程序要不要呢
102 浏览 6 回答
342 浏览 4 回答
332 浏览 2 回答
333 浏览 3 回答
189 浏览 4 回答
136 浏览 10 回答
242 浏览 4 回答
338 浏览 4 回答
191 浏览 4 回答
240 浏览 4 回答
278 浏览 7 回答
281 浏览 5 回答
173 浏览 6 回答
250 浏览 5 回答
188 浏览 7 回答