天天看點

C語言實作三子棋遊戲(内附N子棋代碼優化)一、遊戲的簡單介紹二、遊戲的大緻架構三、遊戲的主要内容(重要)四、遊戲的相關優化五、 遊戲完整代碼總結

前言:大家應該都了解三子棋這個簡單的小遊戲吧,那本文就就介紹了如何用C語言實作這個簡單的小遊戲,就本人而言,這個是我接觸的第二個較大的程式,也是現如今最大的一個,其中有一些内容在我前面有一篇文章詳解猜數字小遊戲https://mp.csdn.net/mp_blog/creation/editor/127400224中涉及到,大家可以先解決那個小遊戲,這樣可以更好的入門三子棋。同時,這篇文章不僅僅隻有三子棋代碼,還有我對其的一些小小優化,大家有興趣的可以閱讀文章,也希望我的文章可以給各位帶來一些收獲。
C語言實作三子棋遊戲(内附N子棋代碼優化)一、遊戲的簡單介紹二、遊戲的大緻架構三、遊戲的主要内容(重要)四、遊戲的相關優化五、 遊戲完整代碼總結

目錄

一. 遊戲的簡單介紹

二. 遊戲的大緻架構

三. 遊戲的主要内容

       1. 三子棋棋盤的建立

       2. 棋盤的初始化

       3. 棋盤的顯示

       4. 對弈中玩家落子

       5. 對弈中電腦落子

       6. 遊戲勝負的判斷

四. 遊戲的相關優化

五. 遊戲完整代碼

一、遊戲的簡單介紹

三子棋遊戲的規則和原理我就不再詳細介紹了,我在此就說明一下該遊戲的代碼實作需要透徹地了解循環結構、函數、數組等相關内容,并且需要我們知道一些基本的分檔案寫函數的一些知識,希望大家可以好好了解一下,以能夠更好地實作這個小程式。

二、遊戲的大緻架構

該遊戲開始的大緻架構與猜數字小遊戲的差不多,這裡就不再詳細解釋了,大家可以通路我的那篇文章去好好了解一下,這裡就直接把相關代碼給到各位。

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu()
{
	printf("****************\n");
	printf("*****1.play*****\n");
	printf("*****o.exit*****\n");
	printf("****************\n");
}
void game()
{

}
int main()
{
	menu();
	int a = 0;
	do
	{
		printf("請選擇:>");
		scanf("%d", &a);
		switch (a)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出遊戲\n");
			break;
		default:
			printf("輸入失敗,請重新輸入\n");
			break;
		}
	} while (a);
	return 0;
}
           

但是,架構不僅僅于此,我們還知道當程式較為複雜的時候,我們可以分檔案寫不同的子產品。例如,在三子棋中,我建立的三個檔案,兩個源檔案(遊戲主體.c與game.c),一個頭檔案(game.h)。其中源檔案遊戲主體.c中寫的是這個遊戲的基本架構,頭檔案game.h中是對自定義函數的定義,而源檔案game.c也是我們這個程式最重要的部分,其中包含了我們對自定義函數作用的實作。

C語言實作三子棋遊戲(内附N子棋代碼優化)一、遊戲的簡單介紹二、遊戲的大緻架構三、遊戲的主要内容(重要)四、遊戲的相關優化五、 遊戲完整代碼總結

三、遊戲的主要内容(重要)

基本架構确立後,由此也可以知道我們要在定義的game函數中實作遊戲的主要内容,而遊戲的主要内容就展現在下面六個方面。

 1. 三子棋棋盤的建立

由我們對棋盤的基本了解可以知道棋盤是一個3*3的正方形,而此時就能很好地運用一個二維數組來建立這個棋盤,是以為了建立棋盤,我們要先定義一個二維數組,而為了能夠使棋盤産生動态變化,我們在頭檔案中定義棋盤的行與列,這樣就将棋盤建立起來了。

C語言實作三子棋遊戲(内附N子棋代碼優化)一、遊戲的簡單介紹二、遊戲的大緻架構三、遊戲的主要内容(重要)四、遊戲的相關優化五、 遊戲完整代碼總結
C語言實作三子棋遊戲(内附N子棋代碼優化)一、遊戲的簡單介紹二、遊戲的大緻架構三、遊戲的主要内容(重要)四、遊戲的相關優化五、 遊戲完整代碼總結

 2. 棋盤的初始化

為了能夠更好地進行後面的步驟,首先我們要将建立的棋盤初始化,而為了不影響其他内容,我們可以将棋盤的所有元素初始化為空格(這也是我們用char來定義數組的一大原因)。此時我們就可以編寫我們的第一個函數Initboard(board,ROW,COL)了,它的作用就是将數組(棋盤)内的元素全部初始化為空格,相關代碼見下

C語言實作三子棋遊戲(内附N子棋代碼優化)一、遊戲的簡單介紹二、遊戲的大緻架構三、遊戲的主要内容(重要)四、遊戲的相關優化五、 遊戲完整代碼總結

在game.c中實作:

C語言實作三子棋遊戲(内附N子棋代碼優化)一、遊戲的簡單介紹二、遊戲的大緻架構三、遊戲的主要内容(重要)四、遊戲的相關優化五、 遊戲完整代碼總結

 然後我們再在game函數中調用它,這樣棋盤初始化的步驟就完成了。

C語言實作三子棋遊戲(内附N子棋代碼優化)一、遊戲的簡單介紹二、遊戲的大緻架構三、遊戲的主要内容(重要)四、遊戲的相關優化五、 遊戲完整代碼總結

 3. 棋盤的顯示

棋盤的顯示就是将棋盤的内容列印在螢幕上,是以我們可以定義一個在螢幕上列印棋盤的函數print_board(board,ROW,COL);而這個函數的實作在game.c中進行,主要與你要列印的棋盤的形狀息息相關,我選擇列印的形狀是

C語言實作三子棋遊戲(内附N子棋代碼優化)一、遊戲的簡單介紹二、遊戲的大緻架構三、遊戲的主要内容(重要)四、遊戲的相關優化五、 遊戲完整代碼總結

分層具體分析:

C語言實作三子棋遊戲(内附N子棋代碼優化)一、遊戲的簡單介紹二、遊戲的大緻架構三、遊戲的主要内容(重要)四、遊戲的相關優化五、 遊戲完整代碼總結

分析該形狀可以找到一些相似點,将它分成五行再分析我們可以找到一些規律:

(1) 縱向分析得: 1、3、5行的形狀一樣,共出現了三次;2、4行的形狀一樣,共出現了兩次;

這樣在行數的循環中列印(   |   |   )形狀就會出現三次,而列印(---|---|---)形狀就隻會出現兩次

(2) 橫向分析得:大空格與---都出現了三次,而各行的 | 隻出現了兩次;是以在各行的列印中,列

數的循環又會有所不同,列印(   )要進行三次,而列印( | )隻用進行兩次。

分析(1)(2)大概可知各行中的( | )總是少一個(即不設定邊界)

由這兩點規律就可以開始着手寫代碼實作自己的思路

void print_board(char board[ROW][COL], int row, int col)
{
	for (i = 0;i < row;i++)
	{
		for (j = 0;j < col;j++)//1、3、5行内容的列印
		{
			printf(" %c ", board[i][j]);//(   )列印col次
			if (j < col - 1)
			{
				printf("|");//1、3、5行的(|)列印col-1次
			}
		}
		printf("\n");//别忘了換行喲
		if(i < row - 1)
		{
			for (j = 0;j < col;j++)//2、4行内容的列印
			{
				printf("---");//列印col次
				if (j < col - 1)
				{
					printf("|");//列印col-1次
				}
			}
		}
		printf("\n");
	}
}
           

                                     注意:這裡再說明一個重點,那就是代碼

C語言實作三子棋遊戲(内附N子棋代碼優化)一、遊戲的簡單介紹二、遊戲的大緻架構三、遊戲的主要内容(重要)四、遊戲的相關優化五、 遊戲完整代碼總結

 我們要好好思考一下為什麼這裡是( %c ),這個%c代表着棋盤數組中的元素,此處這樣使用是為了更好的執行下棋過程,而左右兩邊的兩個空格則是為了與下面的(---)對齊。

這樣,再在頭檔案中定義一下,在game函數中調用一下,棋盤顯示這一步驟就完成了。

C語言實作三子棋遊戲(内附N子棋代碼優化)一、遊戲的簡單介紹二、遊戲的大緻架構三、遊戲的主要内容(重要)四、遊戲的相關優化五、 遊戲完整代碼總結
C語言實作三子棋遊戲(内附N子棋代碼優化)一、遊戲的簡單介紹二、遊戲的大緻架構三、遊戲的主要内容(重要)四、遊戲的相關優化五、 遊戲完整代碼總結

 4. 對弈中玩家落子

設定完列印棋盤的函數後,我們就要正式開始下棋了,這裡就預設玩家先落子。而玩家下棋我們又可以定義一個函數PlayerM(board,ROW,COL)來實施,接下來就介紹一下這個函數如何執行。

首先我們要知道,玩家可能會輸入錯誤的坐标或選擇的坐标已有棋子,是以我們要在玩家輸入有誤時給到相應的提示,并且我們由此可知玩家有多次下棋的機會,直至落子成功。是以我們要将這個完整的過程放在一個循環體中進行,玩家落子成功就跳出循環(利用break即可)。

下面直接展示相關代碼,比較簡單,自己可以好好了解一下。

void PlayerM(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("請輸入坐标:>");
		scanf("%d%d", &x, &y);
		if (x >= 0 && x <= row && y >= 0 && y <= col)//坐标合法性
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("坐标被占用,請重新輸入\n");
			}
		}
		else
		{
			printf("坐标不合法,請重新輸入\n");
		}
	}
}
           

注意:輸入的坐标與要通路坐标對應的數組下标是不一樣的,是以就有(x-1)與(y-1)兩個過程。

為了有顯示效果,我們可以在調用完這個函數後再調用一次print_board(board,ROW,COL)函數,這樣我們在執行過程中就可以很好的看到函數的實施效果了。還有一點就是,别忘了在頭檔案中定義這個函數喲。

C語言實作三子棋遊戲(内附N子棋代碼優化)一、遊戲的簡單介紹二、遊戲的大緻架構三、遊戲的主要内容(重要)四、遊戲的相關優化五、 遊戲完整代碼總結

                                                                  頭檔案中定義:

C語言實作三子棋遊戲(内附N子棋代碼優化)一、遊戲的簡單介紹二、遊戲的大緻架構三、遊戲的主要内容(重要)四、遊戲的相關優化五、 遊戲完整代碼總結

                                                              game函數中調用:

C語言實作三子棋遊戲(内附N子棋代碼優化)一、遊戲的簡單介紹二、遊戲的大緻架構三、遊戲的主要内容(重要)四、遊戲的相關優化五、 遊戲完整代碼總結

 這樣玩家下棋的步驟也就結束了,接下來就是電腦下棋了。

 5. 對弈中電腦落子

知道了玩家怎麼落子後,其實編寫電腦下棋的代碼也就簡單了。這裡主要講一下二者的差別:

(1)電腦下棋不需要多次提示,是以提示放在循環體外部就行了

(2)我自主設定了玩家下(*),電腦下(#)

(3)電腦下棋可以規定下棋的範圍,是以不會出現坐标非法的情況,那我們要使電腦随機落子就又要用到中産生随機的過程了,這個我在猜數字遊戲中詳細講解了,在這就不再贅述了,大家可以先去看一看。

了解這三點,下面的函數代碼就不難編寫了,各位自己要好好了解一下。

void ComputM(char board[ROW][COL], int row, int col)
{
	srand(time(NULL));
	printf("電腦下棋\n");
	while (1)
	{
		int x = rand() % row;
		int y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}
           

執行效果:

C語言實作三子棋遊戲(内附N子棋代碼優化)一、遊戲的簡單介紹二、遊戲的大緻架構三、遊戲的主要内容(重要)四、遊戲的相關優化五、 遊戲完整代碼總結

頭檔案中定義:

C語言實作三子棋遊戲(内附N子棋代碼優化)一、遊戲的簡單介紹二、遊戲的大緻架構三、遊戲的主要内容(重要)四、遊戲的相關優化五、 遊戲完整代碼總結

                          game函數中調用:(再在之後調用一個print_board函數看電腦落子的效果)

C語言實作三子棋遊戲(内附N子棋代碼優化)一、遊戲的簡單介紹二、遊戲的大緻架構三、遊戲的主要内容(重要)四、遊戲的相關優化五、 遊戲完整代碼總結

 這樣電腦下棋的步驟就結束了,接下來我們就要進行這個小遊戲的高潮部分了,那就是如何判斷輸赢。

 6. 遊戲勝負的判斷

遊戲勝負的判斷也可以用一個函數執行,那我就将這個函數命名為Is_Win(board,ROW,COL);我們的首要任務不是直接着手去編寫這個函數,我們要先思考下列幾個問題:

(1) 該函數在game函數中如何調用才能達到最好的效果

(2) 判斷勝負的三種情況

(3) 該函數的執行思路是怎樣的

解答:

(1)  就問題(1)來說,我們首先要知道,這個對弈的過程是一個持續的過程,沒有出結果是不會結束的,是以我們就要把玩家與電腦對弈的函數放在循環體内,當滿足結果出現的條件時就離開循環體(即Is_Win(board,ROW,COL)函數判斷結果出現)。

(2)  問題(2)應該不難吧,隻要下過棋的人就知道下棋結果有三種,即勝、負、和棋(平局)

(3)  問題(3)就是我們需要思考的重點了,它決定了函數執行的方式。

因為我們設定的是玩家以 * 落子,電腦以 # 落子,為了友善判斷,我們可以設定以下的方案來更好的實作函數:

【1】  如果玩家獲勝,Is_Win(board,ROW,COL)函數就傳回 ‘*’

【2】 如果電腦獲勝,Is_Win(board,ROW,COL)函數就傳回 ‘#’

【3】 如果和棋,Is_Win(board,ROW,COL)函數就傳回 ‘D’,而這裡的是否和棋又要好好深究一下。 和棋的條件即:棋盤下滿了,但是還沒有勝者。此時我們又要在Is_Win(board,ROW,COL)函數中再調用一個自定義函數Is_Full(board,ROW,COL),它的作用就是在判斷勝負時判斷是否和棋以及維持遊戲繼續進行。

【4】 如果上述三種都不發生,則遊戲繼續,Is_Win(board,ROW,COL)函數就傳回‘C’,表示遊戲繼續

最後要思考的就是獲勝的條件,這個也是個簡單的問題,三子棋獲勝無非就是行或列或對角線有三個相同的棋子,這裡就直接展示相關代碼了。

                                                   game.c檔案中實作該函數:

int Is_Full(char board[ROW][COL], int row, int col)//判斷棋盤是否下滿(即和棋)
{
	int i = 0;
	int j = 0;
	int count = 0;
	for (i = 0;i < row;i++)
	{
		for (j = 0;j < col;j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;
			}	
		}
	}
	return 1;
}

char Is_Win(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0;i < row;i++)//每行是否連棋的判斷
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
		{
			return board[i][1];//直接傳回相同的棋子,簡化了步驟
		}
	}
	for (j = 0;j < col;j++)//每列是否連棋的判斷
	{
		if (board[0][j] == board[1][j] && board[2][j] == board[1][j] && board[1][j] != ' ')
		{
			return board[1][i];
		}
	}
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
	{
		return board[1][1];//左對角線的判斷
	}
	if (board[0][2] == board[1][1] && board[2][0] == board[1][1] && board[1][1] != ' ')
	{
		return board[1][1];//右對角線的判斷
	}
	int ret = Is_Full(board, row, col);//判斷是否和棋,即棋盤是否被下滿
	if (ret == 0)
		return 'C';//沒下滿
	else
		return 'D';//下滿了
}
           

                                           遊戲主體.c檔案中game函數的完整調用:

void game()
{
	char board[ROW][COL];//定義二維數組建立棋盤
	char ret = 0;
	Initboard(board, ROW, COL);//初始化棋盤
	print_board(board, ROW, COL);//列印棋盤
	while (1)//遊戲未結束時達到多次下棋的效果
	{
		PlayerM(board, ROW, COL);//玩家下棋
		print_board(board, ROW, COL);
		ret = Is_Win(board, ROW, COL);//判斷勝負
		if (ret != 'C')
			break;
		ComputM(board, ROW, COL);//電腦下棋
		print_board(board, ROW, COL);
		ret = Is_Win(board, ROW, COL);//再次判斷勝負
		if (ret != 'C')
			break;
	}
	if (ret == '*')
		printf("玩家獲勝\n");
	else if (ret == '#')
		printf("電腦獲勝\n");
	else if(ret == 'D')
		printf("和棋\n");
	print_board(board, ROW, COL);
}
           

                                                 game.h檔案中的完整定義:

#pragma once
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 3
#define COL 3
//在頭檔案中定義函數,使得調用函數時引用該頭檔案即可
void Initboard(char board[ROW][COL], int row, int col);//初始化棋盤
void print_board(char board[ROW][COL], int row, int col);//列印棋盤
void PlayerM(char board[ROW][COL], int row, int col);//玩家落子
void ComputM(char board[ROW][COL], int row, int col);//電腦落子
char Is_Win(char board[ROW][COL], int row, int col);//判斷勝負
int Is_Full(char board[ROW][COL], int row, int col);//判斷棋盤是否下滿(即和棋)
           

                                就這樣,一個簡易的三子棋遊戲就可以實作了。

注意:這裡的判斷條件(Is_Win()函數)太局限了,隻滿足三子棋的實作,是以該代碼還需優化,具體見下。

四、遊戲的相關優化

以我目前的水準,僅僅隻能夠對Is_Win()函數進行優化,優化後可以實作N*N棋盤N子棋的進行。優化後的代碼見下:

char Is_Win(char board[ROW][COL], int row, int col)//利用*的ASCII碼值為42,#的ASCII碼值為35
{
	int i = 0;
	int j = 0;
	int sum = 0;
	for (i = 0;i < row;i++)//逐行判斷
	{
	    sum = 0;//這個要放在循環體内部,以達到每次都清零的效果
		for (j = 0;j < col;j++)
		{
			sum += board[i][j];
		}
		if (sum == col * 42)
			return '*';
		else if (sum == col * 35)
			return '#';
	}
	for (i = 0;i < col;i++)//逐列判斷
	{
		sum = 0;
		for (j = 0;j < row;j++)
		{
			sum += board[j][i];
		}
		if (sum == row * 42)
			return '*';
		else if (sum == row * 35)
			return '#';
	}
	sum = 0;
	for (i = 0;i < row;i++)//左對角線
	{
		sum += board[i][i];
	}
	if (sum == row * 42)
		return '*';
	else if (sum == row * 35)
		return '#';
	sum = 0;
	for (i = 0, j = col - 1;i < row;i++, j--)//右對角線
	{
		sum += board[i][j];
	}
	if (sum == row * 42)
		return '*';
	else if (sum == row * 35)
		return '#';
	int ret = Is_Full(board, row, col);//和棋判斷
	if (ret == 0)
		return 'C';
	else
		return 'D';
}
           

再通過改變ROW與COL的值就可以實作優化了,這裡以5*5棋盤五子棋為例展示一下:

C語言實作三子棋遊戲(内附N子棋代碼優化)一、遊戲的簡單介紹二、遊戲的大緻架構三、遊戲的主要内容(重要)四、遊戲的相關優化五、 遊戲完整代碼總結
C語言實作三子棋遊戲(内附N子棋代碼優化)一、遊戲的簡單介紹二、遊戲的大緻架構三、遊戲的主要内容(重要)四、遊戲的相關優化五、 遊戲完整代碼總結

                                 大家了解後就可以自己實作一下這個小遊戲,好好玩一玩。

五、 遊戲完整代碼

1. 頭檔案game.h

#pragma once
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 5
#define COL 5
//在頭檔案中定義函數,使得調用函數時引用該頭檔案即可
void Initboard(char board[ROW][COL], int row, int col);//初始化棋盤
void print_board(char board[ROW][COL], int row, int col);//列印棋盤
void PlayerM(char board[ROW][COL], int row, int col);//玩家落子
void ComputM(char board[ROW][COL], int row, int col);//電腦落子
char Is_Win(char board[ROW][COL], int row, int col);//判斷勝負
int Is_Full(char board[ROW][COL], int row, int col);//判斷棋盤是否下滿(即和棋)
           

2.源檔案遊戲主體.c

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu()
{
	printf("****************\n");
	printf("*****1.play*****\n");
	printf("*****o.exit*****\n");
	printf("****************\n");
}
void game()
{
	char board[ROW][COL];//定義二維數組建立棋盤
	char ret = 0;
	Initboard(board, ROW, COL);//初始化棋盤
	print_board(board, ROW, COL);//列印棋盤
	while (1)//遊戲未結束時達到多次下棋的效果
	{
		PlayerM(board, ROW, COL);//玩家下棋
		print_board(board, ROW, COL);
		ret = Is_Win(board, ROW, COL);//判斷勝負
		if (ret != 'C')
			break;
		ComputM(board, ROW, COL);//電腦下棋
		print_board(board, ROW, COL);
		ret = Is_Win(board, ROW, COL);//再次判斷勝負
		if (ret != 'C')
			break;
	}
	if (ret == '*')
		printf("玩家獲勝\n");
	else if (ret == '#')
		printf("電腦獲勝\n");
	else if(ret == 'D')
		printf("和棋\n");
	print_board(board, ROW, COL);
}
int main()
{
	menu();
	int a = 0;
	do
	{
		printf("請選擇:>");
		scanf("%d", &a);
		switch (a)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出遊戲\n");
			break;
		default:
			printf("輸入失敗,請重新輸入\n");
			break;
		}
	} while (a);
	return 0;
}
           

3. 源檔案game.c

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"

void Initboard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0;i < row;i++)
	{
		for (j = 0;j < col;j++)
		{
			board[i][j] = ' ';
		}
	}
}

void print_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0;i < row;i++)
	{
		for (j = 0;j < col;j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		if(i < row - 1)
		{
			for (j = 0;j < col;j++)
			{
				printf("---");
				if (j < col - 1)
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}
}

void PlayerM(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("請輸入坐标:>");
		scanf("%d%d", &x, &y);
		if (x >= 0 && x <= row && y >= 0 && y <= col)//坐标合法性
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("坐标被占用,請重新輸入\n");
			}
		}
		else
		{
			printf("坐标不合法,請重新輸入\n");
		}
	}
}

void ComputM(char board[ROW][COL], int row, int col)
{
	srand((unsigned)time(NULL));
	printf("電腦下棋\n");
	while (1)
	{
		int x = rand() % row;
		int y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

int Is_Full(char board[ROW][COL], int row, int col)//判斷棋盤是否下滿(即和棋)
{
	int i = 0;
	int j = 0;
	int count = 0;
	for (i = 0;i < row;i++)
	{
		for (j = 0;j < col;j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;
			}	
		}
	}
	return 1;
}

/*char Is_Win(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0;i < row;i++)//每行是否連棋的判斷
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
		{
			return board[i][1];//直接傳回相同的棋子,簡化了步驟
		}
	}
	for (j = 0;j < col;j++)//每列是否連棋的判斷
	{
		if (board[0][j] == board[1][j] && board[2][j] == board[1][j] && board[1][j] != ' ')
		{
			return board[1][i];
		}
	}
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
	{
		return board[1][1];//左對角線的判斷
	}
	if (board[0][2] == board[1][1] && board[2][0] == board[1][1] && board[1][1] != ' ')
	{
		return board[1][1];//右對角線的判斷
	}
	int ret = Is_Full(board, row, col);//判斷是否和棋,即棋盤是否被下滿
	if (ret == 0)
		return 'C';//沒下滿
	else
		return 'D';//下滿了
}*/
char Is_Win(char board[ROW][COL], int row, int col)//利用*的ASCII碼值為42,#的ASCII碼值為35
{
	int i = 0;
	int j = 0;
	int sum = 0;
	for (i = 0;i < row;i++)//逐行判斷
	{
	    sum = 0;//這個要放在循環體内部,以達到每次都清零的效果
		for (j = 0;j < col;j++)
		{
			sum += board[i][j];
		}
		if (sum == col * 42)
			return '*';
		else if (sum == col * 35)
			return '#';
	}
	for (i = 0;i < col;i++)//逐列判斷
	{
		sum = 0;
		for (j = 0;j < row;j++)
		{
			sum += board[j][i];
		}
		if (sum == row * 42)
			return '*';
		else if (sum == row * 35)
			return '#';
	}
	sum = 0;
	for (i = 0;i < row;i++)//左對角線
	{
		sum += board[i][i];
	}
	if (sum == row * 42)
		return '*';
	else if (sum == row * 35)
		return '#';
	sum = 0;
	for (i = 0, j = col - 1;i < row;i++, j--)//右對角線
	{
		sum += board[i][j];
	}
	if (sum == row * 42)
		return '*';
	else if (sum == row * 35)
		return '#';
	int ret = Is_Full(board, row, col);//和棋判斷
	if (ret == 0)
		return 'C';
	else
		return 'D';
}
           

總結

這是我至今寫部落格寫的最長的一篇,也是耗時最多的一篇,感悟也頗多,希望能給對三子棋有興趣的朋友一些幫助,這次的分享就到這裡結束了,再見了各位!!!

C語言實作三子棋遊戲(内附N子棋代碼優化)一、遊戲的簡單介紹二、遊戲的大緻架構三、遊戲的主要内容(重要)四、遊戲的相關優化五、 遊戲完整代碼總結

繼續閱讀