1. 程式人生 > >C語言:3*3棋盤實現三子棋

C語言:3*3棋盤實現三子棋

三子棋的實現功能:

通過輸入座標確認下棋地點,與電腦對戰,電腦產生隨機數(隨機座標)。

輸出棋盤,並判斷玩家與電腦的輸贏,輸出贏家。

#include<stdio.h>
#include<stdlib.h>
#include"game.h"
#include<windows.h>

void start_game(char arr[ROWS][COLS])
{
	show_arr(arr, ROWS, COLS);  //輸出棋盤;
	while (1)
	{
		player_game(arr, ROWS, COLS);//玩家開始玩遊戲;
		if (check(arr) == 'p')   
		{
			break;
		}
		show_arr(arr, ROWS, COLS);
		printf("電腦開始下棋:>\n");
		computer_game(arr, ROWS, COLS);//電腦開始玩遊戲;
		if (check(arr) == 'c')
		{
			break;
		}
		Sleep(1000);
		show_arr(arr, ROWS, COLS);
	}
		if (check(arr) == 'p')
		{
			printf("玩家獲勝\n");
		}
		else
		{
			printf("電腦獲勝\n");
		}
}

void menu()  //簡易的選單輸出;
{
	printf("**************************\n");
	printf("******    1.play    ******\n");
	printf("******    0.exit    ******\n");
	printf("**************************\n");
}

void game()
{
	int tmp = 0;
	char arr[ROWS][COLS] = { 0 };//初始化棋盤輸出 ROWS,COLS巨集定義大小;
	init_arr(arr, ROWS, COLS);
	srand((unsigned)time(NULL));//產生隨機數,此處需要呼叫標頭檔案#include<time.h> 
	menu();
	printf("請選擇是否開始玩遊戲:>");
	scanf("%d", &tmp);
	switch (tmp)
	{
	case PLAY:
		start_game(arr);
		break;
	case EXIT:
		break;
	}
}

int main()
{
	game();
	system("pause");
	return 0;
}
text.c寫大概的邏輯,通過呼叫各個函式判斷是否開始遊戲,並寫一個簡易的判斷輸贏的函式。text.c需要呼叫標頭檔案#include "game.h"。
#include<stdio.h>
#include<stdlib.h>
#include"game.h"

void init_arr(char arr[ROWS][COLS])   //給棋盤複製為空格’ ’;
{
	int i = 0;
	int j = 0;
	for (i = 0; i < ROWS; i++)
	{
		for (j = 0; j < COLS; j++)
		{
			arr[i][j] = ' ';
		}
	}
}

void show_arr(char arr[ROWS][COLS])  //按一定格式輸出棋盤;
{
	int i = 0;
	for (i = 0; i < ROWS; i++)
	{
		printf(" %c | %c | %c \n", arr[i][0], arr[i][1], arr[i][2]);
		if (i != 2)
		{
			printf("---|---|--- \n");
		}
	}
}

void player_game(char arr[ROWS][COLS])  //玩家開始玩遊戲
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("請玩家輸入座標:>");
		scanf("%d %d", &x, &y);
		//判斷座標是否合法;
		if ((x > 0 && x <= 3) && (y > 0 && y <= 3))    
		{
			if (arr[x - 1][y - 1] == ' ')
			{
				arr[x - 1][y - 1] = 'X';
				break;
			}
			else
			{
				printf("座標不可以使用.\n");
			}
		}
		else
		{
			printf("座標輸入不合法\n");
		}
	}
}

void computer_game(char arr[ROWS][COLS])  //電腦開始玩遊戲
{
	while (1)
	{
		int x = rand() % 3;  //此處產生隨機數,對3取餘,使x,y的座標數為0或者1或者2;
		int y = rand() % 3;
		if (arr[x][y] == ' ')
		{
			arr[x][y] = '0';
			break;
		}
	}
}

char check(char arr[ROWS][COLS])    
{
	int i = 0;
	//判斷玩家的輸贏;
	for (i = 0; i < ROWS; i++)//判斷三個行數是否均為X,是的話返回p,代表player獲勝;
	{
		if (((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2])) && (arr[i][0] == 'X'))
			return 'p';
	}
	for (i = 0; i < COLS; i++)//判斷三個列數是否均為X,是的話返回p,代表player獲勝;
	{
		if (((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i])) && (arr[0][i] == 'X'))
			return 'p';
	}
	//用兩個if語句判斷兩個對角是否均為X,是的話返回p,代表player獲勝;
	if (((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2])) && (arr[1][1] == 'X'))
	{
		return 'p';
	}
	if (((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0])) && (arr[1][1] == 'X'))
	{
		return 'p';
	}
	//判斷電腦的輸贏;
	for (i = 0; i < ROWS; i++)
	{
		if (((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2])) && (arr[i][0] == '0'))
			return 'c';
	}
	for (i = 0; i < COLS; i++)
	{
		if (((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i])) && (arr[0][i] == '0'))
			return 'c';
	}
	if (((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2])) && (arr[1][1] == '0'))
	{
		return 'c';
	}
	if (((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0])) && (arr[1][1] == '0'))
	{
		return 'c';
	}
}
game.c主要寫text.c呼叫的函式,實現三子棋的主要函式功能。

1、初始化棋盤;

2、輸出棋盤;

3、玩家和電腦分別下棋;

4、判斷輸贏;

此處的函式宣告均放在下面的game.h標頭檔案中,因此此處應該寫入#include "game.h"

#define _CRT_SECURE_NO_WARNINGS 1

#ifndef __GAME_H__
#define __GAME_H__

#define ROWS 3     //定義行數;
#define COLS 3	   //定義列數;

enum XP    //列舉 使得選擇選單容易理解1.play  0.exit;
{
	PLAY = 1,
	EXIT = 0
};
//函式的宣告;
void init_arr(char arr[ROWS][COLS]);
void show_arr(char arr[ROWS][COLS]);
void player_game(char arr[ROWS][COLS]);
void computer_game(char arr[ROWS][COLS]);
char check(char arr[ROWS][COLS]);


#endif
三子棋的主要程式碼如上。可以寫在一個.c檔案中,像上面這樣,程式碼容易讀懂。