欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言實現(xiàn)井字棋詳解

 更新時間:2021年11月18日 11:59:44   作者:Xua3055  
這篇文章主要為大家介紹了C語言如何實現(xiàn)井字棋,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

1.主函數(shù)

這個代碼很長,我們可以把它全部寫在主函數(shù)里面。但是十分不推薦這么做。以后工作以后,很多時候我們負責(zé)的只是一個板塊,匯總時只需要主函數(shù)調(diào)用每個人寫的函數(shù)就能完成復(fù)雜項目。在這里我們先寫主函數(shù)。

#include<stdio.h>
#include<time.h>
#define ROW 3
#define COL 3
//這是對于行和列的初始化
int main()
{
test();
return 0;
}

2.menu菜單

菜單十分容易完成

void menu()
{
printf("輸入1開始游戲");
printf("輸入0開始游戲");
}

3.test函數(shù)

主函數(shù)中引用了test函數(shù),我們現(xiàn)在寫一個test函數(shù),返回類型void,選擇用do while循環(huán)來完成大部分函數(shù)

void text()
{
int input = 0;
srand((unsigned int)time(NULL));
do
 {
  switch(input)
  {
   case 1:
     game();
     break;
   case 2:
     printf("退出游戲\n");
     break;
   default:
     printf("選擇錯誤,請重新輸入\n");
     break;
  }
 }while(input);
}

4.game函數(shù)(1)

game函數(shù)內(nèi)部仍然需要引用許多函數(shù),對于一個三乘三的棋盤來說,有以下的步驟:

數(shù)據(jù)存儲到一個字符的二維數(shù)組中,玩家下棋是'*',電腦下棋是'#'數(shù)組的內(nèi)容應(yīng)該是全部空格

初始化棋牌

打印棋盤

下棋

4.1數(shù)據(jù)存儲的二維數(shù)組:InitBoard

這個函數(shù)的作用是把該二維數(shù)組全部初始化成為空格

void InitBoard(char arr[ROW][COL],int row,int col)
//這里的大寫的BOW COL是傳入的數(shù)組的值,小寫的bow col是新的行和列
{
 int i = 0;
 int j = 0;
 for(i = 0;i<row;i++)
 {
  for(j = 0;j<col;j++)
  {
   board[i][j] = ' ';
  }
 }
}

4.2棋盤的打?。篋isplayBoard

這個函數(shù)是把棋盤的形狀打印出來

void DisplayBoard(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("|");
			}
		}
		printf("\n");
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
					if (j < col - 1)
					{
						printf("|");
					}
			}
		}
		printf("\n");
	}
}

4.3玩家下棋:PlayerMove

先寫玩家下棋:思路是如果玩家輸入的地址原來為空格,那么就把這個位置重新定義為 *

void PlayerMove(char board[ROW][COL],int row,int col)
{
 printf("玩家下棋");
 int x = 0;
 int y = 0;
 while(1)
 {
   scanf("%d %d",&x,&y);
   if(x>=1&&x<=row&&y>=1&&y<=col)//防止輸入非法棋子位置
   {
     if(board[x-1][y-1] == ' ')//注意這里的x-1和y-1,玩家在輸入的時候輸入的假如是1 2,那么給電腦的值就是0 1,這么做是為了與二維數(shù)組的下標對應(yīng)
     {
       board[x-1][y-1] = '*';//注意這里只有一個等號?。?!與上面不同,這里是重新定義而上面是相等的時候
       break;
     }
     else
     {
       printf("該坐標被占用,請重新輸入\n");
     }
   }
   else
   {
    printf("輸入非法,請重新輸入");
   }
  }
}

4.4電腦下棋 :ComputerMove

再寫電腦下棋:思路是如果電腦輸入的地址原來為空格,那么就把這個位置重新定義為 #,只不過不同的是電腦輸入的x和y是用rand()%3設(shè)置出來的隨機值,所以我們還要在前面的test函數(shù)中放下srand的設(shè)置。

void ComputerMove(char board[ROW][COL],int row,int col)
{
 int x = 0;
 int y = 0;
 printf("電腦下棋\n");
 while(1)
 {
  x = rand()%ROW//此時ROW為3,即x等于0到2的隨機值
  y = rand()%COL//此時COL為3,即Y等于0到2的隨機值
  if(board[x][y] == '')
  {
    board[x][y] = '#';
    break;
  }
 }
}

4.5輸贏的判斷 ;Win

我們要有判斷輸贏的代碼,并且初始化一個值讓其接受返回值

玩家贏 - '*'
電腦贏 - '#'
平均 --- 'Q'
繼續(xù) ----'C'

char Win(char board[ROW][COL], int row, int col)
{
 int i = 0;
 for (i = 0; i < row; i++)//看一下橫著的/豎著的3個符號是否相等,返回一個值讓game()中的ret接收
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1]!='')
		{
			return board[i][1];
		}
	}
 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[1][1]!=' ')
		{
			return board[1][1];
		}
 if(1 == FULL(board,row,col))
 {
  return 'Q';//如果經(jīng)過FULL函數(shù)判定棋盤滿了那么返回一個Q讓ret接收,否則返回C
 }
  return 'C';
}

4.6平局的判定 :FULL

因為要返回值,所以這個函數(shù)用int類型存放數(shù)據(jù)

int 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;//返回值為0
      }
    }  
  }
  return 1;//如果棋盤滿了則返回1
}

5.game函數(shù)

現(xiàn)在可以把所有的函數(shù)引用了

void game()
{
	char board[ROW][COL] = {0};
	InitBoard(board, ROW, COL);
	DisplayBoard(board, ROW, COL);
	char ret = 0;//初始化ret,ret為前面說的那個返回值
    //判斷輸贏的代碼
    //玩家贏 - '*'
    //電腦贏 - '#'
    //平均 --- 'Q'
    //繼續(xù) ----'C'
	while (1)
	{
		PlayerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		ret = Win(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		ret = Win(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
	}
 if (ret == '*')//到這里才分別判定返回ret的所有值
	{
		printf("恭喜你你贏了!\n");
	}
	else if(ret == '#')
	{
		printf("很遺憾你輸了!\n");
	}
	else
	{
		printf("平局\n");
	}
	printf("\n");
}

總結(jié)

可以吧game.c和test.c分別當做兩個源文件,test.c中引用game.c,這樣代碼也會更加清晰。不管有多少函數(shù)需要引用,只需要寫出函數(shù)的本體再引用,這樣一個龐大的代碼就被我們拆分成了一段一段小代碼,難度也就沒那么大了。

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

相關(guān)文章

  • Ubuntu配置sublime text 3的c編譯環(huán)境的具體步驟

    Ubuntu配置sublime text 3的c編譯環(huán)境的具體步驟

    下面小編就為大家?guī)硪黄猆buntu配置sublime text 3的c編譯環(huán)境的具體步驟。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • C語言職工管理系統(tǒng)設(shè)計

    C語言職工管理系統(tǒng)設(shè)計

    這篇文章主要為大家分享了一份C語言職工管理系統(tǒng)設(shè)計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • C語言實現(xiàn)簡單的貪吃蛇小游戲

    C語言實現(xiàn)簡單的貪吃蛇小游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單的貪吃蛇小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • c++支持coroutine的簡單示例

    c++支持coroutine的簡單示例

    這篇文章主要介紹了c++支持coroutine的簡單示例,使用的是linux 平臺做的,需要的朋友可以參考下
    2014-03-03
  • opencv實現(xiàn)顏色檢測

    opencv實現(xiàn)顏色檢測

    這篇文章主要為大家詳細介紹了opencv實現(xiàn)顏色檢測,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • 使用Visual Studio進行動態(tài)鏈接庫開發(fā)流程

    使用Visual Studio進行動態(tài)鏈接庫開發(fā)流程

    這篇文章主要介紹了使用Visual Studio進行動態(tài)鏈接庫開發(fā)流程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • C語言高級教程之變長數(shù)組詳解

    C語言高級教程之變長數(shù)組詳解

    這篇文章主要介紹了C語言中變長數(shù)組的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • C++枚舉類型用法總結(jié)(枚舉字符常量代替常量)

    C++枚舉類型用法總結(jié)(枚舉字符常量代替常量)

    這篇文章主要介紹了C++枚舉類型用法總結(jié)(枚舉字符常量代替常量),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 詳解C++11中的線程鎖和條件變量

    詳解C++11中的線程鎖和條件變量

    C++ 11允許開發(fā)者們以標準的、不依賴于平臺的方式編寫多線程程序。這篇文章概述了標準庫對于線程和同步操作機制的支持。這些都是非常重要的知識,希望讀者們可以認真看一下
    2021-06-06
  • 淺析Boost智能指針:scoped_ptr shared_ptr weak_ptr

    淺析Boost智能指針:scoped_ptr shared_ptr weak_ptr

    雖然通過弱引用指針可以有效的解除循環(huán)引用,但這種方式必須在程序員能預(yù)見會出現(xiàn)循環(huán)引用的情況下才能使用,也可以是說這個僅僅是一種編譯期的解決方案,如果程序在運行過程中出現(xiàn)了循環(huán)引用,還是會造成內(nèi)存泄漏的
    2013-09-09

最新評論