IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 2021-09-23 -> 正文阅读

[游戏开发]2021-09-23

unity实现井字棋小游戏

前言

这是中山大学2021年3D游戏编程与设计的第一次作业

游戏简介

井字棋游戏,有pvp和pve两种模式供选择,并带有背景音乐

游戏截图

在这里插入图片描述

实现过程

Reset():
棋盘初始化函数,将棋盘所有格恢复为初始状态。

void Reset () {
		turn = 1;
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++) {
				Chessboard [i] [j] = 0;
			}
		}	
		audioSource.Play ();
	}

check():
用于判断游戏状态
行获胜

		for (int i = 0; i < 3; i++) {
			if (Chessboard[i][0] != 0 && Chessboard[i][0] == Chessboard[i][1] && Chessboard[i][1] == Chessboard[i][2]) {
				return Chessboard[i][0];
			}
		}

列获胜

		for (int i = 0; i < 3; i++) {
			if (Chessboard[0][i] != 0 && Chessboard[0][i] == Chessboard[1][i] && Chessboard[1][i] == Chessboard[2][i]) {
				return Chessboard[0][i];
			}
		}

斜线获胜

   	if (Chessboard[1][1] != 0 &&
   	    Chessboard[0][0]== Chessboard[1][1] && Chessboard[2][2] == Chessboard[1][1] ||
   	    Chessboard[0][2] == Chessboard[1][1] && Chessboard[2][0] == Chessboard[1][1]) {
   		return Chessboard[1][1];
   	}

对局继续

  	for (int i = 0; i < 3; ++i) {
  		for (int j = 0; j < 3; ++j) {
  			if (Chessboard[i][j] == 0) return 0;
  		}
  	}

平局

  	return 0;

pvp():
先绘制已经下好的棋子,再判断游戏是否结束,若没结束则根据turn的值进行本次点击,更改多维数组的值

	void pvp(){
		int result = check();
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++) {
				if (Chessboard [i][j] == 1)
					GUI.Button (new Rect (5 + 60 * i, 20 + 60*j, 60, 60), img1);
				if (Chessboard [i][j] == 2)
					GUI.Button (new Rect (5 + 60 * i, 20 + 60*j, 60, 60), img2);
				if (GUI.Button (new Rect (5 + 60 * i, 20 + 60*j, 60, 60), "")){
					/* 按下按钮,切换玩家*/
					if(result == 0){
						if (turn == 1){
							Chessboard[i][j] = 1;
							turn = 2;
						}
						else{
							Chessboard[i][j] = 2;
							turn = 1;
						}
					}
				}
			}
		}
	}

pve():
PVE对抗函数,逻辑与PVP相似,只是在AI回合时会调用AITurn()进行落子。

	void pve(){
		int result = check();
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++) {
				if (Chessboard [i][j] == 1)
					GUI.Button (new Rect (5 + 60 * i, 20 + 60*j, 60, 60), img1);
				if (Chessboard [i][j] == 2)
					GUI.Button (new Rect (5 + 60 * i, 20 + 60*j, 60, 60), img2);
				if (GUI.Button (new Rect (5 + 60 * i, 20 + 60*j, 60, 60), "")){
					/* 按下按钮,切换玩家*/
					if(result == 0){
						if (turn == 1){
							Chessboard[i][j] = 1;
							turn = 2;
						}
						else{
							ai_turn();
							turn = 1;
						}
					}
				}
			}
		}
	}

AITurn():
AI落子函数,在这个函数中AI会比较简单的选择局部最优的选择,选择逻辑如下。

  1. 能够获胜则直接落子
    对每个空白格进行检测,判断落子后是否可以获胜,若可以,则直接落子。

  2. 若不能获胜,且玩家已将军,则进行防守
    判断玩家是否将军,若将军,则记录应该防守的位置
    若所有空白格检测完毕后,不能获胜,则选择记下的位置进行落子。

  3. 如果既不能获胜,玩家也没有将军,则随机选择一个空白格
    在遍历时加入一个变量count,记录空白格的数量;一个多维数组ept[][],来记录空白格的位置

	void ai_turn() {
		//如果没有在运行中则不进行下一步
		if (check() != 0)
			return;
		//使用交错数组存储空白位置
		int[][] ept = new int[9][] {new int [2], new int [2],new int [2],new int [2],new int [2],new int [2],new int [2],new int [2],new int [2]};
		//分别代表将军的横纵zuobiao
		int lose_x = -1;
		int lose_y = -1;
		int count = 0;
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++) {
				if (Chessboard [i][j] == 0) {
					//判断是否能赢
					Chessboard [i][j] = 2;
					if (check () == 2)
						return;

					//判断是否被将军
					Chessboard [i][j] = 1;
					if (check () == 1) {
						lose_x = i;
						lose_y = j;
					}
					//恢复chessboard的值
					Chessboard [i][j] = 0;
					ept[i,j] = count;
					count++;
				}
			}
		}
		//若将军则落子
		if(lose_x != -1)
			Chessboard[lose_x][lose_y] = 2;
			return;

		//无法直接获胜也没被将军则随机在空白格落子
		int rd = (int)Random.Range(0, count);
		int i1 = ept[rd][0];
    	int j1 = ept[rd][1];
   		Chessboard[i1][j1] = 2; 

audiosource
设置AudioSource组件
首先选择Add component
在这里插入图片描述

而后选择Audio Sourse
在这里插入图片描述

最后选择素材就ok了~在这里插入图片描述

private void Awake() {
		audioSource= this.gameObject.GetComponent<AudioSource>();
		audioSource.loop = false;
		audioSource.volume = 1.0f;
		audioSource.clip = audio;
}

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-09-24 10:56:45  更:2021-09-24 10:57:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 4:32:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码