最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實現(xiàn)三子棋小游戲的示例代碼

 更新時間:2022年10月27日 09:40:14   作者:蝸牛牛啊  
這篇文章主要介紹了如何通過C語言實現(xiàn)三子棋小游戲,三子棋小游戲的實現(xiàn)主要依賴于循環(huán)語句、函數(shù)和數(shù)組,感興趣的小伙伴可以嘗試一下

一、三子棋

三子棋小游戲的實現(xiàn)主要依賴于循環(huán)語句、函數(shù)和數(shù)組。

主要思路:設計棋盤、初始化棋盤、玩家下棋、電腦下棋及判斷輸贏。

判斷輸贏條件:當任一方連續(xù)三個棋子成一條直線,即為獲勝。

1.演示效果

2.完整代碼

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3//行
#define COL 3//列
void Init_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++)
		{
			board[i][j] = ' ';
		}
	}
}
void Print_board(char board[ROW][COL], int row, int col)//打印棋盤
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		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 Player_board(char board[ROW][COL], int row, int col)//玩家下棋
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("玩家下棋>:");
		scanf("%d%d", &x, &y);
		if ((x >= 1 && x <= row) && (y >= 1 && y <= col))
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("坐標已被占用,請重新輸入!\n");
			}
		}
		else
		{
			printf("坐標非法,請重新輸入!\n");
		}
	}
}
void Computer_board(char board[ROW][COL], int row, int col)//電腦下棋
{
	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;
	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;
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')//判斷一行中是否相等
		{
			return board[i][0];
		}
	}
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')//判斷一列中是否相等
		{
			return board[0][i];
		}
	}
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')//判斷對角線是否相等
	{
		return board[0][0];
	}
	if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[0][2] != ' ')//判斷對角線是否相等
	{
		return board[1][1];
	}
	if (1 == Is_full(board, row, col))//Is_full的返回值等于1,說明棋盤已經(jīng)滿了,沒有空格了
		return 'P';
	return 'C';
}
void menu()
{
	printf("*******************\n");
	printf("***  1.開始游戲  **\n");
	printf("***  0.結(jié)束游戲  **\n");
	printf("*******************\n");
}
void game()
{
	printf("****  游戲開始  ***\n");
	char ret = 0;
	char board[ROW][COL] = { 0 };
	Init_board(board, ROW, COL);
	Print_board(board, ROW, COL);
	while(1)
	{
		Player_board(board, ROW, COL);
		Print_board(board, ROW, COL);
		ret = Is_win(board, ROW, COL);
		if (ret != 'C')
			break;

		Computer_board(board, ROW, COL);
		Print_board(board, ROW, COL);
		ret = Is_win(board, ROW, COL);
		if (ret != 'C')
			break;
	}
	if (ret == '*')
		printf("玩家贏!\n");
	if (ret == '#')
		printf("電腦贏!\n");
	if (ret == 'P')
		printf("平局!\n");
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do {
		menu();
		printf("請選擇>:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("游戲結(jié)束!\n");
			break;
		default:
			printf("選擇項不存在,請重新選擇!\n");
			break;
		}
	} while (input);
}

二、代碼解析

1.初始化棋盤

void Init_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++)
        {
            board[i][j] = ' ';
        }
    }
}

剛開始定義的數(shù)組中初始值為0,但是打印的時候會發(fā)生錯誤,所以要先將數(shù)組中的值改為空格,以確保在打印棋盤的時候能夠得到想要的結(jié)果。

2.打印棋盤

void Print_board(char board[ROW][COL], int row, int col)//打印棋盤
{
    int i = 0;
    for (i = 0; i < row; i++)
    {
        int j = 0;
        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");
        }
    }
}

打印出來為:

3.玩家下棋

void Player_board(char board[ROW][COL], int row, int col)//玩家下棋
{
    int x = 0;
    int y = 0;
    while (1)
    {
        printf("玩家下棋>:");
        scanf("%d%d", &x, &y);
        if ((x >= 1 && x <= row) && (y >= 1 && y <= col))
        {
            if (board[x - 1][y - 1] == ' ')
            {
                board[x - 1][y - 1] = '*';
                break;
            }
            else
            {
                printf("坐標已被占用,請重新輸入!\n");
            }
        }
        else
        {
            printf("坐標非法,請重新輸入!\n");
        }
    }
}

玩家下棋要判斷輸入的下標是否符合要求,是否為空格,當輸入的坐標不在范圍內(nèi)時,輸入坐標非法,重新輸入。當輸入的坐標不是空格,已被占用時也需要重新輸入,這里注意玩家輸入的坐標是從1開始的,并非從0。

4.電腦下棋

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

電腦下棋時,需要用rand函數(shù)讓其產(chǎn)生在0 ~ row-1和0 ~ col-1之間,并且每次程序開始時產(chǎn)生的數(shù)都不相同,所以rand函數(shù)要和srand函數(shù)配合使用。具體使用方法可參考猜數(shù)字小游戲中游戲主題函數(shù)的介紹。

5.判斷輸贏

int Is_full(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++)
        {
            if (board[i][j] == ' ')
                return 0;
        }
    }
    return 1;
}
char Is_win(char board[ROW][COL], int row, int col) //判斷輸贏
{
    int i = 0;
    for (i = 0; i < row; i++)
    {
        if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
        {
            return board[i][0];
        }
    }
    for (i = 0; i < row; i++)
    {
        if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
        {
            return board[0][i];
        }
    }
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
    {
        return board[0][0];
    }
    if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[0][2] != ' ')
    {
        return board[1][1];
    }
    if (1 == Is_full(board, row, col))//Is_full的返回值等于1,說明棋盤已經(jīng)滿了,沒有空格了
        return 'P';
    return 'C';
}

假設用P表示平局,用C表示游戲繼續(xù),用*表示玩家獲勝,用#表示電腦獲勝,我們需要判斷行、列和對角線上是否有三個連續(xù)符號組成的直線,并且可以根據(jù)符號判斷出是誰贏誰輸。當沒有三個連續(xù)的符號組成的直線,且沒有空格時為平局。其中Is_full函數(shù)是用來判斷數(shù)組中是否還有空格。

6.游戲主體函數(shù)

通過調(diào)用具體的實現(xiàn)函數(shù),完成界面的布局。

void game()
{
	printf("****  游戲開始  ***\n");
	char ret = 0;
	char board[ROW][COL] = { 0 };
	Init_board(board, ROW, COL);
	Print_board(board, ROW, COL);
	while(1)
	{
		Player_board(board, ROW, COL);
		Print_board(board, ROW, COL);
		ret = Is_win(board, ROW, COL);
		if (ret != 'C')
			break;

		Computer_board(board, ROW, COL);
		Print_board(board, ROW, COL);
		ret = Is_win(board, ROW, COL);
		if (ret != 'C')
			break;
	}
	if (ret == '*')
		printf("玩家贏!\n");
	if (ret == '#')
		printf("電腦贏!\n");
	if (ret == 'P')
		printf("平局!\n");
}

7.菜單函數(shù)

void menu()
{
    printf("*******************\n");
    printf("***  1.開始游戲  **\n");
    printf("***  0.結(jié)束游戲  **\n");
    printf("*******************\n");
}

8.頭文件及主函數(shù)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3//行
#define COL 3//列
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do {
		menu();
		printf("請選擇>:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("游戲結(jié)束!\n");
			break;
		default:
			printf("選擇項不存在,請重新選擇!\n");
			break;
		}
	} while (input);
}

到此這篇關(guān)于C語言實現(xiàn)三子棋小游戲的示例代碼的文章就介紹到這了,更多相關(guān)C語言三子棋游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言 全局變量和局部變量詳解及實例

    C語言 全局變量和局部變量詳解及實例

    這篇文章主要介紹了C語言 全局變量和局部變量詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • opencv3/C++實現(xiàn)霍夫圓/直線檢測

    opencv3/C++實現(xiàn)霍夫圓/直線檢測

    今天小編就為大家分享一篇opencv3/C++實現(xiàn)霍夫圓/直線檢測,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • OpenCV利用對比度亮度變換實現(xiàn)水印去除

    OpenCV利用對比度亮度變換實現(xiàn)水印去除

    OpenCV中去除水印最常用的方法是inpaint,通過圖像修復的方法來去除水印。本文將介紹另一種方法:利用對比度亮度變換去除水印,需要的朋友可以參考一下
    2021-11-11
  • C語言詳解結(jié)構(gòu)體的內(nèi)存對齊與大小計算

    C語言詳解結(jié)構(gòu)體的內(nèi)存對齊與大小計算

    C 數(shù)組允許定義可存儲相同類型數(shù)據(jù)項的變量,結(jié)構(gòu)是 C 編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許你存儲不同類型的數(shù)據(jù)項,本篇讓我們來了解C 的結(jié)構(gòu)體內(nèi)存對齊與計算大小
    2022-04-04
  • C++利用模板實現(xiàn)消息訂閱和分發(fā)功能

    C++利用模板實現(xiàn)消息訂閱和分發(fā)功能

    C++語言支持重載,模板,虛函數(shù)等特性,為編寫高性能可擴展的程序提供了利器。本文就講利用模板實現(xiàn)消息訂閱和分發(fā)功能,感興趣的小伙伴可以了解一下
    2022-12-12
  • C++中將Char轉(zhuǎn)換成String的4種方法

    C++中將Char轉(zhuǎn)換成String的4種方法

    本文主要介紹了C++中將Char轉(zhuǎn)換成String的4種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • 深入C++拷貝構(gòu)造函數(shù)的總結(jié)詳解

    深入C++拷貝構(gòu)造函數(shù)的總結(jié)詳解

    本篇文章是對C++中拷貝構(gòu)造函數(shù)進行了總結(jié)與介紹。需要的朋友參考下
    2013-05-05
  • C語言輸出唯一的子串

    C語言輸出唯一的子串

    這篇文章主要介紹了C語言輸出唯一的子串,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-12-12
  • 基于Qt實現(xiàn)可拖動自定義控件

    基于Qt實現(xiàn)可拖動自定義控件

    這篇文章主要為大家詳細介紹了如何基于Qt實現(xiàn)可拖動自定義控件,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以了解一下
    2023-04-04
  • VS2022新建項目時沒有ASP.NET Web應用程序(.NET Framework)

    VS2022新建項目時沒有ASP.NET Web應用程序(.NET Framework)

    本文主要介紹了VS2022新建項目時沒有ASP.NET Web應用程序的解決,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-10-10

最新評論

抚顺市| 天祝| 迁安市| 观塘区| 汤阴县| 睢宁县| 松潘县| 册亨县| 佛教| 连江县| 张掖市| 余江县| 肥西县| 湟中县| 新龙县| 东港市| 富平县| 顺昌县| 礼泉县| 汽车| 万年县| 平江县| 罗江县| 喀什市| 贵定县| 磴口县| 宽甸| 大埔区| 榆社县| 泸溪县| 琼结县| 芜湖市| 安新县| 临猗县| 太谷县| 左权县| 闻喜县| 隆尧县| 彭阳县| 萍乡市| 巴里|