计算机学院关于游戏软件专业申请开设游戏原画师方向的报告0

计算机学院关于游戏软件专业申请开设游戏美术方向的报告

一、游戏原画方向市场人才需求分析

游戏原画是当前国家大力发展的文化产业之一,目前国内各地有许多企业从事游戏产品的研发。游戏美术不仅是软件科学学科,同时也是一门艺术学科,目前市场上对游戏原画师的需求旺盛,对于视觉艺术人才的需求量很高,而很多院校的计算机专业在以往的人才培养规划中没有涉及这个专业,游戏美术人才及为缺泛,由此看来这是一种很有发展前途的专业方向。(以下为“前程无忧”招聘网站对游戏美术人才的需求。)

上图可见市场对游戏美术人才的需求量,也足以证明美术在游戏软件行业中的重要性。

二、培养目标

游戏原画方向主要面向湖北省及周边地区,服务于游戏行业,培养拥护党的基本路线,适应游戏开发第一线需要,具有良好的职业道德和敬业精神,既掌握游戏美术设计基本理论知识,又熟悉相关的计算机软件操作及多媒体制作;同时具有较强的审美能力、设计能力和实际操作能力,能从事游戏设计制作行业和电脑游戏行业的概念设计师、三维动画师、三维模型制作工作的高素质技能型人才。

三、培养要求

游戏原画方向将根据动漫游戏公司人才的实际需求,在课程设置上,从基础的二维设计,循序过渡到功能强大的三维动画设计软件的学习。通过系统全面学习3D道具、场景设计、角色设计、特效制作等各内容模块,让学生熟悉掌握动漫游戏公司项目开发的整体流程和应用技能。运用所学知识分析和解决实际问题,注重动手能力。掌握动画设计、动画技法、动画制作的基本理论和基本技能。毕业生具备较高的艺术鉴赏能力和动画片设计和制作技能,能在游戏、动画、数字传媒等领域中从事研究、创意设计、制作开发等工作。

毕业生应获得以下几方面的知识和能力:

(一)掌握计算机系统的基本理论、基本知识及基本操作技能;

(二)掌握绘画基本功、创意设计及表现,具备良好的艺术修养;

(三)掌握游戏美术设计与制作的基本理论知识和制作技术,能熟练地运用各种制作软件和设备制作游戏美术项目;

(四)熟悉游戏美术行业发展规律,掌握市场调查和营销策划方法,能准确把握消费者心理;

(五)具有较强的观察分析能力、动手能力和动画艺术创新能力,并具有良好的团队协作能力;

(六)能协作完成游戏制作行业的概念设计,工作模块协调与组织;

(七)掌握文献检索的基本方法,具有一定的文献查找和撰写论文、参与学术交流的能力;

(八)具有本专业必备的英语知识和基本应用能力。

四、培养模式

按照游戏产业的职业特点和人才要求,根据“工作室化”教学模式培养游戏人才的要求,设计构建具有游戏专业教学特色的,以工作项目任务引领,虚拟和真实、加工和原创相辅相成的教学内容和方法,多方位提高学生专业技能和职业素养的项目包课程体系。

五、主要课程

1、素描

通过扎实的素描基础训练,了解设计素描基本知识,学习明暗、结构和造型的基本原理,培养学生整体观察和立体传达的设计造型能力,使学生掌握构图、透视、明暗等设计素描的基本知识和表现技法。培养良好的艺术审美观和正确理解自然、生活的艺术素质,培养其对绘画艺术的热爱。 

2、色彩 

色彩是美术创作的基础课。通过学习色彩的研究和训练,能够正确观察色彩,从整体出发,用比较方法区别色彩的倾向,表现色彩关系,在色彩实践训练中掌握色彩调配规律、色彩对比规律、色彩塑造形体、表现立体空间的能力。提高审美能力的同时培养训练在色彩方面动手和动脑的能力,培养在设计中从事色彩创造活动,并具有发展潜力的人才。

3、游戏角色设计

游戏角色是游戏的精髓。本课程目的是让学生开阔思维,熟悉不同角色的绘制方法的同时能使作品有一定创意,符合市场需求。通过讲解艺用人体解剖基础,让学生了解人体结构比例。主要学习人物速写、人物素描、游戏人物色彩、游戏人物造型设计(结构分析,配件设计)。要求学生在学习后能从事有关角色设定的相关工作。

4、透视与游戏场景设计     

透视与游戏场景设计是游戏动画设计与制作专业的专业主干课程。本课程学习各种透视方法,掌握透视原理,把原理带入场景中,加强场景的空间感,使学生能够比较快地绘制出所需的场景,能正确地处理人景关系。

5、Photoshop图像处理      

学习计算机图象处理技术,了解数字图象的合成技术,讲授Photoshop  CS的基本概念、基础操作、使用环境、浮动窗口以及如何使用Photoshop CS的工具箱、通道、图层等工具和技术来创建并编辑图形图像。可以辅助产品效果图的后期处理,润色,调节效果图制作中的不足之处,完善产品效果图的制作。

6、数字绘画     

本课程是电脑美术造型设计基础的深入,研究电脑美术设计的系统性,整体性,产品与环境的关系,产品与市场的关系等。通过本门课程的学习,学生能了解数字绘画、素材收集与电脑表现,场景设计与周边环境的关系。同时,学生具备设计合作的能力和团队精神。

7、计算机平面设计

平面设计课程主要讲授logo设计、字体设计、色彩设计、段落版式,图文混排等的方法与程序。通过这些基本概念的学习与实践,使学生能够独立设计出游戏主题相关的内容模块,为整个游戏软件服务。

8、3D软件  

计算机3D软件的应用,主要3dmax,maya等完成3D软件造型的设计制作,学习这一系列软件对于游戏美术造型设计的三维效果图表现非常有帮助,它包含了所有的建模功能,用它建模感觉非常流畅,所以大家经常用它来建模,然后导出高精度模型给其他动漫游戏作品使用。

9、次世代角色制作 

运用三维软件制作次世代游戏人物、怪物、场景、道具等模型和贴图。

10、游戏外延产品设计与制作    

游戏的推广有很大程度上是宣传的作用,而游戏外延产品(如游戏角色玩偶)在宣传上起到了很大的功效。本课程主要讲解游戏角色外延产品的设计方法与制作流程以及常用的产品材料在材料的质感、性能、加工工艺特点等对整个产品外观的影响。学生通过本门课程的学习,在设计中能充分考虑和利用材料的特性,材料的加工工艺特点,提高设计的科学性和合理性。

六、主要实践性教学环节

1、手绘游戏原画(包含角色、场景、道具)

学生在任课教师指导下,应用课堂教学所掌握的素描描绘知识,

根据给定课题要求,由任务分析开始经总体设计(人物设计、道具设计、动物设计、怪物设计、场景设计等)完成一个游戏项目角色开发的整个过程;使学生具备基本造型对象的比例、透视、特征的控制和表现能力。

2、游戏场景制作实训     

操作三维工具和菜单命令的能力;具备调整面片、改变材质、控制渲染效果的能力、

具备根据原画创作游戏场景的能力,以较为接近真实的三维效果展现出来。并能掌握场景的比例关系和空间关系。

3、游戏角色制作实训   

学生在任课教师指导下,应用课堂教学所掌握绘图知识,根据给定课题要求,把握好角色造型比例关系,使用三维工具按照特定标准建模造型训练、贴图和材质设定训练、灯光和渲染训练。

4、游戏界面设计     

学生在任课教师指导下, 围绕操作使用界面设计制作工具和视频特效制作工具的能力,具备界面视觉元素和热键编排的能力;具备制作游戏关卡过渡视频的基本戏界面设计的方法与程序。

5、游戏外延产品制作

学生在教师指导下,培养学生从设计和构造的角度出发按照游戏产品的制作流程,根据材料特点设计和制作游戏外延产品的基本能力;具备游戏宣传视频短片的设计和制作能力。

6、毕业实习

学生在完成课堂教学后,深入到相关企、事业单位毕业实习,在有关专业人员指导下,完成对实习单位的游戏产品设计过程和制作流程的了解,培养适应社会的能力,并写出实习报告。

            鉴于此,我们拟在游戏软件专业下设置:游戏原画方向,主要招收艺术类学生。

                    

                            特此申请!

                                                  计算机技术与软件工程学院

                                                        2012.11.30

 

第二篇:计算机游戏编程报告

计算机游戏编程报告

计算机游戏编程报告

系 (院): 计算机科学学院 专业班级: 计科***班

姓 名: **************** 指导教师: 严** 设计地点: 4教2号机房

目 录

一、概述...................................................................................3

二、制作说明书......................................................................4

三、游戏说明书......................................................................6

四、用户指南...........................................................................6

五、代码分析...........................................................................9

六、游戏短评..........................................................................18

2

一.概述 五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋之一。发展于日本,流行于欧美。容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富有哲理有助于修身养性。

1. 简介

传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为15×15,棋子放置于棋盘线交叉点上。两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。

2. 起源 五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。在上古的神话传说中有“女娲造人,伏羲做棋”一说,《增山海经》中记载:“休舆之山有石焉,名曰帝台之棋,五色而文状鹑卵。”李善注引三国魏邯郸淳《艺经》中曰:“棋局,纵横各十七道,合二百八十九道,白黑棋子,各一百五十枚”。这段虽没明讲是何种棋类,但至少知道远古就以漂亮的石头为棋子。因而规则简单的五子棋也可能出自当时,并是用石子作棋子。亦有传说,五子棋最初流行于少数民族地区,以后渐渐演变成围棋并在炎黄子孙后代中遍及开来。 在古代,五子棋棋具虽然与围棋相类同,但是下法却是完全不同的。正如《辞海》中所言,五子棋是“棋类游戏,棋具与围棋相同,两人对局,轮流下子,先将五子连成一行者为胜”。

3. 发展

随着五子棋的发展,逐步发现先行优势非常大,最后得出“先行必胜”。五子棋要成为竞技运动,核心问题是怎样解决传统五子棋下法中“先行必胜”的问题。

“竞技五子棋”就是参赛双方以棋盘和棋子为介体,进行智力性对抗的竞技体育项目。

“交换”思维.“交换”思维有个形象的比喻:一个人切蛋糕,一个人选蛋 3

糕。即:一人开局,另一人选择黑方还是白方。此方法最为公平、最有效率,且最为简洁实用。不过此方法使开局者不走已知的必胜,把棋艺的较量演化为对局者开局的博弈,而“先行必胜”依然存在。如:欧洲的Swap2、Swap1;中国的Swap3、第一手交换规则等。

“禁手”思维 禁止以某种手段取胜。为了平衡先后手之间的差距,削弱先手优势,日本连珠提出“禁手”。后来连珠的发展证明禁手并不能平衡先后手之间的差距,依然是“先行必胜”。

“泡沫”原理 像泡沫一样会破灭。如“吃子”五子棋。连成5个后消失,同时拿掉对方一个棋子,自己再补一子。此原理的的特点是:把五子棋金球制改成了“进球制”,同时也最大效率地利用了棋盘和棋子,带来了全新的思维。问题是怎样计算胜负。

“井字游戏”原理 井字游戏又叫圈叉棋,圈叉棋是和棋,原因是空间很小。通过缩小棋盘来抑制五子棋先行的优势。如:15路棋盘,13路棋盘等等。问题是多大的棋盘才能是和棋,知道和棋后还能成为竞技运动吗。

“跷跷板”原理 五子棋始终是先行领先一子。如果双方轮流领先一子呢? 台湾教授发明的六子棋,就如“跷跷板”一样。先行先下一子,然后双方轮流下两子,先连成6子者胜利。六子棋为第11届奥林匹亚计算机游戏程序竞赛项目,验证其公平性与复杂性。

由于传统五子棋具有不公平性,而现代五子棋禁手规则令一部分棋手望而怯步.于是产生了职业制传统五子棋,职业制传统五子棋虽然准备麻烦,但胜在简单公平,而且难度增加,久而习之,思维活跃.

4.游戏类型

此游戏不仅是一款休闲类的小游戏,更是一款开发智力与学习如和布局的一款智力游戏。

二.制作说明书

1. 制作团队描述

本小组的成员有:** ** **

4

2. 目标玩家

各类棋牌爱好者;

适合比较闲的人玩,由于本游戏是一款比较休闲的小游戏,容易打发时间;

比较适合一些小孩子玩,五子棋不仅是一款休闲的小游戏,它还是一款需要智力,谋略的小游戏。小孩子从小玩这个,不仅可以培养一个兴趣爱好,还可以帮助他们开发智力并且教他们开拓思维,做事不能只看眼前要有长远打算; 还比较适合一些老年人玩,人在上了年纪后,就比较少的用脑,因此很多老年人容易得老年痴呆症,因此玩这款智力游戏可以减缓他们脑力的衰老。

3.制作工具介绍

Visual C++是Microsoft C/C++ 7.0之后推出的新一代程序开发工具,它不仅继承C++的特性,同时具备可视化程序语言(Visual Programming Language)及程序产生器的概念。既然是面向对象语言,当然会提供系统基础类给程序员再使用(Reuse)。在Visual C++ 中,延袭Microsoft C/C++7.0的作法,将原有的SDK函数重新封装在适当的类中,构造了“基础类函数库(Microsoft Foundation Class Library,简称MFC)”,它提供了许多现成的框架对象,可供在使用Visual C++设计应用程序是使用。此外,还提供“ClassWizard”与“AppWizard”可帮助构造基本的程序框架,从软件再使用的技术观点而言,已由SDK函数库方式经过面向对象程序设计方式进展到自动产生模板相关类程序代码方式(Framework)。

面向对象的程序设计是一种新型的程序设计方法,计算机环境本身就是一个对象的集合体,对象彼此之间通过消息相互作用,面向对象的程序设计提高了程序的模块化和可维护性。面向对象的程序设计有几个特点及优点。首先,由于对象包含属性和方法,因此支持模块化程序设计,而模块化程序设计支持开发的便利性及代码的可维护性。

Visual C++ 6.0是Microsoft公司推出的功能最强大、最复杂的语言产品之一,它是目前为止在Windows环境下进行大型软件开发的首选。其具有如下特点:

(1)Visual C+ + 的语法符合ANSL C+ + 标准,并在此基础上针对Windows 5

操作系统增加了一些语句;

(2)集成了MFC(Microsoft Foundation Class)类库,MFC封装了Windows API函数和消息,使程序员可以使用MFC高效率地开发各种应用程序;

(3)提供了MFC AppWizard,可方便地生成程序框架;

(4)提供了基于MFC的ClassWizard,通过它可以轻松地完成对各种MFC类的使用与维护。

Visual C++ 6.0作为Visual Studio家族中的一员,是Microsoft公司以C++语言为基础开发的可视化集成开发工具,与其他编程语言Visual Basic 6.0、Visual ForPro等一起,成为广大程序员喜爱的开发平台。

三.游戏说明书

1.游戏优点

???? 五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。

2.游戏操作特性

游戏的操作方法是,玩家用鼠标点击棋盘上的某个坐标进行走棋,由玩家1和玩家2轮流走棋,知道一方获胜。

四.用户指南

1.游戏操作简述

进入游戏后,首先点击“开始“图标,在跳出的对话框中填写玩家的性息后就可以游戏了,玩家1一黑棋开始,玩家2为白棋,玩家用鼠标点击棋盘上的某个坐标进行走棋。如果某个玩家走错棋想悔棋时,可以点击左上角的”悔棋“图 6

标。当某一方率先形成5个连子获胜是,游戏会跳出对话框提示。想要再来一局,可以在点击”开始“图标。通过点击”英雄榜“图标,可以查看玩家的胜负情况。

2.游戏截图

①进入游戏界面

计算机游戏编程报告

②开始游戏

计算机游戏编程报告

7

③悔棋

计算机游戏编程报告

④游戏结束

计算机游戏编程报告

8

五.代码分析

1. 程序类视图

计算机游戏编程报告

9

计算机游戏编程报告

计算机游戏编程报告

10

2.主要类说明

此项目有4个主要的类:CMainFrame,Chess,CProgramsView,Managers。 ① CMainFrame: 主框架窗口,它包含工具条,状态栏和文档框架窗口;

② Chess: 描述棋子的类,其type属性为1表示白棋,为0表示黑棋;

③ CProgramsView: 对游戏窗体界面的初始化,窗体重画,加载位图,显示玩家当前状态等;

④ Managers: 游戏规则的实现过程,是项目的核心部分,它包括:初始化棋盘,消息响应,游戏状态更新,增加新棋子到棋盘,求连子个数,判断棋子是否形成禁手,悔棋等。

3.程序的具体实现

① 初始化游戏

* 函数名称:GameStart()

* 函数介绍:初始化游戏

void Managers::GameStart()

{

} int x,y; for(x=0;x<15;x++) for(y=0;y<15;y++) map[x][y]=-1; nKeyDown=0;//设置下子为下了0颗子 PAUSE=false;//游戏没有暂停 if(Gameinfo%10 ==0 || Gameinfo%100 ==10)//如果本地用户是黑 则先走 else Game_State=2; LastCh.type=-1; Game_State=1;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ② 消息响应

* 函数名称:DoMSG( CPiont pt //传入坐标

int action) //行为

* 函数介绍:消息响应

* 输入参数:action含义 0为鼠标经过 1为按下左键 2为按下右件

* 输出参数:bool

* 返回值 :true 表示响应成功 false为失败

bool Managers::DoMsg(int x,int y, int action)

{

if(Game_State >2 || Game_State <1)

return false;

11

}

if(action==2)//右件响应为没有任何反应 { } if(action==0) { } return false; if (x==LastCh.x && y==LastCh.y) { } map[x][y]+=100; LastCh.x=x; LastCh.y=y; LastCh.type=map[x][y]; return true; map[LastCh.x][LastCh.y]=LastCh.type-100; return false; if(LastCh.type>=99) //在游戏状态让Player1下棋或 人-人 对战时才能响应走棋 if( { } LastCh.x=x; LastCh.y=y; LastCh.type=map[x][y]+100; return true; ((Gameinfo%100)/10 == 0 || Game_State==1) && AddChess(x,y))//按左键走下棋子 return false; if(action==1)//左件响应落子

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ③ 游戏状态更新

* 函数名称:Updata()

* 函数介绍:游戏状态更新

bool Managers::Updata()

{

int k;//暂存更新后的游戏状态 k=CheckState();//检查状态改变 if(k==0) { Game_State = Game_State % 2 + 1; if(nKeyDown>=225) {

12

} } Game_State=5; PAUSE=true;

} //Game_State为3表示游戏结束 else if(k<0)//黑输了 { } else if(k>0)//黑赢了 { } return true; Game_State=3; PAUSE=true; Game_State=4; PAUSE=true;

bool Managers::CheckMap(int x,int y,int pow)

{

} if(map[x][y]==pow || map[x][y]==pow+100 || map[x][y]==pow-100) return true; return false;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ④ 增加新棋子到棋盘

* 函数名称:AddChess(int x,int y,int tpye)

* 函数介绍:增加新棋子到棋盘

* 输入参数:(x,y)一组坐标 type表明是黑棋还是白棋

* 输出参数:bool

* 返回值 :true 表示响应成功 false为失败

bool Managers::AddChess(int x, int y)

{

if(CheckMap(x,y,-1)) { } map[x][y]=nChessinfo[nKeyDown].type+100; if(nKeyDown>0) map[nChessinfo[nKeyDown-1].x][nChessinfo[nKeyDown-1].y]-=100; nChessinfo[nKeyDown].x=x; nChessinfo[nKeyDown].y=y; nKeyDown++; Updata();

13

}

else return false; return true;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ⑤ 检查状态

* 函数名称:CheckState()

* 函数介绍:检查状态

* 输入参数:无

* 输出参数:int

* 返回值 :0为游戏继续 负数白色赢,正数为黑色赢

int Managers::CheckState()

{

int n;//分别记录连子个数

Chess k;//记录棋子的变量

int i,j;//5个循环变量

bool check;

check=false;

k=GetLastChe();//得到最后一颗下的棋子

if(k.type==1)//白子情况 检测4个方向

{

for(i=-1;i<=0;i++)

for(j=-1;j<=1;j++)

if((i!=0 || j!=0) && (i!=0 || j!=1))

{

n=GetNum(k,i,j,false)+GetNum(k,-i,-j,false)+1;//此方向上的连子个数 if(n>=5)

return -1;//白色胜利 返回-1

}

}

else //黑子的情况

{

for(i=-1;i<=0;i++)

for(j=-1;j<=1;j++)

if((i!=0 || j!=0) && (i!=0 || j!=1))

{

n=GetNum(k,i,j,false)+GetNum(k,-i,-j,false)+1;//此方向上的连子个数 if(n==5)

return 1;//黑色胜利 返回1

}

if(Gameinfo/100 == 0)

return 0;

14

} } if(ForbidLoc(k))//禁手和 5连同时形成判胜利,所以先判断是否5连 return -1; return 0;//什么改变也没有 返回0

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ⑥ 求连子个数

* 函数名称:GetNum(Chess nCh,int i, int j,bool goon)

* 函数介绍:求连子个数

* 输入参数:nCh 要求的棋子 i j为一组方向 goon是一个开关表示是否计算断开连接点 * 输出参数:int

* 返回值 :连子数

int Managers::GetNum(Chess nCh,int i, int j,bool goon)

{

} int t,x,y; x=nCh.x+i; y=nCh.y+j; t=0;//t记录连子个数 if (nCh.type>=99) { } if(goon && CheckMap(x,y,-1) && x>=0 && y>=0 && x<15 && y < 15 && { } return t; Chess nc; nc.type=nCh.type; nc.x=x; nc.y=y; x=GetNum(nc,i,j,false); if (x!=0) t+=x+100;//加上100用于区别是否有间断,这个在追踪是否有阻拦时用到 x+=i; y+=j; t++; nCh.type-=100; while(x>=0 && y>=0 && x<15 && y < 15 && CheckMap(x,y,nCh.type)) CheckMap(x+i,y+j,nCh.type))//计算断开的接点问题

15

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ⑦ 判断棋子k是否形成禁手

* 函数名称:ForbidLoc(Chess k)

* 函数介绍:判断棋子k是否形成禁手

* 输入参数:k 需要判断的棋子

* 输出参数:bool

* 返回值 :形成返回true,否则返回false

bool Managers::ForbidLoc(Chess k)

{

t1=GetNum(k,i,j,false); t2=GetNum(k,-i,-j,false); //判断实连子数,确定是否形成长连禁手 if(t1+t2+1>5) return true; t1=GetNum(k,i,j,false); t2=GetNum(k,-i,-j,true); n=n1%100+n2%100+1;//求总连子数 if(n%100==4)//判断是否构成双4 { if(!CheckMap(k.x+i*(n1%100+1+n1/100),k.y+j*(n1+1),-1) && goto checkk;//如果4个棋子两边都被堵死则决不可能是双4 int i,j,l,m;//循环变量 int n1,n2,n3,n4,n; int t1,t2,t3,t4;//记录 //由于黑子先走 不能走双3 双4 以及4、3、3 所以判断相对复杂 for(i=-1;i<=0;i++) for(j=-1;j<=1;j++) if((i!=0 || j!=0) && (j!=1 || i!=0)) { n1=GetNum(k,i,j,true); n2=GetNum(k,-i,-j,false); reCheck://重新判断 由于两边取舍的不同 !CheckMap(k.x-i*(n2%100+1+n2/100),k.y-j*(n2%100+1+n2/100),-1)) //但由于由于有4、3、3禁手的存在 所有如果没构成双4的 也要判断是否同时for(m=-1;m<=0;m++) for(l=-1;l<=1;l++) if((m!=i || l!=j) && (l!=1 || m!=0) && (m!=0 || l!=0)) { n3=GetNum(k,m,l,true); n4=GetNum(k,-m,-l,false); t3=GetNum(k,m,l,false); t4=GetNum(k,-m,-l,true); 构成双3

16

reCheck44: if(n3%100+n4%100+1 == 4 &&

(CheckMap(k.x+m*(n3%100+1+n3/100),k.y+l*(n3%100+1+n3/100),-1) ||

CheckMap(k.x-m*(n4%100+1+n4/100),k.y-l*(n4%100+1+n4/100),-1)))

return true;//到此 双4成立

if(n3!=t3 || n4!=t4)

{

n3=t3;

n4=t4;

goto reCheck44;

}

}

}

else if(n%100==3)//判断是否构成双3

{

if(!CheckMap(k.x+i*(n1%100+1+n1/100),k.y+j*(n1%100+1+n1/100),-1)|| !CheckMap(k.x-i*(n2%100+1+n2/100),k.y-j*(n2%100+1+n2/100),-1))

goto checkk;//如果3个棋子任意一边被堵死则决不可能是双3 for(m=-1;m<=0;m++)

for(l=-1;l<=1;l++)

if((m!=i || l!=j) && (l!=1 || m!=0) && (m!=0 || l!=0)) {

n3=GetNum(k,m,l,true);

n4=GetNum(k,-m,-l,false);

t3=GetNum(k,m,l,false);

t4=GetNum(k,-m,-l,true);

reCheck33:

if(n3%100+n4%100+1 == 3 &&

CheckMap(k.x+m*(n3%100+1+n3/100),k.y+l*(n3%100+1),-1) &&

CheckMap(k.x-m*(n4%100+1+n4/100),k.y-l*(n4%100+1+n4/100),-1))

return true;//到此 双3成立

if(n3!=t3 || n4!=t4)

{

n3=t3;

n4=t4;

goto reCheck33;

}

}

}

checkk:

if(t1!=n1 || t2!=n2)//如果两边取舍不同造成结果不一致 则用新值重新判断 {

n1=t1;

n2=t2;

17

} } } goto reCheck; return false;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ⑧ 悔棋

* 函数名称:GameBack(int steps)

* 函数介绍:悔棋

* 输入参数:悔棋的步数,默认为2

* 输出参数:bool

* 返回值 :是否悔棋成功 对不满足的返回false 否则是true

bool Managers::GameBack(int steps)

{

}

if(nKeyDown<steps) int k; nKeyDown-=steps; for(k=nKeyDown;k<nKeyDown+steps;k++) { } return true; Game_State = Game_State%2 +1;//下棋的人改变 map[nChessinfo[k].x][nChessinfo[k].y ]=-1; if(steps%2 == 1) return false;

六.游戏短评

本次游戏编程对画面的制作还是比较满意的,五子棋作为经典单机游戏,一个好的棋盘(也就是游戏的外表)是比较重要的,华丽的画面会比较吸引到玩家,对传统游戏要有创新才能赢得市场,我们起初的时候画面不怎么好看没有设置棋子样式,只是用两种颜色的方格来表示棋子,感觉看起来比较不习惯,所以改了一下,在网上下了个图还对游戏记录加了一个背景图,在美化方面做了一些调整。本来还想加一些比较动感的背景音乐什么的,不过没什么时间,此次试验对我的编程提高还是有帮助的,在程序构架方面给了我很多启发,比如灵活的运用ifdef条件式触发,头文件封装函数以达到简化程序等方面,给我的教训就是不要一味的按照自己的想法进行编写,要多听听同学的意见,集思广益,这样程序才比较合理化,简单化,团队的协作性是比较重要的,一个大的游戏不是一个人能够完成的,所以要开动大家参与其中,要是有更多的时间,下一步应该对游戏的智能化做出一些想法并努力实现并加一些背景音乐,当玩家赢得游戏事给一些比较激励人的画面以达到吸引玩家能够继续或是下次在选择本游戏的目的。

18

相关推荐