1. 程式人生 > >零基礎寫出三子棋遊戲;全網最詳細解析三子棋的C語言寫法!

零基礎寫出三子棋遊戲;全網最詳細解析三子棋的C語言寫法!

作為一個遊戲你首先得有選單!於是我們做了個選單~

void menu()
{
	printf("┏━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
	printf("┃    歡迎來到三子棋      ┃\n");
	printf("┣━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
	printf("┃       1.開始遊戲       ┃\n");
	printf("┣━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
	printf("┃       0.退出遊戲       ┃\n");
	printf("┗━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
}

選單做好了你得讓人家選吧,弄個input接受一哈。對應選單,選一進入遊戲,選零退出程式,有故意亂輸的先告訴他選錯了,然後再給他次機會,所以這裡用一手do while就很愜意了~

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));//後面rand電腦下子座標用的
	do
	{
		menu();//列印選單
		printf("請選擇:");
		scanf("%d",&input);
		switch(input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出遊戲\n");
			break;
		default:
			printf("選擇錯誤\n");
			break;
		}

	}
	while(input);
	return 0;
}

在原始檔中新填一個game.c,開始寫遊戲主體函式啦~ 下面進入遊戲的主體函式,我會在備註中講解( ̄▽ ̄)/

void game()
{
	int input = 0;//用於判斷誰先行的
	int count = 0;//用count記錄回合數
	char board[ROWS][COLS] = {0};//初始化一個二維陣列用以存座標
	
	init_board(board,ROWS,COLS);//初始化棋盤
	print_board(board,ROWS,COLS);//列印棋盤
	printf("若您想先行,輸入1,想讓電腦先行則輸入其他數字:");
	scanf("%d",&input);
	
	if(1 != input)//電腦先行的情況
	{
		printf("電腦落子:\n");
		com_move(board,ROWS,COLS);     //電腦落子
	    print_board(board,ROWS,COLS);  //慣例列印棋盤
		count++;                       //記一次回合數
	}
	while(1)
	{
		if(9 == count)//9回合未分勝負則輸出平局
		{
			printf("~~~旗鼓相當的對手~~~\n");
			break;
		}

		printf("玩家落子:\n");            //玩家回合
		player_move(board,ROWS,COLS);     //玩家落子
		print_board(board,ROWS,COLS);     //慣例列印棋盤
		if(' ' != is_win(board,ROWS,COLS))//回合結束判斷勝負
			break;
		count++;                          //記一次回合數

		printf("電腦落子:\n");            //電腦回合
		com_move(board,ROWS,COLS);        //電腦落子
	    print_board(board,ROWS,COLS);     //慣例列印棋盤
		if(' ' != is_win(board,ROWS,COLS))//回合結束判斷勝負
			break;
		count++;                          //記一次回合數
	}
	if('X' == is_win(board,ROWS,COLS))//判斷勝負
	{
		printf("電腦勝利!!!!!!\n");
	}
	else if('*' == is_win(board,ROWS,COLS))//判斷勝負
	{
		printf("你贏了!!!!!!\n");
	}
	re_menu();//返回主選單
}

然後就是補充在遊戲中涉及到但沒寫的函式

初始化棋盤函式 就是把字元型的二維陣列用空格填滿

void init_board(char board[ROWS][COLS], int rows, int cols)
{
	int i = 0;
	int j = 0;
	for(i=0; i<rows; i++)
	{
		for(j=0; j<cols; j++)
		{
			board[i][j] = ' ';
		}
	}

}

列印棋盤函式 為了讓我們的函式不僅僅侷限於3*3,所以這裡不能直接一行三個這樣設計排版,而是要一個一個輸出;此處的程式碼可以仔細研究

void print_board(char board[ROWS][COLS], int rows, int cols)
{
	int i = 0;
	int j = 0;
	for(i=0; i<rows; i++)
	{
		for(j=0; j<cols; j++)
		{
			printf(" %c ",board[i][j]);
			if(j<cols-1)
				printf("┃");
		}
		printf("\n");
		if(i<rows-1)
		{
			for(j=0; j<cols-1; j++)
			{
				printf("━━━╋");
			}
			printf("━━━");
		}
		printf("\n");
	}

}

玩家下子函式 注意兩點:1,座標和元素下標要區分開; 2,要檢驗輸入的是否可用,有沒有被佔用 ps:這裡我沒有區分“已被佔用”和“輸入座標錯誤”~觀眾闊以改一哈

void player_move(char board[ROWS][COLS], int rows, int cols)
{
	int x = 0;
	int y = 0;
	while(1)
	{
		printf("輸入你要落子的座標:");
		scanf("%d%d",&x,&y);
		if(' ' == board[x-1][y-1])
		{
			board[x-1][y-1] = '*';
			break;
		}
		else
			printf("該座標已被佔用!\n");
	}

}

電腦下子函式 電腦選擇的座標是根據時間隨即生成的;由於模3後只會有0,1, 2三個結果,滿足下標的要求,所以只需要在判斷蛤有沒有被佔用就闊以了

void com_move(char board[ROWS][COLS], int rows, int cols)
{
	int x = 0;
	int y = 0;
	while(1)
	{
		x = rand()%3;//開頭主函式中有宣告喲~可以回去看一眼
		y = rand()%3;
		if(' ' == board[x][y])
		{
			board[x][y] = 'X';
			break;
		}
		
	}

}

判斷輸贏函式 把所有勝利條件窮舉出來,沒啥好說的,別輸錯下標就行

char is_win(char board[ROWS][COLS], int rows, int cols)
{
	int i = 0;
	for(i=0; i<rows; i++)
	{
		if((board[i][0]==board[i][1])&&(board[i][1]==board[i][2])&&(' '!=board[i][1]))
			return board[i][1];
	}
	for(i=0; i<cols; i++)
	{
		if((board[0][i]==board[1][i])&&(board[1][i]==board[2][i])&&(' '!=board[1][i]))
			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[1][1] == board[2][0])&&(' '!=board[1][1]))
		return board[1][1];

	return ' ';

}

返回選單函式 花裡胡哨的搞個倒計時清屏,在第二次進入目錄前清屏闊以更乾淨,不過不要也沒關係

void re_menu()
{
	printf("三秒後返回選單頁面\n");
	printf("3\n");
	Sleep(1000);
	printf("2\n");
	Sleep(1000);
	printf("1\n");
	system("cls");
}

這是我自己創的game庫函式,把所有引標頭檔案,函式宣告,定義常量等操作放在這

#ifndef  __game_h__
#define  __game_h__

#define  ROWS 3
#define  COLS 3
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>

void game();
void init_board(char board[ROWS][COLS], int rows, int cols);
void print_board(char board[ROWS][COLS], int rows, int cols);
void player_move(char board[ROWS][COLS], int rows, int cols);
void com_move(char board[ROWS][COLS], int rows, int cols);
char is_win(char board[ROWS][COLS], int rows, int cols);
void re_menu();


#endif  //__game_h__

執行一次!在這裡插入圖片描述 在這裡插入圖片描述 讀秒完成後會回到主選單 在這裡插入圖片描述 ok,三子棋的C語言寫法就是這樣了,只要思路清晰,完成這個遊戲不會太難的!