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

Unity3D實現(xiàn)簡易五子棋源碼

 更新時間:2019年09月17日 09:48:49   投稿:lijiao  
這篇文章主要為大家詳細介紹了Unity3D實現(xiàn)簡易五子棋源碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Unity3d簡易五子棋源碼,供大家參考,具體內容如下

Unity3d部分

對C#源碼進行了改寫簡化:

using UnityEngine;
using System.Collections;

public class chess : MonoBehaviour
{
  //四個錨點位置,用于計算棋子落點
  public GameObject LeftTop;
  public GameObject RightTop;
  public GameObject LeftBottom;
  public GameObject RightBottom;
  //主攝像機
  public Camera cam;
  //錨點在屏幕上的映射位置
  Vector3 LTPos;
  Vector3 RTPos;
  Vector3 LBPos;
  Vector3 RBPos;

  Vector3 PointPos;//當前點選的位置
  float gridWidth = 1; //棋盤網格寬度
  float gridHeight = 1; //棋盤網格高度
  float minGridDis; //網格寬和高中較小的一個
  Vector2[,] chessPos; //存儲棋盤上所有可以落子的位置
  int[,] chessState; //存儲棋盤位置上的落子狀態(tài)
  enum turn { black, white };
  turn chessTurn; //落子順序
  public Texture2D white; //白棋子
  public Texture2D black; //黑棋子
  public Texture2D blackWin; //白子獲勝提示圖
  public Texture2D whiteWin; //黑子獲勝提示圖
  int winner = 0; //獲勝方,1為黑子,-1為白子
  bool isPlaying = true; //是否處于對弈狀態(tài)

  void Start()
  {
    chessPos = new Vector2[15, 15];
    chessState = new int[17, 16];/*原來定義是new int[15, 15],這里將原來數(shù)組chessState上、下和右邊各加一排數(shù)據,
    也就相當于在棋盤的上、下和右邊各填加一排隱形的棋道。原因后面解釋*/
    chessTurn = turn.black;

    //計算錨點位置
    LTPos = cam.WorldToScreenPoint(LeftTop.transform.position);
    RTPos = cam.WorldToScreenPoint(RightTop.transform.position);
    LBPos = cam.WorldToScreenPoint(LeftBottom.transform.position);
    RBPos = cam.WorldToScreenPoint(RightBottom.transform.position);

    //計算網格寬度
    gridWidth = (RTPos.x - LTPos.x) / 14;
    gridHeight = (LTPos.y - LBPos.y) / 14;
    minGridDis = gridWidth < gridHeight ? gridWidth : gridHeight;

    //計算落子點位置
    for (int i = 0; i < 15; i++)
    {
      for (int j = 0; j < 15; j++)
      {
        chessPos[i, j] = new Vector2(LBPos.x + gridWidth * j, LBPos.y + gridHeight * i);//這里和源程序定義稍有不同,這里i定位行,j為列
      }
    }
  }

  void Update()
  {
    //檢測鼠標輸入并確定落子狀態(tài)
    if (isPlaying && Input.GetMouseButtonDown(0))
    {
      PointPos = Input.mousePosition;
      for (int i = 0; i < 15; i++)
      {
        for (int j = 0; j < 15; j++)
        {
          //找到最接近鼠標點擊位置的落子點,如果空則落子
          if (Dis(PointPos, chessPos[i, j]) < minGridDis / 2 && chessState[i + 1, j] == 0)/*這里chessState行要加1,
            因為上、下和右邊各多加了一排,要空出來,chessPos的i行對應chessState的i+1行*/
          {
            //根據下棋順序確定落子顏色
            chessState[i + 1, j] = chessTurn == turn.black ? 1 : -1;//同理
            //落子成功,更換下棋順序
            chessTurn = chessTurn == turn.black ? turn.white : turn.black;
          }
        }
      }
      //調用判斷函數(shù),確定是否有獲勝方
      int re = result();
      if (re == 1)
      {
        Debug.Log("黑棋勝");
        winner = 1;
        isPlaying = false;
      }
      else if (re == -1)
      {
        Debug.Log("白棋勝");
        winner = -1;
        isPlaying = false;
      }
    }
    //按下空格重新開始游戲
    if (Input.GetKeyDown(KeyCode.Space))
    {
      for (int i = 0; i < 15; i++)
      {
        for (int j = 0; j < 15; j++)
        {
          chessState[i + 1, j] = 0;//同理
        }
      }
      isPlaying = true;
      chessTurn = turn.black;
      winner = 0;
    }
  }
  //計算平面距離函數(shù)
  float Dis(Vector3 mPos, Vector2 gridPos)
  {
    return Mathf.Sqrt(Mathf.Pow(mPos.x - gridPos.x, 2) + Mathf.Pow(mPos.y - gridPos.y, 2));
  }

  void OnGUI()
  {
    //繪制棋子
    for (int i = 0; i < 15; i++)
    {
      for (int j = 0; j < 15; j++)
      {
        if (chessState[i + 1, j] == 1)//同理
        {
          GUI.DrawTexture(new Rect(chessPos[i, j].x - gridWidth / 2, Screen.height - chessPos[i, j].y - gridHeight / 2, gridWidth, gridHeight), black);
        }
        if (chessState[i + 1, j] == -1)//同理
        {
          GUI.DrawTexture(new Rect(chessPos[i, j].x - gridWidth / 2, Screen.height - chessPos[i, j].y - gridHeight / 2, gridWidth, gridHeight), white);
        }
      }
    }
    //根據獲勝狀態(tài),彈出相應的勝利圖片
    if (winner == 1)
    {
      GUI.DrawTexture(new Rect(Screen.width * 0.25f, Screen.height * 0.25f, Screen.width * 0.5f, Screen.height * 0.25f), blackWin);
    }
    if (winner == -1)
      GUI.DrawTexture(new Rect(Screen.width * 0.25f, Screen.height * 0.25f, Screen.width * 0.5f, Screen.height * 0.25f), whiteWin);
  }
 //改寫result函數(shù)
 /*解釋:C語言中,這樣的表達式:chessState[i]&&chessState[i+1]&&chessState[i+2]&&chessState[i+3]&&chessState[i+4],如果
   * chessState[i]為False,則不管B是真是假或者是異常都不會運行,利用這一點,在chessState的右邊、上邊和下邊各加一行為0的數(shù)據,
   * 這樣在判斷連續(xù)五個棋子的狀態(tài)時,就不用擔心chessState數(shù)組的索引值超出范圍。例如:chessState[i+4]的索引值i+4剛好超出范圍,
   * 通過在原來數(shù)組chessState的上、下和右邊個添加一排為0的數(shù),這樣chessState[i+3]==0,于是就可以避免引起異常,從而簡化代碼*/
  int result()
  {
    int flag = 0;
    if (chessTurn == turn.white)
    {
      for (int i = 1; i <= 15; i++)//這里的i從1開始
      {
        for (int j = 0; j <= 14; j++)//j不用變
        {
          if ((chessState[i, j] == 1 && chessState[i, j + 1] == 1 && chessState[i, j + 2] == 1 && chessState[i, j + 3] == 1 && chessState[i, j + 4] == 1)//向右橫向
            || (chessState[i, j] == 1 && chessState[i + 1, j] == 1 && chessState[i + 2, j] == 1 && chessState[i + 3, j] == 1 && chessState[i + 4, j] == 1)//向上橫向
            || (chessState[i, j] == 1 && chessState[i + 1, j + 1] == 1 && chessState[i + 2, j + 2] == 1 && chessState[i + 3, j + 3] == 1 && chessState[i + 4, j + 4] == 1)//向右上斜向
            || (chessState[i, j] == 1 && chessState[i - 1, j + 1] == 1 && chessState[i - 2, j + 2] == 1 && chessState[i - 3, j + 3] == 1 && chessState[i - 4, j + 4] == 1))//向右下斜向
          {
            flag = 1;
          }
        }
      }
    }
    else if (chessTurn == turn.black)
    {
      for (int i = 1; i <= 15; i++)//這里的i從1開始
      {
        for (int j = 0; j <= 14; j++)
        {

          if ((chessState[i, j] == -1 && chessState[i, j + 1] == -1 && chessState[i, j + 2] == -1 && chessState[i, j + 3] == -1 && chessState[i, j + 4] == -1)
            || (chessState[i, j] == -1 && chessState[i + 1, j] == -1 && chessState[i + 2, j] == -1 && chessState[i + 3, j] == -1 && chessState[i + 4, j] == -1)
            || (chessState[i, j] == -1 && chessState[i + 1, j + 1] == -1 && chessState[i + 2, j + 2] == -1 && chessState[i + 3, j + 3] == -1 && chessState[i + 4, j + 4] == -1)
            || (chessState[i, j] == -1 && chessState[i - 1, j + 1] == -1 && chessState[i - 2, j + 2] == -1 && chessState[i - 3, j + 3] == -1 && chessState[i - 4, j + 4] == -1))
          {
            flag = -1;
          }
        }
      }
    }
    return flag;
  }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 淺談C#數(shù)組(一)

    淺談C#數(shù)組(一)

    本篇文章小編要得大家介紹的是C#數(shù)組,數(shù)組是一種數(shù)據結構,它可以包含同一個類型的多個元素,如果需要使用同一類型的多個對象,可以使用數(shù)組和集合,需要的朋友可以參考下面文章的具體內容
    2021-09-09
  • C#枚舉數(shù)值與名稱的轉換實例分享

    C#枚舉數(shù)值與名稱的轉換實例分享

    在應用枚舉的時候,時常需要將枚舉和數(shù)值相互轉換的情況。有時候還需要轉換成相應的中文。下面介紹一種方法
    2013-08-08
  • C#滾動字幕的實現(xiàn)方法

    C#滾動字幕的實現(xiàn)方法

    這篇文章主要介紹了C#滾動字幕的實現(xiàn)方法,主要講述了Graphics.DrawString函數(shù)的應用方法,非常具有實用價值,需要的朋友可以參考下
    2014-10-10
  • 解決Unity urp級聯(lián)陰影接縫問題

    解決Unity urp級聯(lián)陰影接縫問題

    通過從unity內部函數(shù)中抽幾個出來改造,強制取某個裁切球的級聯(lián)陰影映射,通過案例給大家詳細介紹,文中給出了完整的urp shader代碼,對Unity級聯(lián)陰影知識感興趣的朋友一起看看吧
    2021-06-06
  • C#結合JS實現(xiàn)HtmlTable動態(tài)添加行并保存到數(shù)據庫的流程步驟

    C#結合JS實現(xiàn)HtmlTable動態(tài)添加行并保存到數(shù)據庫的流程步驟

    在 Web 應用項目中,實現(xiàn)一對多錄入的數(shù)據管理功能是一項常見的應用,因此可以實現(xiàn)一個相對輕量化的設計實現(xiàn)表格的錄入,為保證功能的可用性、界面友好性,本文給大家介紹了C#結合JS實現(xiàn)HtmlTable動態(tài)添加行并保存到數(shù)據庫,需要的朋友可以參考下
    2024-12-12
  • C# 使用CancellationTokenSource取消多線程

    C# 使用CancellationTokenSource取消多線程

    有時間我們在使用多線程的時候,需要取消線程的執(zhí)行,可以使用CancellationTokenSource來取消對Task開辟多線程的取消,感興趣的可以了解一下
    2021-08-08
  • C#實現(xiàn)Json轉DataTable并導出Excel的方法示例

    C#實現(xiàn)Json轉DataTable并導出Excel的方法示例

    這篇文章主要介紹了C#實現(xiàn)Json轉DataTable并導出Excel的方法,結合實例形式總結分析了Json轉換DataTable,以及DataTable導出Excel相關操作技巧,需要的朋友可以參考下
    2019-02-02
  • C#實現(xiàn)延時并自動關閉MessageBox的方法

    C#實現(xiàn)延時并自動關閉MessageBox的方法

    這篇文章主要介紹了C#實現(xiàn)延時并自動關閉MessageBox的方法,非常實用的功能,需要的朋友可以參考下
    2014-08-08
  • C#實現(xiàn)日期操作類DateTime的方法示例

    C#實現(xiàn)日期操作類DateTime的方法示例

    C#中日期和時間操作主要通過System.DateTime類實現(xiàn),提供了創(chuàng)建、格式化、比較和計算等功能,下面就來具體介紹一下,感興趣的可以了解一下
    2025-03-03
  • C#對圖片進行馬賽克處理可控制模糊程度的實現(xiàn)代碼

    C#對圖片進行馬賽克處理可控制模糊程度的實現(xiàn)代碼

    本文通過實例代碼給大家介紹了C#對圖片進行馬賽克處理可控制模糊程度的實現(xiàn)方法,代碼超簡單,具有一定的參考借鑒價值,感興趣的朋友跟隨腳本之家小編一起學習吧
    2018-05-05

最新評論

台中县| 嘉荫县| 沁源县| 武义县| 克什克腾旗| 从化市| 常山县| 县级市| 洛扎县| 蕲春县| 板桥市| 横峰县| 阜新| 东丰县| 盐源县| 兴和县| 曲靖市| 石家庄市| 平塘县| 安国市| 乡宁县| 英德市| 敖汉旗| 云和县| 南阳市| 璧山县| 罗平县| 琼海市| 千阳县| 梅河口市| 金坛市| 临泉县| 鸡泽县| 两当县| 宣汉县| 扶风县| 沙坪坝区| 玉林市| 荥阳市| 福州市| 寻甸|