C语言控制台五子棋初步实现
写一个五子棋控制台程序,并能让用户轮流输入棋子位置。
棋盘上相应位置的棋子作出改变(成白子或者黑子) 。
判断胜利条件,当一方胜利时打印结果并结束程序。
其中 @ 代表黑子 0 代表白子 * 代表未走棋的棋盘
如图示意图:


以下是代码哦
#include <stdio.h> #include <windows.h> void judgeHorizontal(int countTemp, int jTemp, int colorFlag, int chessBoard[14][14], int i) { while((++jTemp < 14 )&&( 5 != countTemp )) { if(colorFlag == chessBoard[i][jTemp]) { countTemp++; if(5 == countTemp) { if(1 == colorFlag) { printf("黑方胜利!\n"); } else if(0 == colorFlag) { printf("白方胜利!!\n"); } system("pause"); exit(0) ; } } else { countTemp = 0; break; } } } void judgeVertical(int countTemp, int iTemp, int colorFlag, int chessBoard[14][14], int j) { while((++iTemp<14 )&&(5 !=countTemp)) { if(colorFlag == chessBoard[iTemp][j]) { countTemp++; if(5 == countTemp) { if(1 == colorFlag) { printf("黑方胜利!\n"); } else if(0 == colorFlag) { printf("白方胜利!\n"); } system("pause"); exit(0) ; } } else { countTemp= 0; break; } } } void judgeLeanRight(int countTemp, int iTemp, int jTemp, int colorFlag, int chessBoard[14][14]) { while((++iTemp<14 )&&(++jTemp<14 )&&(5 !=countTemp)) { if(colorFlag == chessBoard[iTemp][jTemp]) { countTemp++; if(5 == countTemp) { if(1 == colorFlag) { printf("黑方胜利!\n"); } else if(0 == colorFlag) { printf("白方胜利!\n"); } system("pause"); exit(0); } } else { countTemp = 0; break; } } } void judgeLeanLeft(int countTemp, int iTemp, int jTemp, int colorFlag, int chessBoard[14][14]) { while((++iTemp>=0 )&&(--jTemp>=0)&&(5 !=countTemp)) { if(colorFlag == chessBoard[iTemp][jTemp]) { countTemp++; if(5 == countTemp) { if(1 == colorFlag) { printf("黑方胜利!\n"); } else if(0 == colorFlag) { printf("白方胜利!\n"); } system("pause"); exit(0); } } else { countTemp = 0; break; } } } int main(void) { int i, j; int chessBoard[14][14]; int color=0;//0表示黑棋@,1表示白棋0 int iTemp = 0,jTemp = 0,countTemp = 0; int colorFlag = 0; char op; printf("五子棋小游戏\n\n"); printf("@代表黑子, 0代表白子, *代表棋盘空白\n"); printf("-------------------------------------------\n"); printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12 13\n"); for(i=0;i<14;i++) { for(j=0;j<14;j++) { if (j == 0 && i < 10) { printf(" %d ", i); } else if (j == 0){ printf(" %d ", i); } printf("* "); chessBoard[i][j] = 2; } printf("\n"); } while(1) { if (color == 0) { printf("请黑方走棋:"); } else if (color == 1) { printf("请白方走棋:"); } printf("请输入所下位置坐标,如1-2\n"); scanf("%d-%d", &i,&j); if(i<0 || i >12 || j<0 || j>12) { printf("输入的位置超出了棋盘的范围,请重新输入!\n"); continue; } if((2 != chessBoard[i][j])) { printf("提示:该位置已经有棋子了!\n"); fflush(stdin); continue; } color = (color + 1) % 2;//获取棋盘棋子属性 chessBoard[i][j] = color;//将该位置棋子属性给棋盘 printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12 13\n"); //根据棋盘对应位置属性,绘制最新状态的棋盘,一行行绘制,边缘特别处理 for(i=0;i<=13;i++) { for(j=0;j<=13;j++) { if (j == 0 && i < 10) { printf(" %d ", i); } else if (j == 0){ printf(" %d ", i); } if(chessBoard[i][j]==1) printf(" @ "); if(chessBoard[i][j]==0) printf(" 0 "); if(chessBoard[i][j]==2) printf(" * "); } printf("\n"); } //判断输赢 for(i=0;i<=13;i++) { for(j=0;j<=13;j++) { //如果检测到该有棋子,则检查与该棋子有关的是否可以赢 if(2 != chessBoard[i][j] ) { colorFlag = chessBoard[i][j]; countTemp = 1; iTemp = i; jTemp = j; //判断该棋子水平直线上是否可以赢 judgeHorizontal(countTemp, jTemp, colorFlag, chessBoard, i); //判断该棋子垂直直线上是否可以赢 judgeVertical(countTemp, iTemp, colorFlag, chessBoard, j); //斜向,从左上到右下方向检查是否可以赢 judgeLeanRight(countTemp, iTemp, jTemp, colorFlag, chessBoard); //斜向,从右上到左下方向检查是否可以赢 judgeLeanLeft(countTemp, iTemp, jTemp, colorFlag, chessBoard); } } } } system("pause"); return 0; }
浙公网安备 33010602011771号