1. 程式人生 > >【C語言】實現小遊戲三子棋

【C語言】實現小遊戲三子棋

三子棋的規則:在九宮格棋盤中,只要橫、豎、對角線都能走成一條直線,就贏了。

我將實現三子棋遊戲的程式分為三個部分

第一部分:標頭檔案 game.h

#ifndef _GAME_H_
#define _GAME_H_

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ROW 3
#define COL 3

void InitBoard(char arr[ROW][COL], int row, int col);
void DisplayBoard(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);
char IsWin(char arr[ROW][COL], int row, int col);

#endif 

第二部分:原始檔 game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void game()
{
	char ret = 0;
	char arr[ROW][COL];
	InitBoard(arr, ROW, COL);
	do
	{
		PlayerMove(arr, ROW, COL);
		DisplayBoard(arr, ROW, COL);
		ret = IsWin(arr, ROW, COL);
		if(ret!=0)
			break;
		ComputerMove(arr, ROW, COL);
		DisplayBoard(arr, ROW, COL);
		ret = IsWin(arr, ROW, COL);
	}while(ret==0);
	if(ret=='X')
		printf("恭喜你贏了\n");
	if(ret=='*')
		printf("你輸了\n");
	if(ret=='q')
		printf("平局\n");
}
char arr[ROW][COL];
void InitBoard(char arr[ROW][COL], int row, int col)
{
	int i = 0;
    for(i=0; i<row; i++)
    {
		int j = 0;
        for(j=0; j<col; j++)
        {
			arr[i][j] = ' ';
        }
    }
}

void DisplayBoard(char arr[ROW][COL], int row, int col)
{
	int i = 0;
    for(i=0; i<row; i++)
    {
		printf(" %c | %c | %c \n", arr[i][0], arr[i][1], arr[i][2]);
        if(i!=row-1)
        printf("---|---|---\n");
    }
}
void PlayerMove(char arr[ROW][COL], int row, int col)
{
	int m = 0, n = 0;
    printf("玩家走:\n");
    while(1)
    {
		scanf("%d %d", &m, &n);
        if((m>=1)&&(m<=row)&&(n>=1)&&(n<=col))
        {
			if(arr[m-1][n-1]==' ')
            {
				arr[m-1][n-1]='X';
                break;
            }
            else
            printf("此位置被佔用,請重新輸入\n");
        }
        else
        printf("輸入錯誤,請重新輸入\n");
    }
}

void ComputerMove(char arr[ROW][COL], int row, int col)
{
	int m = 0, n = 0;
    printf("電腦走:\n");
    while(1)
    {
		m = rand()%row;
	    n = rand()%col;
	    if(arr[m][n]==' ')
	    {
			arr[m][n]='*';
		    break;
	    }
	}
}

int IsFull(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	for(i=0; i<row; i++)
	{
		int j = 0;
		for(j=0; j<col; j++)
		{
			if(arr[i][j]==' ')
				return 0;
		}
	}
	return 1;
}
char IsWin(char arr[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	for(i=0; i<row; i++)
	{
		if((arr[i][0]==arr[i][1])&&(arr[i][1]==arr[i][2])&&(arr[i][0]!=' '))
			return arr[i][0];
	}
	for(j=0; j<col; j++)
	{
		if((arr[0][j]==arr[1][j])&&(arr[1][j]==arr[2][j])&&(arr[0][j]!=' '))
			return arr[0][j];
	}
	if((arr[0][0]==arr[1][1])&&(arr[1][1]==arr[2][2])&&(arr[0][0]!=' '))
		return arr[0][0];
	else if((arr[0][2]==arr[1][1])&&(arr[1][1]==arr[2][0])&&(arr[0][2]!=' '))
		return arr[0][0];
	else if(IsFull(arr, row, col))
		return 'q';
	return 0;

}

第三部分:原始檔 test.c

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

int main()
{
	int a = 0;
        srand((unsigned int)time(NULL));
        do
        {
		menu();
                printf("請選擇:");
                scanf("%d", &a);
                switch(a)
                {
			case 1:
				game();
                                break;
                        case 0:
                                break;
                        default:
                                printf("輸入錯誤,請重新輸入\n");
                                break;
                }
        }while(a);
        return 0;
}