1. 程式人生 > >今天定個小目標,用C語言實現三子棋的玩法。裡面有精彩情景故事幫助你更快理解程式碼內容,不進來了解一下嗎?(內附程式碼)

今天定個小目標,用C語言實現三子棋的玩法。裡面有精彩情景故事幫助你更快理解程式碼內容,不進來了解一下嗎?(內附程式碼)

  如標題所示,今天我們要用C語言來實現三子棋的遊戲。相信大家都玩過這個遊戲。我們來回憶一下游戲步驟。   一、今天你在家裡看書,你的朋友小紅邀請你和她一起玩三子棋。這時你有兩個選擇。     1.接受她的邀請,在玩遊戲的同手,促進你們的感情。     0.殘忍拒絕她,三子棋有什麼好玩的,是書不好看了嗎。    那我們在設計遊戲時,第一步也應該是讓玩家進行選擇。   二、假設你因為暗戀小紅接受了小紅髮來的遊戲邀請,這時你們決定開始玩三子棋。那你們首先要拿出棋譜和棋子並且選擇各自要執子的顏色。   那這個對應我們在寫程式碼時就是要列印棋盤,並且用不同的符號區分你和小紅所執的子。在本文中,我們將小紅看成是電腦玩家(小紅是一個沒有感情的棋手)小紅執子為黑子,用符號“@”表示,將你看成是個人玩家,執白色棋子,用符號“X”表示你所執的子。

  三、遊戲就要開始了,你很緊張。你不知道要不要向小紅展示你的真實實力(其實你是全世界三子棋冠軍,但因為你為人低調,每次比賽時都要戴口罩,所以小紅並不知道你的真實身份)。向小紅展示你的真實實力,小紅可能因為輸了就不太想跟你玩了。如果裝的太菜,小紅可能會嘲笑你。真是一個艱難的選擇。   因此我們在寫程式碼時,也可以將遊戲進行不同難度程度的劃分。這裡我們說一下簡單模式的,也就是讓電腦不進行任何分析而隨機落子。困難模式目前我想到的只有窮舉法,但是顯然這個演算法太麻煩了。所以在程式碼中。我將困難模式模板目前沒有po上程式碼,後面我會考慮優化演算法,再對本文進行編輯。   完成上述準備工作後,要正式開始玩了。我們將棋盤看成一個二維陣列,每一次落子就是對空白陣列進行賦值的過程。因此寫程式碼時我們要先初始化一個二維陣列,對陣列的行和列進行限制。這離我們是三子棋,將行ROW和列COL都定義為3。將下棋過程中的電腦落子和玩家落子分別用兩個函式表示。每次落子結束後都要進行判斷是否有人贏了,因此還需要一個判斷輸贏的函式。下面我們附上程式碼。

//game.h部分
#ifndef __GAME_H__
#define __GAME_H__
#define ROW 3  //行
#define COL 3  //列
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu(void);//開始選單
void init(char arr[ROW][COL], int row, int col);//初始化陣列
void printboard(char arr[ROW][COL], int row, int col);//遊戲棋盤
void playermove(char arr[ROW][COL],int row,int col);  //玩家走
void computermove(char arr[ROW][COL], int row, int col);  //電腦走
int win(char arr[ROW][COL], int row, int col);   //判斷勝利
#endif // __GAME_H__
//我們將遊戲中涉及到的所有的函式放在game.h的標頭檔案中方便我們呼叫
//game.c部分   
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void menu(void)									 	  	//列印選單,讓玩家進行選擇
{
    printf("************************\n");      
    printf("***  1.開始  0.退出  ***\n");
    printf("************************\n");
}

void init(char arr[ROW][COL], int row, int col)				  // 二維陣列的初始化
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            arr[i][j] = ' ';
        }
    }
}
 void printboard(char arr[ROW][COL], int row, int col)				//  列印棋盤
{
    int i = 0;
    for (i = 0; i < row; i++)
    {
        printf("------------------------\n");
        printf("|      |       |       |\n");
        printf("|   %c  |   %c   |   %c   |\n",arr[i][0],arr[i][1],arr[i][2]);
        printf("|      |       |       |\n");


    }
			printf("------------------------\n");
}

 void playermove(char arr[ROW][COL], int row, int col)				/  /玩家落子
 {
     int x = 0;
     int y = 0;
     while (1)
     {
         printf("玩家走\n請輸入座標:>");										
         scanf("%d%d", &x, &y);
         if ((x - 1) < row && (x - 1) >= 0 && (y - 1) < col && (y - 1) >= 0)//落子時要考慮取值範圍,不能超過棋盤
         {
             if (arr[x-1][y-1] == ' ')      //此處為空時,才可以落子
             {
                 arr[x - 1][y - 1] = 'X';
                 break;
             }
             else							//否則進行重新選擇
             {
                 printf("此座標已有棋子,請重新選擇座標!\n");
             }
         }
         else
         {
             printf("輸入座標錯誤!\n");
         }
     }

 }

	 void computermove(char arr[ROW][COL], int row, int col)	 	/ /電腦落子
 {
     int x = 0;
     int y = 0;

     printf("電腦走:>\n");
     while (1)
     {
         x = rand() % row;			//電腦落子取隨機數表示,取餘對隨機數範圍進行限定
         y = rand() % col;  
         if (x< row && x >= 0 && y < col && y >= 0)
         {
             if (arr[x][y] == ' ')
             {
                 arr[x][y] = '@'; 
                 break;
             }
         }
     }
 }



 int win(char arr[ROW][COL], int row, int col)					  	//判斷輸贏
 {
     int i = 0;
     int j = 0;
     int execute = 1;

         for (i = 0; i < row; i++)
         {
             for (j = 0; j < col; j++)	//這裡我是用窮舉法列出了所有贏的可能,此處可以不用窮舉
             {
                 if (arr[i][j] == 'X'&&arr[i + 1][j + 1] == 'X'&&arr[i + 2][j + 2] == 'X'&& i<(row-2)&& i<(col - 2)
                     || arr[i][j] == 'X'&&arr[i][j + 1] == 'X'&&arr[i][j + 2] == 'X'&&j<(col-2)
                     || arr[i][j] == 'X'&&arr[i + 1][j] == 'X'&&arr[i + 2][j] == 'X'&&i<(row-2)
                     || arr[i][j] == 'X'&&arr[i + 1][j - 1] == 'X'&&arr[i + 2][j - 2] == 'X'&&i<(row-2)&&(j>=2))  									
                 {
                     printf("恭喜你贏了!\n");
                     return 1;
                 }
             }
         }
         for (i = 0; i < row; i++)
         {
             for (j = 0; j < col; j++)
             {
                 if (arr[i][j] == '@'&&arr[i + 1][j + 1] == '@'&&arr[i + 2][j + 2] == '@'&& i<(row - 2) && i<(row - 2)
                     || arr[i][j] == '@'&&arr[i][j + 1] == '@'&&arr[i][j + 2] == '@'&&j<(col - 2)
                     || arr[i][j] == '@'&&arr[i + 1][j] == '@'&&arr[i + 2][j] == '@'&&i<(row - 2)
                     || arr[i][j] == '@'&&arr[i + 1][j - 1] == '@'&&arr[i + 2][j - 2] == '@' && i<(row - 2) && (j >= 2))
                 {
                     printf("電腦贏了!\n");
                     return 1;
                 }
             }
         }

         for (i = 0; i < row; i++)
         {
             for (j = 0; j < col; j++)
             {
                 if (arr[i][j] == ' ')
                 {
                     execute = 0;
                 }
             }
         }
         if(1 == execute)
         { 
             printf("平局!\n");
             return 1;
         }
     return 0;
 }

//test.c部分
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"

int main()
{
	int chose = 0;									
    int input = 0;
    int i = 0;
	char arr[ROW][COL] = { 0 };
    srand((unsigned int)time(NULL));
    while(1)
    {
        if (i == 0)
        {
            menu();
            init(arr, ROW, COL);
            printf("請選擇是否開始遊戲:");
        }
         i = 1;   
        scanf("%d", &input);
        switch (input)
        {
        case 1:
			printf("請輸入你要選擇的遊戲難度\n");
			printf("*******************************\n");
			printf("********   0.簡單   ***********\n");
			printf("***********1.困難   ***********\n");
			printf("*******************************\n");
			scanf("%d",&chose);
			if(chose==0)
			{
				 printboard(arr, ROW, COL);
				 while (1)
				{
					 playermove(arr, ROW, COL);
					 printboard(arr, ROW, COL);         
					 if(win(arr, ROW, COL)==1)
						 {
							 i = 0;
							 break;
						 }
					 computermove(arr, ROW, COL); 
					 printboard(arr, ROW, COL);
					if (win(arr, ROW, COL) == 1)
						{
						  i = 0;
						 break;
						 }
				  }
            break;
			}
			else if(chose==1)
			printf("正在籌備中,敬請期待\n");
			else
			printf("輸入錯誤,請重新輸入\n");
		
		
        case 0:
            printf("遊戲退出!\n");
            system("pause");
            return 0;
            break;
        default:
            printf("輸入錯誤!請重新輸入:");
            break;
        }
    }
     return 0;
	}