1.系统框如下 java实现五子棋程序 可以实现人人对战 人机对战 简单功能 悔棋 认输
2.有什么介绍制作棋类游戏AI的游戏源码游戏源码书籍值得推荐?
3.UI设计师主要是做什么的呢?
系统框如下 java实现五子棋程序 可以实现人人对战 人机对战 简单功能 悔棋 认输
一、实验题目五子棋游戏。编程博弈编程博弈
二、人机人机问题分析
五子棋是游戏源码游戏源码双人博弈棋类益智游戏,由围棋演变而来,编程博弈编程博弈属纯策略型。人机人机虚拟化机器码源码棋盘通常*,游戏源码游戏源码即行,编程博弈编程博弈列,人机人机共个交叉点,游戏源码游戏源码即棋子落点;棋子由黑白两色组成,编程博弈编程博弈黑棋颗,人机人机白棋颗。游戏源码游戏源码游戏规则为黑先白后,编程博弈编程博弈谁先五子连成一条直线谁赢,人机人机其中直线可以是横的、纵的、度、度。
本次Java编程我的目的是现实人机对战,即游戏者一方是人,另一方计算机。这就要求程序不仅要具备五子棋的基本界面,还要编程指导计算机与人进行对弈。为了使程序尽可能智能,我采用了贪心策略、传统搜索算法、极大极小博弈树算法,对应游戏玩家的3个等级:简单、中等、困难。
三、功能设计
我的程序基本功能是实现人机对弈五子棋。人和电脑交替下棋,谁先五子连成一条直线谁就赢。下面是我程序的功能模块:
1.等级设置
核心功能是实现不同策略与算法的对比运用,纯贪心策略实现简单等级对手,直接搜索算法实现中等等级对手,极大极小博弈树算法实现困难等级对手。对应程序中的3选1单选按钮。
2.悔棋功能
模拟栈机制实现人悔棋,不限步长的悔棋。对应程序中的悔棋按钮。
3.棋面绘制
根据不同机计算机的屏幕分辨率,绘制逼真的棋盘。
4.引入
两张古典的人物,生动模拟对弈双方。人物旁的黑白棋钵显示黑白棋归属。
5.背景设置
支持用户选择背景,包括棋盘、棋盘边框、窗口边框,彰显个性。
6.音乐播放
下棋时有棋子落地的声音,一方胜利时有五子连成一片的声音。同时在设置背景时相应的改变整个对弈过程中的背景音乐。
7.时间显示
在棋盘正上方有一模拟文本框显示当前棋局用时。
8.其他小功能
支持和棋、认输、开启新游戏、退出游戏等操作。
四、数据结构与算法设计
数据结构部分
1.当前棋局的存储结构
我的五子棋程序选择通常用到的行*列棋盘,可以开二维数组PositionFlag = new int[][],PositionFlag[i][j]为0表示(i,j)点尚无棋,为1表示(i,j)点是人的棋子,为2表示(i,j)点是机器的棋子。之所以选择二维数组,主要原因有两点:
1.本程序需要频繁随机访问*的交叉点,对应查询该点状态以及改变该点状态,随机访问是数组的特点。
2.*=开二维数组的内存需求相对现在内存为2G及以上的计算机完全可以接受,且数组实现简单、操作方便。
基于以上两点,尽管创建动态的顺序表—链表可能可以节省少量内存(可以只存当前有棋的点,原数组对应位置为0的点可以不存),但选择数组的优势完全在上述两点体现了出来。
2.实现悔棋操作的数据结构
由于每次悔棋只需回退当前几步,后进先出原则,这正是栈这种典型数据结构的设计思想,于是我选择栈。我自己先写了用自定义数组模拟的源码8吧栈,但由于是学Java语言且由于悔棋的存储空间需要随当前步数增大而增大(由于每局最多下步,即最多要悔步,所以自己开个的数组完全可以避免存储空间自增长的问题且内存完全可以接受,之所以不用自定义数组而用ArrayList类主要是为了尝试Java中STL的用法),所有我最终改为用Java类库中的ArrayList类。
确定用ArrayList类实现栈机制后就必须考虑每个ArrayList单元具体存储什么。刚开始我存储的是当前的棋局,即整个局面,而每个局面对应一个二维数组,这样是很占用内存的。试想一下,在最坏情况下,个ArrayList单元,每个单元存放一个*的二维数组,尽管**在Java的内存管理机制下不会爆栈,但也是极不划算的。之所以说不划算,是因为有更好的解决方案。由于每次悔棋只是在回退倒数一步,多步悔棋只需循环回退,所以可以只存储当前棋局最后一步的下法,对应一个二维点,完全可以自定义一个二维坐标类chessOneStep。
算法设计部分
Java语言是面向对象的语言。我在进行五子棋游戏编程是总共传创建了个自定义的类。在编写程序的过程中,我有一个明显的体验就是面向对象编程就是一项有关对象设计和对象接口技术,很多关键的技术就是如何设计自定义的对象。
下面我先概括给出我的所有类的作用:
1.mainFrame类:主框架类,我应用程序的入口;
2.chessPositon类:主控类,这个类是我程序的核心类,负责控制双方的下棋,以及调用其他的类完成当前棋局的显示绘制;
3.chessPanel类:面板类,调用其他底层类完成当前棋局的显示绘制;
4.chessBoard类:棋盘绘制类,负责棋盘的绘制;
5.chessImage类:文件类,包含各种资源(背景、背景音乐)以及静态全局变量(public static Type);
6.chessButton类:组件类,定义各种组件,包括按钮、单选按钮、文本框等;
7.chessMusic类:音乐类,负责调用Java库类完成背景音乐、下棋音乐、取胜音乐等的播放;
8.chessPiece类:棋局类,定义棋局二维数组数据结构并完成相关操作;
9.chessList类:栈类,完成悔棋等操作;
. chessOneStep类:棋子类,定义每步坐标以及下在该处获得的估价值;
.myCompare类:排序类,完成chessOneStep类的自定义排序
详细设计
1.mainFrame类
作为我的五子棋程序的主类,mainFrame类主要实例化相关的对象,如chessbutton,chessborad等,从而完成框架的创建。更重要的是实例化chessposition,这是本程序的核心类,控制游戏双方行棋过程完成人机互动下棋,然后将MyChessPosition与鼠标响应addMouseListener()关联起来。
2.chessMusic类
一个好的游戏必须给人一种身临其境的感觉,而声音是营造这种氛围的重要因素。参照网上各游戏运行商的音乐配置,我选择相关逼真的声音。包括背景音乐、下棋棋子落到棋盘发出的声音以及一方胜出的配乐。所有这些功能的实现,依赖于自定义的chessMusic类,采用AudioInputStream配合Clip的方式完成音乐播放的软硬件工作,然后定义两个接口chessmusic(String Name)和Stop(),前者完成播放功能,后者完成关闭当前音乐功能。因为音频文件相对较大,而我的程序提供在不同背景乐之间切换的功能,所以在打开另一个音频文件之前必须关闭前一个正在播放的音频文件,防止出现溢出。
3.chessImage类
适当的动画或能给游戏玩家带来美的体验。所以我的五子棋程序界面在不失和谐的前提下引入了尽可能多的,包括对弈双方、棋钵等。引入的具体工作通过语句import javax.imageio.ImageIO完成。同时,由于要在用到它的类中被访问,为了避免频繁调用函数,我直接将相关联的对象定义为public static,表明是公用的、静态的。进一步引申开去,超级单源码我将程序中用到的静态全局变量都定义在chessImage类中。具体如下:
public static Date begin;//每局开始时间
public static Date cur;//每局结束时间
public static chessOneStep LineLeft;//结束端点1
public static chessOneStep LineRight;//结束端点2
public static boolean IsGameOver;//是否只有一方获胜
public static int ColorOfBackGround[][]= { { , , },{ 0,,},{ ,,}};//背景颜色
public static int ColorOfWindows[][]= { { ,,},{ ,,},{ ,,}};//背景颜色
public static int WitchMatch;//背景搭配
public static String MusicOfBackGround;//背景音乐
public static int CurrentStep;//记录当前步数
public static int Rank;//设置难度等级
public static boolean IsSurrender;//判断是否认输
public static boolean IsTie;//判断是否认输
public static String Message;//输出提示信息
public static Image IconImage;// 图标
public static Image blackBoard;//白棋盘
public static Image whiteBoard;//黑棋盘
public static Image blackChess;// 白棋棋子
public static Image whiteChess;// 白棋棋子
public static Image RightPlayer;//白棋棋罐
public static Image LeftPlayer;//白棋玩家头像
public static String path = "src/";// 的保存路径
4.chessButton类
这个是程序的组件类。定义了各种功能键,完善程序功能,营造逼真的人机对战游戏效果。分为3类:效果。。
(1)、按钮组件
本程序有5个按钮,支持和棋、认输、新游戏、退出、悔棋等。认输和和棋按钮终止当前的棋局,给出相应的提示信息;退出按钮调用系统System.exit(0)的函数正常返回;悔棋按钮调用后面要介绍的chessList类实现悔棋;新游戏按钮则刷新当前棋局准备下一轮,要将记录当前棋局的二维数组全部置0,刷新当前棋局开始时间等。
(2)、单选按钮组件
游戏界面支持设置个性化界面,包括背景颜色与背景音乐,跟重要的一点是设置难度(简单、中等、困难)。单选按钮只能多选一。背景颜色主要是存储相关颜色搭配方案的RGB颜色,开2维数组,即对应RGB3原色数组的一维数组,然后通过改变WitchMatch全局变量的值来有用户自己选择颜色搭配,不同的颜色搭配对应不同的背景音乐表达一致的主题。难度设置主要是改变计算机的下棋算法,不同难度通过Rank判断进入不同的程序分支,实现不同智能等级的计算机下棋水平。
(3)、文本框
在不同的单选按钮前添加相应的文本框,提示用户可以实现的功能。同时我用颜色模拟出显示当前棋局耗用时间的文本框。
不论按钮还是单选按钮都要关联相应的消息,把相应功能的实现放在消息响应处理函数理。这些主要是实现Java库提供的消息响应接口里的方法。
5.chessPiece类
主要完成当前棋面的存储,存储棋面的数据结构为二维数组int[][] PositionFlag;然后定义获取、设置某点以及整个棋面的状态的方法。
(1)、SetPositionFlag(int x, int y, int flag)//设置(x,y)处的状态为flag
(2)、GetPositionFlag(int x, int y)//获取(x,y)处的状态
(3)、SetAllFlag(int [][]NewFlag)//设置当前整个棋面的状态为NewFlag
(4)、GetAllFlag()//获取当前整个棋面的状态
(5)、DrawChessPiece(Graphics g)//绘制当前局面的棋子
由于本类比较重要,所以附上了代码,见源代码1。
6.chessBoard类
功能为绘制棋盘线。由于围棋的棋盘比较复杂,横线、竖线较多,且为了使棋盘美观,还要自定义窗口边框、棋盘边框、对弈双方边框等,对线宽、线型也有一定要求。有时要单像素线条,有时要多像素线条。对于多像素线条,我主要用了2种方法。
方法一:
在需要绘制多像素线条处首先绘制一条单像素线,然后根据线宽要求上下平移适当像素达到绘制多像素的目的。这样的方法适合绘制水平线或竖直线,绘制其他斜率的线条容易造成走样。在没有想到比较好的反走样编程思想后我选择了调用Java库中已经封装好的函数。
方法二:
为了克服方法一绘制非水平或竖直线时造成的走样,同时也为了更进一步学习Java语言,我猜想肯定会有类似OpenGL中设置线宽的画刷,于是上网百度找到了相应的画刷Stroke类。通过Java库实现绘制不同线宽的直线,达到了反走样效果。
7.chessOneStep类
这个类是为了配合chessList类实现悔棋以及在计算机下棋算法实现返回有效状态点而设计的。主要数据成员为
private int x,y,weight;//其中x,y表示点坐标,weight表示将棋下到该点获得的估价值。
主要方法如下:
(1)、GetX()//获得当前对象的x坐标
(2)、GetY()//获得当前对象的emlog商城源码y坐标
(3)、GetWeight()//获得当前对象的(x,y)处的估价值
8.chessList类
程序支持悔棋功能,为了实现悔棋,自定义了chessList类。这个类主要通过引入java.util.ArrayList和java.util.List实现集合的数据类型。然后自定义一些方法,如下:
(1)、AddStep(chessOneStep OneStep)//添加一步棋到List中
(2)、GetSize()//获得当前List的大小
(3)、ClearList()//清空List
(4)、RemoveLast()//删去List中的最后元素
由于每次删除当前List中的最后一个元素,实现后进先出,所以可以模拟栈的功能实现悔棋。
9.myCompare类
由于在计算机下棋的极大极小博弈树算法中需要对自定义对象chessOneStep按weight进行排序,所以引入了myCompare类,通过实现Comparator接口中的compare方法完成自定义对象排序。
.chessPanel类
程序的自定义面板类,主要负责完成当前框架内容的显示。这是一个重要的与框架和图形显示密切相关的类。主要数据成员为
private chessboard MyChessBoard;//当前显示棋盘
private chesspiece MyChessPiece;//当前显示整个棋面的状态
主要方法如下:
(1)、chesspanel(chessboard MyChessBoard1, chesspiece MyChessPiece1)//构造函数,分别用MyChessBoard1和MyChessPiece1初始化MyChessBoard和MyChessPiece
(2)display(chessboard MyChessBoard1, chesspiece MyChessPiece1)//自定义显示回调函数,调用repaint()完成重新绘制游戏界面
(3)、paintComponent(Graphics g)//核心方法,调用各种函数完成具体的绘制工作
.chessPositon类
程序算法核心类,总的功能是控制人和计算机轮流下棋,以及调用chessPanel类中的display(chessboard , chesspiece )方法完成界面的实时刷新。关于chessPositon类,我在此将重点介绍。chessPosition类的主要数据成员如下:
private static chessboard MyChessBoard;//当前显示棋盘
public static chesspiece MyChessPiece;//当前显示整个棋面的状态
private static chesspanel Mychesspanel;////当前显示面板
public static chesslist MyChessList=new chesslist();//当前下棋集合,用于悔棋
final private static int INF = (1 << ); // 表示正无穷大的常量,用于极大极小博弈数搜索算法
public static boolean CanGo;//控制当前下棋一方
类的设计集中体现在成员方法的设计上。实现人机对战,只有语言是远远不够的,还要加入算法,用算法引导计算机下棋。下面介绍该类的方法成员:
(1)、chessposition(chesspanel , chessboard ,chesspiece ) //带有参数的构造函数
(2)、chessposition()
不带参数的构造函数
(3)、mouseClicked(MouseEvent event)
鼠标响应函数,负责人的下棋,根据鼠标点击的位置转换得到所在棋盘的相对位置。如果该位置不合法,即超出棋盘有效范围,点击无响应;如果该位置上已有棋,弹出消息框给出提示。这二者都要求重新给出下棋位置,即当前鼠标响应无效…直到点击到棋盘有效区域。
(4)、IsOver(int[][] Array,int x,int y)
判断当前int[][]Array对应的棋局是否结束,即一方五子连成一条直线。此处有两种思路,一种对当前棋面上的所有棋子都进行一次判断,具体为水平方向、竖直方向、与水平线成度方向、与水平线成度方向,只要有一个方向五子连成一条直线就说明有一方获胜,游戏结束;另一种思路为只在当前下棋的4个方向进行判断,我的程序采用的是第二种,所以IsOver方法除了int[][]Array参数外,还有x,y参数,(x,y)表示当前下棋的坐标点。
(5)display()
通过调用自定义面板类的显示回调函数用于重新显示游戏界面,达到每下一步棋及时更新游戏界面的目的。
(6)、GetValue(int flag, int num)
估值函数,根据经验把棋局分成只有1颗棋相连,2颗棋相连且两端被封死,2颗棋相连且一端封死另一端活的,2颗棋相连且两端都是活的,同理3颗棋、4颗棋也各自可分3种情况。不同的情况对应不同的估价值。估价值的设定是决定计算机一方是否智能的一个关键因素。
(7)、GetPredictValue(int flag, int num)
对未连成一片但通过再下一颗子就能连成一片的局面进行估值,这在双方下棋的有限步骤内是能产生重要影响的。如果每局棋仅考虑当前一步,是不可取的。
(8)、Evaluate(int[][] Array, int x, int y)
根据棋面具体情况以及预先设定的估值函数,对某个点对应的nodered源码分析局面进行评估。由于每次双方只能下一颗棋,所以可以每次取当前局面的所有点中对应估值最大值点的估值作为整个局面的估值。
(9)、GetGreedNext()
计算机下棋方法1,对应难度等级为简单,采用贪心思想。每次下棋前在求得最有利点下棋,而是否最有利只是通过一步评估。算法伪码描述为:
Max取负无穷大
for(行i从0到)
{
For(列j从0到)
{
If((i,j)对应的位置无棋)
{
a.假设放上一颗由人控制的棋,求估价值;
b.假设放上一颗由计算机控制的棋,求估价值;
c.取二者中较大值作为(i,j)处的估价值tmp;
d.取tmp与Max较大值赋值给Max.
}
}
}
最终Max对应的点就是当前整个局面中最大的估值点。至于上述为什么要考虑双方都在该点下棋的情况呢?主要原因为下五子棋是个攻防兼备的过程,不仅要考虑自己对自己最有利,还要考虑对对手最不利,通俗来讲就是在自己赢的时候不能让对手先赢。
()、GetSearchNext(int LookLength)
derectSearch(int [][]Array,boolean who,int deepth)
计算机下棋方法2:直接搜索法,对应难度等级为中等。
每步棋最多有个不同下法,若采用直接搜索法则对应的孩子节点有个(在下棋过程中会逐渐减少),即每层有最多个节点待扩展,这就决定了直接搜索进行不超过2次—主要原因有两点:
a.采用深度优先搜索需要递归,递归中状态过多可能会爆栈,我们知道递归是用栈机制来实现的;采用宽度优先搜索又需要存储为扩展的节点,这对内存容量要求很高。
b.不管深搜还是广搜,在时间复杂度为O(N^m)的情况下都是不能接受的。其中N为当前棋局的待扩展节点,最大;m为搜索的深度。
综上所述,在采用直接搜索法时搜索深度不能太深,严格来说是应该控制在2层以内,在计算机运算速度在^7次每秒的情况下,理论和实验都表明超过2层就会变得很慢且这种趋势成指数级增长。
直接搜索算法伪代码为
GetSearch(boolean flag,int deep)
{
如果deep等于0,返回当前棋局估值;
for(行i从0到)
{
For(列j从0到)
{
If((i,j)对应的位置无棋)
{
如果轮到计算机下棋,置标志位为2
GetSearch(!flag,deep-1);
如果轮到人下棋,置标志位为1;
GetSearch(!flag,deep-1);
}
}
}
}
()、GetMinMaxsearchNext(int LookLength)
MinMaxsearch(int [][]Array,boolean who, int deepth)
计算机下棋算法3:极大极小博弈树法,对应难度等级为困难。五子棋是个博弈游戏,当前在寻找对自己最有利的下棋点时要尽可能保证对对手最不利,这种思想可以用极大极小博弈树
有什么介绍制作棋类游戏AI的书籍值得推荐?
棋类游戏AI的范围还是挺广的,这里推荐一本讲解象棋和五子棋游戏的书籍《PC游戏编程》,这是王小春著作的一本书,里面讲的基本上是中国象棋人机博弈和五子棋人机博弈方面的内容,里面的算法结构相当经典,你可以仔细研究研究。
UI设计师主要是做什么的呢?
UI即User Interface(用户界面)的简称。UI设计则是指对软件的人机交互、操作逻辑、界面美观的整体设计。好的UI设计不仅是让软件变得有个性有品味,还要让软件的操作变得舒适、简单、自由,充分体现软件的定位和特点。 UI 其实是 user interface 的缩写,含义是用户界面,维丅基百科上对UI是这么定义的:A user interface is the system by which people (users) interact with a machine. The user interfaceincludes hardware (physical) and software (logical) components. Generally, the goal of human-machineinteraction engineering is to produce a user interface which makes it easy, efficient, enjoyable to operate a machine in the way which produces the desired result. This generally means that the operator needs to provide minimal input to achieve the desired output, and also that the machineminimizes undesired outputs to the human. 用户界面是一个人机交互系统,它包括硬件(物理层面)和软件(逻辑层面)两方面。一般来说,人机交互工程的目标是打造一个让用户操作简单、便捷的界面。所以也就是说,UI 指的不是简单的用户和界面,还包括用户和界面的交互。那么作为 UI 设计师,要做的就不只是设计出美观的界面,还要设计出让用户用起来舒服、操作简单的界面。 网页技术按照传统的分类来说,分为设计和开发两部分,英语中叫做 web design 和 web development,UI 设计师既然叫设计,肯定是属于design 里面的,而设计一般还分为前端设计和后端设计,前端叫做 front-end, 后端叫做 back-end。简单的打个比方,就是前端负责画蓝图、后端负责盖高楼,而UI设计师,就是属于前端设计的。 这两个解释我都觉得拿到现 在已经不是很完整了。作为一个UI设计师,你不能局限在前端设计里,并非你只是设计楼的样子而不盖楼,甚至于怎么盖楼,都是你要全程监控的。试想,你的伟大设计由于一个拙劣的施工队而走了样,变了形,只能怪你监管不力,不用去埋怨施工队。当然,前提是你有这个权利去寻找一只有能力的施工队伍。寻找施工队的任务也是你要了解的,如果你只懂得大放厥辞,挥毫泼墨,丝毫不考虑施工队伍的感受,那你也会变成众矢之的。 比如你设计了一个相当绚丽和牛逼的界面或者人机交互功能,结果因为技术无法实现而破产,那你怪谁,只能说你无知和不考虑现实。
下面看看UI设计师的岗位职责: 1.制定MRD(Market Requirements Document).
市场需求文档。获得项目发起部门的认同后,产品进入实施,需要先出MRD,具体来说要有更细致的市场与竞争对手分析,通过哪些功能来实现商业目的,功能/非功能需求分哪几块,功能的优先级等等。实际工作中,这个阶段PD可能的产出物有Mind Manager的思维图,Excel的Feature List等。 2.制定PRD(Product Requirements Document).
产品需求文档。进步一细化,这部分是PM写得最多的内容,也就是传统意义上的需求分析,我们这里主要指UC(use case)文档。主要内容有,功能使用的具体描述(每个UC一般有用例简述、行为者、前置条件、后置条件、UI描述、流程/子流程/分支流程,等几大 块),Visio做的功能点业务流程,界面的说明,demo等。Demo方面,可能dreamweaver、ps甚至画图板简单画一下,有时候也会有 UI/UE支持,出高保真的demo,开发将来可以直接用的那种。 3.用户分析报告
搜集相关资料分析目标用户的使用特征、情感、习惯、心里、需求等,提出用户研究报告和可用性设计建议。这部分工作也可和团队配合完成。时间与项目需求允许的情况下,更可以制定实景用户分析。 4.产品架构设计
这里涉及到比较多的界面交互与流程的设计,根据可用性分析结果制定交互方式、操作与跳转流程、结构、布局、信息和其他元素。 以上是UI设计师需要掌握跟进的,从这里开始就真的是你的任务了5.产品原型设计
就是将页面模块、元素进行粗放式的排版和布局,深入一些,还会加入一些交互性的元素,使其更加具体、形象和生动。整个系统的流程设计也是UI设计师的,为此你要经常浏览大量的网站,亲身体验,积累经典的,很具亲和力的、友好的系统流程,你要考虑到整个系统的任何一个最 终环节。这才是UI设计师工作量最大,难度最高的部分。比如说,用户注册流程,成功了去哪,失败了去哪,成功了后续有几个流程,每个流程还包含哪些对象等等等等 6.界面UI设计
如果很倾向于图形界面设计,这儿是你最喜欢的部分。但一定要结合循环讨论过的分析结果做设计,否则你的作品很难被人信服。色调、风格、界面、窗口、图标、皮肤的表现是本环节的关键。 7.界面输出
这方面主要由页面工程师与前端程序员配合,将界面代码化。作为UI设计师,最能符合你的设计的基础作品,当然还是出自你自己的双手,为此你要懂得切图,做静态页,那么SHTML和样式表还有为了实现你那伟大设计的种种特效的JS代码,你能不会么你可以不去亲自做,但你一定要有一个规范设计,你的施工队必须在你的培训和领导下完全符合规范的去操作,就像架构师一样。 8.分析使用者报告,做出完善调整.
多部门共同参与的,包括可用性的循环研究、用户体验回馈、测试回馈。同时,UI人员也应该把一些可行性建议进行完善。很多设计师做了东西不喜欢改,这是一个大忌。 9.整个项目的SEO优化设计。
但就目前许多公司而言,拿到UI设计师手里的,就是一份什么说明都没有的VISO图,这给许多UI设计师造成一种错觉,觉得我只需要做效果图就可以了,对于 其他环节一概不理,导致了在设计产品界面的时候,因为掌握的信息不足,设计出来的界面全凭个人喜好,但是当面对用户的时候,却是一点竞争力都没有.我认为UI设计师在项目初始,就应该加入其中.包括了解项目的市场定位,盈利模式,竞争对手等等,而通过分析竞争对手用户界面,可以给UI设计师一个初步的 图形概念,而通过参与用户调研,用户分析能够获取到用户特征,年龄,需求,喜好等方面的信息,这些方面的信息,在风格定位,把握上起到至关重要的作用.通 过了解产品架构,知道什么功能应该做,什么功能应该突出,在参与了以上工作的制定后,相信许多UI设计师对自己所要设计的产品,已经是信心十足了吧.后期 在通过分析使用者报告,用户反馈等方面信息,做出界面上的调整,这样一来,一个完善的产品就可以面市了,而这个产品,再也不是一个全凭UI设计师个人喜好 所设计出来的产品了..
那么作为UI设计师都需要具备什么样的能力呢? UI设计从工作内容上来说分为3个方向。它主要是由UI研究的3个因素决定的,其分别是研究工具,研究人与界面的关系,研究人。 研究界面----图形设计师Graphic UI designer国内目前大部分UI工作者都是从事这个行业。也有人称之为美工,但实际上不是单纯意义上的美术工人,而是软件产品的产品外形设计师。
这些设计师大多是美术院校毕业的,其中大部分是有美术设计教育背景,例如工业外形设计,装潢设计,信息多媒体设计等。研究人与界面的关系---交互设计师,interaction designer在图形界面产生之前,长期以来UI设计师就是指交互设计师。交互设计师的工作内容就是设计软件的操作流程,树状结构,软件的结构与操作规范(spec)等。一个软件产品在编码之前需要作的就是交互设计,并且确立交互模型,交互规范。交互设计师一般都是软件工程师背景居多。 研究人----用户测试/研究工程师User experience engineer任何的产品为了保证质量都需要测试,软件的编码需要测试,自然UI设计也需要被测试。这个测试和编码没有任何关系,主要是测试交互设计的合理性以及图形设 计的美观性。测试方法一般都是采用焦点小组,用目标用户问卷的形式来衡量UI设计的合理性。这个职位很重要,如果没有这个职位,UI设计的好坏只能凭借设 计师的经验或者领导的审美来评判,这样就会给企业带来严重的风险性。 用户研究工程师一般是心理学人文学背景比较合适。
综上所述UI设计师就是:软件图形设计师、交互设计师和用户研究工程师。这一职位的真正含义:ui设计师绝不是美工(或者说绝不是仅仅做“美化”工作而已),ui设计师是一个技术岗位而非艺术岗位,如果考察一名ui设计师的能力素质模型,那么他应该同时具备4个维度的能力:
1、 沟通和文档撰写能力:如果说ui是人与机器交互的桥梁和纽带,那么ui设计师就是软件设计开发人员和最终用户时间交互的桥梁和纽带,如果ui设计师不能具 备很好的沟通和理解能力,不能撰写出优秀的指导性原则和规范,那么,他将无法体现出自己对于开发人员和客户的双重价值,也无法完成他的本职工作。
2、 过硬的技术能力:你可以不会写java,但你绝对不可以不清楚java是什么,他能够实现什么。即使你不能写代码,但你起码要懂得如何去“实现”。举个例子,你要做一个grid控件,首先,你应该清楚,到底有哪几种数据格式,以及其存储方式:既可以通过html的mark来获取数据,亦可以通过json对 象或array,又或者是xml甚至于字符串。其次,你要知道在server端实现和在client端实现到底哪个更适合当前的环境。这些都要依靠过硬对 技术和丰富的经验,不懂技术的ui设计师,既做不出合理的设计,也不可能和开发人员做到有效的沟通。简言之,ui设计师起码要精通主流的表现层开发技术 (如果是做web表现层,一般需要精通html、css、java script 、xml技术,甚至jsp、java也要达到工作层),对于市面主流的设计 模式,技术路线以及开源框架都要有足够的了解。可以说,ui设计师在技术素质能力方面,要尽可能的朝着“表现层架构师”的方向去努力。 3、图形设计能力和原型开发:ui设计师一生中从事的最多的工作应该就是图形和 原型设计,那么,首先说说什么是原型设计。原型法是迭代式开发中设计阶段常用的手段,原型设计应该贯穿需求、概要设计和详细设计这三个阶段。开发原型的目 的是,把设计转为用户可以看懂的“界面语言”,同时也对开发人员起到一定的指导作用(甚至可以作为开发的一部分)。用户界面原型更显示的价值体现就是,它可以帮助软件设计人员提早发现设计各个阶段的缺陷,在开发前解决这些潜在的问题,大幅降低软件开发的风险和成本。这与传统的瀑布式开发有了本质的区别,目前国内大多数公司仍然采用的是瀑布式开发方式,并且将ui设计放在开发阶段的后期来进行。这不仅使ui设计师无法充分发挥自己所长,只能做做“美化工作” 亡羊补牢,更使得开发出的产品往往存在致命的设计缺陷而无法满足客户需求。所以,各公司中的“美工”是软件开发方法的落后和不完善早就的,而非“美工”或 ui设计师这个职业本身。我们再来说一下图形设计能力,其实,ui设计师只是个泛称,在ui设计行业内部,还大致分为以下几种角色:可用性和交互设计师、 视觉企划、用户体验研究人员、图形用户界面设计师等。大家通常理解的ui设计师,其实是gui设计师(例如国内的rokey,他就是一名非常优秀的gui 设计师,目前供职于microsoft),gui设计师的主要工作就是视觉定位以及创作。稍后的章节会详细介绍gui设计师的职责以及日常工作。如果ui 设计师不具备过硬的图形创作能力,那么,他根本无法表达他心目中的美,也就无从谈起“交流”了。图形设计能力,是每一名ui设计师最初具备的,最基础的能力。也是最能够衡量一名ui设计师能力水平的部分。
4、人因学理论和认知心理学:这个概念虽然有些大,但却是每一名ui设计师在事业稳固后毕生都要努力去探索的领域、可以说,设计的根本就是“人”,做人本 的界面,自然需要了解人,了解人的行为。例如,你不可能设计这样一个界面,在同一时间同一个界面上的不同位置显示两条重要的提示信息——因为,人,在同一 时间的关注点只能由一个,这是生理决定的,而不是某个人的主观臆断。再举个例子,为什么windows每次一次版本升级或多或少都会找到以前的影子,你可 能会说,这是microsoft的设计风格。不,那不是风格,而是一种习惯,以前是microsoft的习惯,现在,你用了windows,那么,你也有 了这种习惯。apple和microsoft的操作系统孰优孰劣?答丅案是,随你喜欢。是啊,多么简单的一个道理——喜欢,喜欢是一种习惯,你又如何能笃 定你认为的“正确”的设计恰好是人们所喜欢的呢?这里可以稍带提一下extjs,ext的风格,简言之,就是桌面应用的传统交互风格(wmip),而web的风格是什么?如果要我来说,我更倾向于web是一本翻开的杂志,一片展现设计师才华的热土,为什么这样说呢?因为web的不确定和开放性。以我的经验而言,webui设计,是所有软件ui设计领域中最困难的,也是限制最多的(往往这些限制还存在不确定性),一名优秀的 webui设计师,即使转而做桌面程序ui设计或移动设备界面设计,也是相对比较容易成功的。因此,作为webui设计师,排斥桌面ui风格是可以理解的,正是源自于他的习惯,他的“喜欢”。 5、具备高层次的审美能力,空间思维能力,逻辑能力以及一定的文学修养,保持一颗年轻的心,不要掉入自己挖的模式里,创意永不枯竭。 至此,大家应该大概了解了什么是ui设计和ui设计师这两个名字的内在含义。关于“美工”的问题,也应该有了自己的结论,我就不再做解释了。再说一个题外 话:ui设计师在我目前供职的公司的职位体系中是比较高的技术职位,相当于高级软件工程师,需要有3年以上行业经验方能胜任;而资深ui设计师是与软件设 计师平级的,他们共同的上层职位是架构师。这跟某些公司所招收的“美工”是有很大区别的。 给大家点信心,看看国内UI设计师的前景 UI设计在中国的现状 目前在国内UI还是一个相对陌生的词,即便是洛可可设计也在UI设计的道路上不断探索客户及用户的需求。我们经常看到一些招聘广告写着:招聘界面美工、界 面美术设计师等等。这表明在国内对UI的理解还停留在美术设计方面,认为UI的工作只是描边画线,缺乏对用户交互的重要性的理解;另一方面在软件开发过程 中还存在重技术而不重应用的现象。许多商家认为软件产品的核心是技术,而UI仅仅是次要的辅助,这点在人员的比例与待遇上可以表现出来。 但这不是UI设计真正的价值体现,只是UI设计发展的一个必经过程。我们以物质产品手机行业为例,手机刚刚进入市场的时候不但价格贵的惊人,而且除了通 话以外没有什么其他功能。由于当时的主导是技术,所以大家都把精力放在信号、待机时间、寿命等方面,对于产品的造型,使用的合理性很少关心。事过境迁,如 今技术已经完全的达到用户的需求,于是商家为了创造卖点,提高争力,非常重视产品的外观设计,除此之外还频频推出短信,彩屏,和铉,彩信,摄像头等等。这 样一来产品的美观、个性、易用、易学、人性化等等都成了产品的卖点。软件产品与物质产品的发展是相同的。过去由于计算机硬件的限制,编码设计成为软件开发 的代名词,美观亲和的图形化界面与合理易用的交互方式都没有得到充分的重视,实际上这个时期的软件叫作软件程序,而不是软件产品。 现今随着计算机硬件的飞速发展,过去的软件程序已经不能适应用户的要求。软件产品在激烈的市场竞争中,仅仅有强大的功能是远远不够的,不足以战胜强劲的对 手。幸运的是在国内一些高瞻远瞩的民族企业已经开始意识到UI给软件产品带来的巨大卖点了,例如金山公司的影霸、词霸、毒霸、网标,由于重视UI的开发与 地位,才使得金山产品在同类软件产品中首屈一指。联想软件的UI部门积极开展用户研究与使用性测试,将易用与美观相结合,推出的双模式电脑、幸福系列等成 功UI范例,为联想赢得全球消费 PC第三的称号等等、等等.实践证明,各商家要在产品美观和易用设计方面很小投入,将会有很大产出。其投入产出比,要比在功能领先性开发上的投入大得多。 我们不得不承认现阶段中国在很多领域都与西方发达国家有相当大的差距,如何赶上并超过他们是我们这代人肩负的历史使命。软件产品领域不象物质产品那样存在 工艺、材料上的限制,软件产品核心问题就是人。提高软件UI设计师个人能力减小人员上的差距是中国UI发展首要关键的问题。目前国内各院校还没有设立相对健全的UI设计专业,所以提高UI设计师能力关键在于提供一个良好的学习与交流的资源环境。国内已经有很多交流设计网站,介绍工业设计、平面设计、服装设计、绘画艺术、多媒体flash等,但是UI设计一直没有受到应有的关注,仅仅被放在数码设计或者平面网页设计的一个栏目里,这仅有的资源对培养优秀的设计师是不够的,必须有一个信息快捷、资源丰富、设计水平一流、专业权威的UI设计学习与交流的地方才能适应日益发展的UI 设计师们的需求。