运行效果:
思路:五子棋我们可以将代码分成棋盘和棋子两大部分,理所当然的,我们需要知道棋子下棋的位置和棋盘的大小。然后在五子棋中,我们是每下完一次棋便需要进行一次胜负的判定虽然在生活当中,在五子棋刚开始我们不会去思考胜负,但下到后面,我们仔细想想,我们是不是每下一次棋,便会思考胜负。当然,在回过头去想,对于编程来说,下棋的位置也需要进行思考
展示棋盘:
void ShowBoard(int board[][COL],int row,int col) { printf("\e[1;1H\e[2J"); printf(" "); int i=1; for(;i<=col;i++) { printf("%3d",i); } printf("\n"); for(i=0;i<row;i++) { int j=0; printf("%2d",i+1); for(;j<col;j++) { if(board[i][j]==0) printf(" . "); else if(board[i][j]==PLAYER1) printf(" ◯ "); else if(board[i][j]==PLAYER2) printf(" ⬤ "); } printf("\n"); } }
下棋:
void PlayerMove(int board[][COL],int row,int col,int who) { printf("Player%d Please Enter Your Pos#\n",who); while(1) { scanf("%d %d",&x,&y); if(x<1||x>row||y<1||y>col) { printf("Postion Error!\n"); continue; } else if(board[x-1][y-1]!=0) { printf("Postion Is Occupied!\n"); continue; } else { board[x-1][y-1]=who; break; } } }
主体函数(game.c):
void game() { int board[ROW][COL]; memset(board,0,sizeof(board)); int result=NEXT; do { ShowBoard(board,ROW,COL); PlayerMove(board,ROW,COL,PLAYER1); result=IsOver(board,ROW,COL); if(result!=NEXT) break; ShowBoard(board,ROW,COL); PlayerMove(board,ROW,COL,PLAYER2); result=IsOver(board,ROW,COL); if(result!=NEXT) break; }while(1); switch(result) { case PLAYER_WIN1:printf("恭喜用户1赢了\n");break; case PLAYER_WIN2:printf("恭喜用户2赢了\n");break; case DRAW:printf("平局\n");break; default:break; } ShowBoard(board,ROW,COL); }
完整代码:
game.h
#include <stdio.h> #include <string.h> #define ROW 20 #define COL 20 #define NEXT 0 #define PLAYER1 1 #define PLAYER2 2 #define PLAYER_WIN1 1 #define PLAYER_WIN2 2 #define DRAW 3 enum Dir{ LEFT, RIGHT, UP, DOWN, LEFT_UP, LEFT_DOWN, RIGHT_UP, RIGHT_DOWN }; void menu(); void game();
game.c
#include "game.h" int x=0; int y=0; void menu() { printf("###########################\n"); printf("#####1.play 0.exit#####\n"); printf("###########################\n"); printf("Please Selet# "); } int ChessCount(int board[][COL],int row,int col,enum Dir d) { int _x=x-1; int _y=y-1; int count=0; while(1) { switch(d) { case LEFT:_y--;break; case LEFT_UP:_y--;_x--;break; case LEFT_DOWN:_y--;_x++;break; case UP:_x--;break; case DOWN:_x++;break; case RIGHT:_y++;break; case RIGHT_UP:_y++;_x--;break; case RIGHT_DOWN:_x++;_y++;break; } if(_x<0 ||_x >row-1 ||_y<0 ||_y>col-1) { break; } if(board[x-1][y-1]==board[_x][_y]) { count++; } else break; } return count; } int IsOver(int board[][COL],int row,int col) { int count1=ChessCount(board,ROW,COL,LEFT)+ChessCount(board,ROW,COL,RIGHT)+1; int count2=ChessCount(board,ROW,COL,UP)+ChessCount(board,ROW,COL,DOWN)+1; int count3=ChessCount(board,ROW,COL,LEFT_UP)+ChessCount(board,ROW,COL,RIGHT_DOWN)+1; int count4=ChessCount(board,ROW,COL,LEFT_DOWN)+ChessCount(board,ROW,COL,RIGHT_UP)+1; if(count1>=5 || count2>=5 ||count3>=5 || count4>=5) { if(board[x-1][y-1]==PLAYER1) return PLAYER1; return PLAYER2; } int i=0; for(;i<row;i++) { int j=0; for(;j<col;j++) { if(board[i][j]==0) return NEXT; } } return DRAW; } void ShowBoard(int board[][COL],int row,int col) { printf("\e[1;1H\e[2J"); printf(" "); int i=1; for(;i<=col;i++) { printf("%3d",i); } printf("\n"); for(i=0;i<row;i++) { int j=0; printf("%2d",i+1); for(;j<col;j++) { if(board[i][j]==0) printf(" . "); else if(board[i][j]==PLAYER1) printf(" ◯ "); else if(board[i][j]==PLAYER2) printf(" ⬤ "); } printf("\n"); } } void PlayerMove(int board[][COL],int row,int col,int who) { printf("Player%d Please Enter Your Pos#\n",who); while(1) { scanf("%d %d",&x,&y); if(x<1||x>row||y<1||y>col) { printf("Postion Error!\n"); continue; } else if(board[x-1][y-1]!=0) { printf("Postion Is Occupied!\n"); continue; } else { board[x-1][y-1]=who; break; } } } void game() { int board[ROW][COL]; memset(board,0,sizeof(board)); int result=NEXT; do { ShowBoard(board,ROW,COL); PlayerMove(board,ROW,COL,PLAYER1); result=IsOver(board,ROW,COL); if(result!=NEXT) break; ShowBoard(board,ROW,COL); PlayerMove(board,ROW,COL,PLAYER2); result=IsOver(board,ROW,COL); if(result!=NEXT) break; }while(1); switch(result) { case PLAYER_WIN1:printf("恭喜用户1赢了\n");break; case PLAYER_WIN2:printf("恭喜用户2赢了\n");break; case DRAW:printf("平局\n");break; default:break; } ShowBoard(board,ROW,COL); }
main.c
#include "game.h" int main() { int input=0; int put=1; do { menu(); scanf("%d",&input); switch(input) { case 1:game();break; case 0:put=0;printf("Good Bye\n");break; default :printf("Enter Erroy, Try Agin!\n");break; } }while(put); return 0; }
五子棋项目内容到此介绍结束了,感谢您的阅读!!!
如果内容对你有帮助的话,记得给我点个赞——做个手有余香的人。感谢大家的支持!!!