亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

教你用C語言實現三子棋

 更新時間:2021年11月11日 10:41:54   作者:釣月亮  
這篇文章主要為大家詳細介紹了C語言實現簡單三子棋程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

三子棋

三子棋的規(guī)則是:在3x3的棋盤里,雙方輪流下子(以X和O表示),先將3個子連成一條線(橫豎斜都可以)的一方獲勝

下面是三子棋C語言實現的幾個問題:

1.要想實現三子棋,我們需要一個棋盤,然后就是棋盤的內容。

2.下棋的時候需要判斷是否該位置合法。

3.玩家和電腦的下棋邏輯不同,玩家需要手動輸入,電腦是自己下棋

4.每下一步棋都需要判斷游戲是否結束(哪方勝利、平局還是繼續(xù)下棋)。

設計方式:

需要創(chuàng)建三個文件:一個頭文件,兩個源文件,頭文件里面放的是函數的聲明以及一系列預處理命令,命名為game.h

兩個源文件,一個里面放的是主函數(游戲大體的運行順序),命名為work.c,一個里面放的是游戲內容的實現邏輯(放大部分執(zhí)行函數),命名為game.c

work.c的設置

首先是進入游戲,為了確保游戲可以重復玩,我們可以以循環(huán)的方式實現

//work.c里面的內容
#include"gmae.h"http://這樣的話,在game.h里面包含的文件,在work.c里面也能使用
int main()
{
	int option = 0;//在主函數里面設計循環(huán),可以保證每次游戲結束后可以選擇繼續(xù)游戲或者退出游戲
	do 
	{
		Menu();
		scanf("%d", &option);
		switch (option)
		{
		case 1:
			game();//如果選擇開始游戲,就會進入到game()函數,
                /*我們需要定義game函數來存放游戲的實現順序*/
			break;
		case 0:
			printf("已退出");
			break;
		default :
			printf("錯誤選擇,請重新輸入");
		}
	} while (option);
	return 0;
}
//work.c里面的內容
void Menu()//定義菜單函數,配合主函數里面的循環(huán),可以實現每次游戲結束會跳到這個界面
{
	printf("*****************\n");
	printf("***  1.play  ****\n");
	printf("***  0.exit  ****\n");
	printf("*****************\n");
	printf("請選擇");
}

然后就是游戲進行的順序需要在game函數里面實現

//work.c里面的內容
void game()
{
	srand((unsigned int)time(NULL));//使用隨機數,便于后面電腦下棋時是隨機出棋
	char board[ROW][COL] = { 0 };//創(chuàng)建一個二維數組,用來實現棋盤的內容
	printf("游戲開始:\n");
	init_board(board,ROW,COL);//初始化棋盤
	print_board(board, ROW, COL);//打印棋盤
	while (1)
	{
		char ret = '0';
		player_move(board, ROW, COL);//玩家下棋
		print_board(board, ROW, COL);//打印棋盤
		ret = is_win(board, ROW, COL);//判斷是否結束
		if (ret == '*')
		{
			printf("玩家勝利\n");
			break;
		}
		computer_move(board, ROW, COL);//電腦下棋
		print_board(board, ROW, COL);//打印棋盤
		ret = is_win(board, ROW, COL);//判斷是否結束
		if (ret == '#')//
		{
			printf("電腦勝利\n");
			break;
		}//判斷電腦勝利
		if (ret == 'Q')//判斷平局
		{
			printf("平局\n");
			break;
		}//判斷平局
	}
}
//work.c里面的內容
void game()
{
	srand((unsigned int)time(NULL));//使用隨機數,便于后面電腦下棋時是隨機出棋
	char board[ROW][COL] = { 0 };//創(chuàng)建一個二維數組,用來實現棋盤的內容
	printf("游戲開始:\n");
	init_board(board,ROW,COL);//初始化棋盤
	print_board(board, ROW, COL);//打印棋盤
	while (1)
	{
		char ret = '0';
		player_move(board, ROW, COL);//玩家下棋
		print_board(board, ROW, COL);//打印棋盤
		ret = is_win(board, ROW, COL);//判斷是否結束
		if (ret == '*')
		{
			printf("玩家勝利\n");
			break;
		}
		computer_move(board, ROW, COL);//電腦下棋
		print_board(board, ROW, COL);//打印棋盤
		ret = is_win(board, ROW, COL);//判斷是否結束
		if (ret == '#')//
		{
			printf("電腦勝利\n");
			break;
		}//判斷電腦勝利
		if (ret == 'Q')//判斷平局
		{
			printf("平局\n");
			break;
		}//判斷平局
	}
}

下面是對這幾點問題的解決方法:

game.h的內容設置

#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 3
#define COL 3//設置了行與列的值,可以更改
#include<stdio.h>
#include<time.h>//用來實現時間戳
//下面是游戲實現邏輯所需的函數聲明。
void init_board(char board[ROW][COL], int row, int col);
void player_move(char board[ROW][COL], int row, int col);
void computer_move(char board[ROW][COL], int row, int col);
void print_board(char board[ROW][COL], int row, int col);
char is_win(char board[ROW][COL], int row, int col);

game.c的設置

1.棋盤的內容

我們通過創(chuàng)建一個二維數組來作為棋子,通過輸入坐標的方式來進行下棋的步驟

創(chuàng)建數組:

char board[ROW][COL] ;這里括號里面的值我們用提前處理過的ROW與COL來表示,
    通過預處理命令,我們后期可以很方便的更改ROW與COL的值來改變棋盤的大小

2.棋盤以及棋盤的初始化

棋盤是3x3形式,所以我們可以通過循環(huán)的方式打印一個棋盤,下面是棋盤的格式

 0 | 0 | 0  
---|---|---
 0 | 0 | 0
---|---|---
 0 | 0 | 0 //而這個表里面的0就是我們的下的棋子占有的位置
 /*而這個棋盤的設計是有明顯的規(guī)律的:
     第一行: 空格%c空格
	第二行:---|循環(huán)3遍,但是最后遍不打印“|”
     然后這樣的兩行在循環(huán)中多次打印,就出現了這樣的三子棋表格
     注意:最后一行不用再打印“---”

這里我們定義init_board()函數來初始化棋盤(即讓數組的所有元素的值都為空格)

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] = ' ';//把所有元素賦值為' '
		}
	}
}

3.打印棋盤

void print_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++)
		{
			printf(" %c ", board[i][j]);
			if (j != col - 1)
			{
				printf("|");//最后一列不打印'|'
			}
		}
		//每次進行上一個循環(huán)時,i的值在變化,打印的是不同的值
		printf("\n");
		if (i != row - 1)//最后一行不打印字符
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j != col - 1)
					printf("|");
			}
		}
		printf("\n");
	}
	printf("\n");
}

4.下棋步驟 玩家下棋

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

電腦下棋

void computer_move(char board[ROW][COL], int row, int col)
{
	char x = 0;
	char y = 0;
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

5.判斷是否勝利

char 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;//用是否還有空格判斷平局
		} 
	}
}
char is_win(char board[ROW][COL], int row, int col)//這里是判斷橫豎斜三種方式是否出現勝利
{
	int i = 0;
	int j = 0;
	int count = 0;
	for (i = 0; i < row; i++)
	{
		if ((board[i][0] == board[i][1])&&(board[i][1]==board[i][2])&&board[i][1]!=' ');
		{
			return board[i][0];
		}
	}
	for (i = 0; i < row; i++)
	{
			if ((board[0][i] == board[1][i])&&(board[2][i]==board[1][i]) && board[1][i] != ' ')
			{
				return board[0][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];
	}
//一旦出現勝利,就返回勝利一方的棋子字符
	if (is_full(board,ROW,COL))
	{
		return 'Q';//平局返回'Q'
	}
	else
		return 'C';//什么情況都沒有就繼續(xù)游戲
}

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!

相關文章

  • C語言中fgets和fscanf區(qū)別詳解

    C語言中fgets和fscanf區(qū)別詳解

    這篇文章主要介紹了C語言中fgets和fscanf區(qū)別詳解的相關資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內容,需要的朋友可以參考下
    2017-10-10
  • C++數據結構AVL樹全面分析

    C++數據結構AVL樹全面分析

    今天的這一篇博客,我要跟大家介紹一顆樹——AVL樹,它也是一顆二叉搜索樹,它就是在二叉搜索樹中加了一個平衡因子的概念在里面,下面我就來和大家聊一聊這棵樹是個怎么樣的樹
    2021-10-10
  • 總結C語言中const關鍵字的使用

    總結C語言中const關鍵字的使用

    一起雖然學過c語言,但是并沒有寫過太多的代碼,最近想要拾起c語言,就寫了一些代碼,但是對const關鍵字比較陌生,這里總結一下,方法自己和大家有需要的時候參考借鑒,下面跟著小編一起學習學習吧。
    2016-11-11
  • LeetCode 單調棧內容小結

    LeetCode 單調棧內容小結

    這篇文章主要介紹了LeetCode 單調棧內容小結,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • C++引用的詳細解釋

    C++引用的詳細解釋

    以下是對C++中引用的使用進行了詳細的總結介紹,需要的朋友可以過來參考下,希望對大家有所幫助,希望能夠給你帶來幫助
    2021-11-11
  • FFmpeg獲取網絡攝像頭數據解碼

    FFmpeg獲取網絡攝像頭數據解碼

    這篇文章主要為大家詳細介紹了FFmpeg獲取網絡攝像頭數據解碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • C語言數組全面總結梳理

    C語言數組全面總結梳理

    在C語言和C++等語言中,數組元素全為指針變量的數組稱為指針數組,指針數組中的元素都必須具有相同的存儲類型、指向相同數據類型的指針變量。指針數組比較適合用來指向若干個字符串,使字符串處理更加方便、靈活
    2022-02-02
  • MFC列表控件CListCtrl使用方法示范

    MFC列表控件CListCtrl使用方法示范

    這篇文章主要介紹了MFC列表控件CListCtrl使用方法示范,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • 淺談c語言中轉義字符的用法及注意事項

    淺談c語言中轉義字符的用法及注意事項

    下面小編就為大家?guī)硪黄獪\談c語言中轉義字符的用法及注意事項。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • c++中ref的作用示例解析

    c++中ref的作用示例解析

    這篇文章主要為大家介紹了c++中ref的作用示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04

最新評論