1. 程式人生 > >C初階-三子棋

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語句增加一些選擇來讓程式更生動點。下圖例項:

777

666

大家如果有什麼想法,還可以自己往裡面新增!

加油!會越來越強的!