【C/C++】二維陣列之簡易三子棋
阿新 • • 發佈:2019-01-02
一、三子棋
五子棋,五個棋子不論是橫著,豎著,斜著,只要能連成一條直線,就贏了
三子棋(簡易版)也是如此。
二、思路分析
①棋的型別
棋類的C語言實現方法主要看棋的型別
一種是像象棋那種,需要選擇棋子,進行的是棋子移動的棋
另一種,就是像三子棋,五子棋一樣。放置棋子的棋
②要點
(1)陣列
棋盤可以用一個二維陣列來表示
並用0表示某一點無棋子的情況
用1代表黑棋
用2代表白棋
(2)下棋的函式
要有兩個函式來控制下棋
下棋的時候注意有棋子的地方不能下了
(3)判斷輸贏
程式需要知道哪個時候判斷某一方贏了
然後停止程式
程式裡可以用while迴圈實現
裡面放置判斷輸贏函式的返回值
三、程式碼具體實現
程式碼塊:
#include<stdio.h> #include<stdlib.h> #include<time.h> #include<windows.h> #define N 3 //列印函式 void print(int chess[][N]) { int i = 0; int j = 0; system("cls"); printf("=====================好玩的三子棋=======================\n"); for(i = 0 ;i<N ;i++ ) { printf("\n "); for(j = 0; j<N ;j++) { if(chess[i][j] == 1) printf("X "); else if(chess[i][j] == 0) printf("_ "); else printf("0 "); } printf("\n"); } printf("\n"); printf("========================================================\n"); } //玩家下棋 void player(int chess[][N]) { int x = 0; int y = 0; do { printf("請輸入需要下棋的座標:>"); scanf("%d %d",&x,&y); if(chess[x][y] != 0) printf("輸入有誤,請重新輸入!\n"); }while(chess[x][y] != 0); chess[x][y] = 1; } //電腦下棋 void computer(int chess[][N]) { int x = 0; int y = 0; do { srand((unsigned)time(NULL)); x = rand()%3; y = rand()%3; }while(chess[x][y] != 0); chess[x][y] = 2; } //判斷獲勝 //返回1,玩家獲勝 //返回2,電腦獲勝 //返回-1,平局 int check_winner(int chess [][N]) { int flag = 0; int x = 0; int y = 0; if((chess[0][0]==chess[0][1])&&(chess[0][1] == chess[0][2])) { if(chess[0][0] == 1) return 1; else if(chess[0][0] == 2) return 2; } if((chess[1][0]==chess[1][1])&&(chess[1][1])==chess[1][2]) { if(chess[1][0] == 1) return 1; else if(chess[1][0] == 2) return 2; } if((chess[2][0]==chess[2][1])&&(chess[2][1])==chess[2][2]) { if(chess[2][0] == 1) return 1; else if(chess[2][0] == 2) return 2; } if((chess[0][0]==chess[1][0])&&(chess[1][0])==chess[2][0]) { if(chess[0][0] == 1) return 1; else if(chess[0][0] == 2) return 2; } if((chess[0][1]==chess[1][1])&&(chess[1][1])==chess[2][1]) { if(chess[0][1] == 1) return 1; else if(chess[0][1] == 2) return 2; } if((chess[0][2]==chess[1][2])&&(chess[1][2])==chess[2][2]) { if(chess[0][2] == 1) return 1; else if(chess[0][2] == 2) return 2; } if((chess[0][0]==chess[1][1])&&(chess[1][1])==chess[2][2]) { if(chess[0][0] == 1) return 1; else if(chess[0][0] == 2) return 2; } if((chess[0][2]==chess[1][1])&&(chess[1][1])==chess[2][0]) { if(chess[0][2] == 1) return 1; else if(chess[0][2] == 2) return 2; } for(x=0 ; x<N; x++) { for(y=0; y<N; y++) { if(chess[x][y] == 0) return 0; } } return -1; } int grade(int chess[][3]) { int x = 0; int y = 0; int sum_grade = 0; for(x=0 ; x<N; x++) { for(y=0; y<N; y++) { if(chess[x][y] == 0) sum_grade++; } } return sum_grade; } void play() { int chess[3][3] = {0}; int winner = 0; print(chess); while(check_winner(chess) == 0) { player(chess); print(chess); if(check_winner(chess) != 0) break; computer(chess); print(chess); Sleep(1000); } winner = check_winner(chess); if(winner == 1) { printf("恭喜,您勝了!\n"); if(grade(chess)>1&&grade(chess)<4) printf("您的總分為 91\n稱號:>小霸王\n"); else if(grade(chess)>3) printf("您的總分為 99\n稱號:>天之驕子\n"); else printf("您的總分為 86\n稱號:>棋逢對手\n"); } else if(winner == 2) { printf("很遺憾,您輸了。\n"); printf("您的分數為 59\n稱號:>炮灰\n"); } else { printf("厲害,和電腦打平手了!\n"); printf("您的分數為 61\n稱號:>旗鼓相當\n"); } } int main() { int have_fun = 1; do { play(); printf("\n輸入1繼續遊戲:>"); scanf("%d",&have_fun); }while(have_fun == 1); return 0; }
執行結果:
四、小結
二維陣列引數傳遞,至少要確定維數
擴充套件閱讀: