C初階-三子棋
今天試著獨自完成三子棋,經過一個小時多…才完成。真的太菜了!!!
但是一個簡單的三子棋確實能建立一些基本的程式設計思想。其中讓我迷糊的是和棋那裡。接下來我來程式碼分析說明。
首先我們程式設計一個專案時,我們要明白我們的基本構想是什麼。那麼三子棋的思想有這麼幾點。
三子棋的規則
三子棋是在一個3x3的表格之中,如果在行列斜只要有三個相同的棋子,那麼就將獲勝。如果棋盤滿了之後,但沒有相同的,則算和棋。先手是具有一定的優勢的。
三子棋的程式設計思想
我們要將我們的操作步驟與實際相比較起來
1.初始化棋盤
2.展示棋盤的過程。我們得時刻了解到,此時的下子情況
3.玩家落子,進行判斷,是否贏得了勝利
4.電腦落子,進行判斷,是否贏得了勝利,如果沒有分出,重複第2步
5.還未判斷是否分出勝負,對其判斷是否和棋。
三子棋的程式碼過程
首先我用的是VS2013,只定義了一個頭檔案和一個原始檔。
標頭檔案的初定義
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROWS 3
#define COLS 3
char qipan[ROWS][COLS];
首先我們定義標頭檔案,不過在此處我覺得並不需要一上來就定義,我們最後需要什麼,我們去定義它。
但是巨集最開始我們需要定義好,因為是二維陣列。棋盤的大小我們要先設定好,並對其宣告。
陣列初始化
void Init(char qipan[ROWS][COLS],int row,int col){
for (int row = 0; row < ROWS; ++row){
for (int col = 0; col < COLS; ++col){
qipan[row][col] = ' ';
}
}
}
展示棋盤
void Show_qipan(char qipan[ROWS][COLS], int row, int col){
for ( int i = 0; i < row; ++i){
printf("| %c | %c | %c |\n", qipan[i][0],
qipan[i][1], qipan[i][2]);
if (i != row - 1){
printf("|---|---|---|\n");
}
}
}
玩家落子
void Playmove(char qipan[ROWS][COLS], int row, int col){
printf("請玩家下子\n");
while (1){
printf("例如輸入的格式為0,0\n");
scanf("%d,%d", &row, &col);
if (row < 0 || row >= ROWS || col < 0 || col >= COLS){
printf("輸入有誤,請重新輸入\n");
continue;
}
else if (qipan[row][col] != ' '){
printf("該處已經下過子了,請重新輸入\n");
continue;
}
qipan[row][col] = 'x';
break;
}
}
電腦落子
void Computermove(char qipan[ROWS][COLS], int row, int col){
printf("請電腦下子\n");
while (1){
row = rand() % ROWS;
col = rand() % COLS;
if (qipan[row][col] != ' '){
printf("該處已有棋子,請重新填入\n");
continue;
}
qipan[row][col] = 'O';
break;
}
}
和棋判斷條件
static int Show_full(char qipan[ROWS][COLS], int row, int col){
int i, j;
for (i = 0; i < row; i++){
for (j = 0; j < col; j++){
if (qipan[i][j] == ' '){
return 0;
}
}
}
return 1;
}
判斷勝負
char CheckWinner(char qipan[ROWS][COLS], int row, int col){
//判斷行
for (int col = 0; col < COLS; col++){
if (qipan[0][col] == qipan[1][col] && qipan[0][col] == qipan[2][col]
&& qipan[0][col] != ' '){
return qipan[0][col];
}
}
//判斷列
for (int row = 0; row < ROWS; row++){
if (qipan[row][0] == qipan[row][1] && qipan[row][0] == qipan[row][2]
&& qipan[row][0] != ' '){
return qipan[row][0];
}
}
//判斷斜
if (qipan[0][0] == qipan[1][1] && qipan[0][0] == qipan[2][2]
&& qipan[0][0] != ' '){
return qipan[0][0];
}
else if (qipan[2][0] == qipan[1][1] && qipan[2][0] == qipan[0][2]
&& qipan[2][0] != ' '){
return qipan[2][0];
}
//判斷和棋
else if (Show_full(qipan,row,col)){
return 'q';
}
return ' ';
}
程式碼比較容易理解,但是我們也有幾個必須注意的地方。
首先,定義的每個函式中,引數不能忘,對其中新增陣列,行,列三個。因為我們對輸入值後,要把每個值傳入函式中,讓其進行判斷。所以這是一個關鍵。
其次是和棋的判斷,在返回值為0與1的意思是假與真(估計大家都知道),但是關鍵在於CheckWinner()中,我們要知道判斷結束後要有返回值。我們之前設定初始化的陣列值是‘ ’。接著我們可以在原始檔中進行判斷。
原始檔的程式碼
#include"chess.h"
int main(){
srand((unsigned int)time(NULL));
Init(qipan, ROWS, COLS);
Choice();
char winner;
int a;
scanf("%d", &a);
switch (a){
case 1:
while (1){
Show_qipan(qipan, ROWS, COLS);
Playmove(qipan, ROWS, COLS);
Show_qipan(qipan, ROWS, COLS);
winner = CheckWinner(qipan, ROWS, COLS);
if (winner != ' '){
break;
}
Computermove(qipan, ROWS, COLS);
winner = CheckWinner(qipan, ROWS, COLS);
}
if (winner == 'x'){
printf("你贏了!\n");
}
else if (winner == 'o'){
printf("電腦贏了!\n");
}
else if (winner == 'q'){
printf("五五開!真厲害!\n");
}
case 2:
system("exit");
}
system("pause");
return 0;
}
看了winner的值你就可以看出來,如果之前返回的不是‘ ’,那麼winner將直接跳出迴圈。
在其中我還添加了一個switch語句增加一些選擇來讓程式更生動點。下圖例項:
大家如果有什麼想法,還可以自己往裡面新增!
加油!會越來越強的!