五子棋游戲我們大家很多人都玩過,規則簡單但是內容千變萬化,今天我用C語言寫了一個五子棋程序,由於時間倉促程序中難免會有BUG,希望您多多指正阿!!
程序的功能:
兩個人輪流下子,在輸入下子的時候,可以輸入r來進行悔棋,也可以輸入q來退出程序。
在本程序中,一共有5個模塊,分別為:
1.生成棋盤模塊:void create_board(char (*board)[N]);
本模塊的功能很簡單,僅僅生成一個棋盤,因為本程序的運行環境是linux中的終端,所以出於界面的美觀性考慮,將棋盤的空白位置標志為“-”(減號),白方的棋子為X(大寫的X),黑方的棋子為O(大寫的O)。所以在這個模塊中我們給傳遞過來的一個二維數組所有的元素都賦值為‘-’
2.打印棋盤模塊:void print_board(char (*board[N]));
本模塊的功能也很簡單,就是將剛才生成的棋盤打印出來,同時我們還要這個模塊打印目前棋盤的狀態,在主函數中循環調用這個模塊。由於這個程序是在linux的終端裡面運行的,所以要實現棋盤的動態顯示,還要不斷調用system函數要調用clear的系統命令來刷新屏幕,這個功能也是在這個模塊中實現的。
3.打印相關信息的模塊:void print_info(int flag,int person);這個模塊的功能就是打印出相關的信息,包括:這輪該哪一方下子,輸入是否有誤,是否有人贏。這是我們可以設置一個標志位flag來表示不同的情況,正常情況表示為0,用戶輸入有誤表示為-1,如果有人贏就表示為1
4.下棋:int down_board(char (*board)[N], int person, int *x, int *y);
1.打印輸入格式
2.接受坐標,x, y
3.判斷輸入是否合法
1)如何合法,下棋,返回0
2)如何不合法,返回-1
1.越界、有子、格式有誤
5.判斷輸贏int check_board(char (*board][N],int *person, int x, int y);
1.判斷輸贏
2.如果沒有人贏,切換棋手
源碼:
/************************************************************************* > File Name: wuziqi.c > Author: Baniel Gao > Mail: [email protected] > Blog: blog.csdn.net/createchance > Created Time: Fri 06 Dec 2013 10:32:41 AM CST ************************************************************************/ #include#include #define N 20 void create_board(char (*board)[N]); void print_board(char (*board)[N]); void print_info(int flag,int person); int play_chess(char (*board)[N],int *person,int *x,int *y); int check_board(char (*board)[N],int *person,int x,int y); int main(void) { char board[N][N]; int person = 0,flag = 0,x = 0,y = 0; create_board(board); while(1) { print_board(board); print_info(flag,person); if(flag == 1) { break; } if((flag=play_chess(board,&person,&x,&y)) == -1 || flag == 3) { continue; } else if(flag == 2) { return 0; } flag = check_board(board,&person,x,y); } return 0; } void create_board(char (*board)[N]) { int i,j; for(i=0;i N-1 || *y < 0 || *y > N-1) { choice = getchar(); if(choice == 'q' && getchar() == '\n') { return 2; } else if(choice == 'r' && getchar() == '\n') { if(board[*x][*y] == '-') { printf("You have already rescinded!\n"); return -1; } board[*x][*y] = '-'; *person = (*person + 1)%2; return 3; } return -1; } if(board[*x][*y] != '-') { return -1; } if(*person == 0) { board[*x][*y] = 'X'; } else { board[*x][*y] = 'O'; } return 0; } int check_board(char (*board)[N],int *person,int x,int y) { int i,j; int pos_x = x,pos_y = y; int cnt,sign; int a[4][2] = {{0,1},{1,1},{-1,0},{-1,1}}; for(i=0;i<4;i++) { cnt = sign = 1; j = 0; while(1) { pos_x += sign*a[i][j]; pos_y += sign*a[i][j+1]; if((board[pos_x][pos_y] == board[x][y]) && pos_x >= 0 && pos_x <= N-1 && pos_y >= 0 && pos_y <= N-1) cnt++; else { if(sign == -1) { break; } sign = -1; pos_x = x; pos_y = y; } if(cnt == 5) { return 1; } } } *person = (*person + 1)%2; return 0; }