导航:首页 > 编程语言 > 从游戏里编程经典案例

从游戏里编程经典案例

发布时间:2023-02-06 08:28:11

① 《游戏人工智能编程案例精粹修订版》pdf下载在线阅读全文,求百度网盘云资源

《游戏人工智能编程案例精粹修订版》网络网盘pdf最新全集下载:
链接: https://pan..com/s/1uruUEjg1SNA1u7HN02_syA

?pwd=esad 提取码: esad
简介:《游戏人工智能编程案例精粹(修订版)》主要讲述如何使游戏中的角色具有智能的技术。本书首先介绍游戏角色的基本属性(包括速度、质量等物理属性)及常用数学方法。接着,深入探讨游戏智能体状态机的实现。通过简单足球游戏实例,本书给出用状态机实现游戏AI的例子。在图论部分,本书详细介绍图在游戏中的用途及各种不同的图搜索算法,并用一章的篇幅讨论了游戏中路径规划是如何完成的。此外,本书还对目标驱动的智能体的实现、触发器与模糊逻辑在游戏中的运用进行了讨论。为使智能体行为更加丰富、灵活、易于实现,本书还介绍了游戏脚本语言的优点,并以Lua脚本语言为例进行了说明。

② 游戏编程里面有哪些经典或者很酷的算法

没啥太酷的,只有钻研于数学和算法领域的人才能感觉到一个好的算法的酷在那里。
游戏编程中大部分使用的也是基本的算法,可能就是多一点AI寻路,图像处理类别的多一点而已。
建议你看《算法导论》,里面的每一个都是经典或者说非常酷。

③ 用C语言编写小游戏

用c语言编写一个五子棋吧,不怎么难,给你程序,自己参考一下

/*3.3.4 源程序*/
#include "graphics.h" /*图形系统头文件*/
#define LEFT 0x4b00 /*光标左键值*/
#define RIGHT 0x4d00 /*光标右键值*/
#define DOWN 0x5000 /*光标下键值*/
#define UP 0x4800 /*光标上键值*/
#define ESC 0x011b /* ESC键值*/
#define ENTER 0x1c0d /* 回车键值*/
int a[8][8]={0},key,score1,score2;/*具体分数以及按键与存放棋子的变量*/
char playone[3],playtwo[3];/*两个人的得分转换成字符串输出*/
void playtoplay(void);/*人人对战函数*/
void DrawQp(void);/*画棋盘函数*/
void SetPlayColor(int x);/*设置棋子第一次的颜色*/
void MoveColor(int x,int y);/*恢复原来棋盘状态*/
int QpChange(int x,int y,int z);/*判断棋盘的变化*/
void DoScore(void);/*处理分数*/
void PrintScore(int n);/*输出成绩*/
void playWin(void);/*输出胜利者信息*/
/******主函数*********/
void main(void)
{
int gd=DETECT,gr;
initgraph(&gd,&gr,"c:\\tc"); /*初始化图形系统*/
DrawQp();/*画棋盘*/
playtoplay();/*人人对战*/
getch();
closegraph();/*关闭图形系统*/
}
void DrawQp()/*画棋盘*/
{
int i,j;
score1=score2=0;/*棋手一开始得分都为0*/
setbkcolor(BLUE);
for(i=100;i<=420;i+=40)
{
line(100,i,420,i);/*画水平线*/
line(i,100,i,420); /*画垂直线*/
}
setcolor(0);/*取消圆周围的一圈东西*/
setfillstyle(SOLID_FILL,15);/*白色实体填充模式*/
fillellipse(500,200,15,15); /*在显示得分的位置画棋*/
setfillstyle(SOLID_FILL,8); /*黑色实体填充模式*/
fillellipse(500,300,15,15);
a[3][3]=a[4][4]=1;/*初始两个黑棋*/
a[3][4]=a[4][3]=2;/*初始两个白棋*/
setfillstyle(SOLID_FILL,WHITE);
fillellipse(120+3*40,120+3*40,15,15);
fillellipse(120+4*40,120+4*40,15,15);
setfillstyle(SOLID_FILL,8);
fillellipse(120+3*40,120+4*40,15,15);
fillellipse(120+4*40,120+3*40,15,15);
score1=score2=2; /*有棋后改变分数*/
DoScore();/*输出开始分数*/
}
void playtoplay()/*人人对战*/
{
int x,y,t=1,i,j,cc=0;
while(1)/*换棋手走棋*/
{
x=120,y=80;/*每次棋子一开始出来的坐标,x为行坐标,y为列坐标*/
while(1) /*具体一个棋手走棋的过程*/
{
PrintScore(1);/*输出棋手1的成绩*/
PrintScore(2);/*输出棋手2的成绩*/
SetPlayColor(t);/*t变量是用来判断棋手所执棋子的颜色*/
fillellipse(x,y,15,15);
key=bioskey(0);/*接收按键*/
if(key==ESC)/*跳出游戏*/
break;
else
if(key==ENTER)/*如果按键确定就可以跳出循环*/
{
if(y!=80&&a[(x-120)/40][(y-120)/40]!=1
&&a[(x-120)/40][(y-120)/40]!=2)/*如果落子位置没有棋子*/
{
if(t%2==1)/*如果是棋手1移动*/
a[(x-120)/40][(y-120)/40]=1;
else/*否则棋手2移动*/
a[(x-120)/40][(y-120)/40]=2;
if(!QpChange(x,y,t))/*落子后判断棋盘的变化*/
{
a[(x-120)/40][(y-120)/40]=0;/*恢复空格状态*/
cc++;/*开始统计尝试次数*/
if(cc>=64-score1-score2) /*如果尝试超过空格数则停步*/
{
MoveColor(x,y);
fillellipse(x,y,15,15);
break;
}
else
continue;/*如果按键无效*/
}
DoScore();/*分数的改变*/
break;/*棋盘变化了,则轮对方走棋*/
}
else/*已经有棋子就继续按键*/
continue;
}
else /*四个方向按键的判断*/
if(key==LEFT&&x>120)/*左方向键*/
{
MoveColor(x,y);
fillellipse(x,y,15,15);
SetPlayColor(t);
x-=40;
fillellipse(x,y,15,15);
}
else
if(key==RIGHT&&x<400&&y>80)/*右方向键*/
{
MoveColor(x,y);
fillellipse(x,y,15,15);
SetPlayColor(t);
x+=40;
fillellipse(x,y,15,15);
}
else
if(key==UP&&y>120)/*上方向键*/
{
MoveColor(x,y);
fillellipse(x,y,15,15);
SetPlayColor(t);
y-=40;
fillellipse(x,y,15,15);
}
else
if(key==DOWN&&y<400)/*下方向键*/
{
MoveColor(x,y);
fillellipse(x,y,15,15);
SetPlayColor(t);
y+=40;
fillellipse(x,y,15,15);
}
}
if(key==ESC)/*结束游戏*/
break;
if((score1+score2)==64||score1==0||score2==0)/*格子已经占满或一方棋子为0判断胜负*/
{
playWin();/*输出最后结果*/
break;
}
t=t%2+1; /*一方走后,改变棋子颜色即轮对方走*/
cc=0; /*计数值恢复为0*/
} /*endwhile*/
}
void SetPlayColor(int t)/*设置棋子颜色*/
{
if(t%2==1)
setfillstyle(SOLID_FILL,15);/*白色*/
else
setfillstyle(SOLID_FILL,8);/*灰色*/
}
void MoveColor(int x,int y)/*走了一步后恢复原来格子的状态*/
{
if(y<100)/*如果是从起点出发就恢复蓝色*/
setfillstyle(SOLID_FILL,BLUE);
else/*其他情况如果是1就恢复白色棋子,2恢复黑色棋子,或恢复蓝色棋盘*/
switch(a[(x-120)/40][(y-120)/40])
{
case 1:
setfillstyle(SOLID_FILL,15);break; /*白色*/
case 2:
setfillstyle(SOLID_FILL,8);break; /*黑色*/
default:
setfillstyle(SOLID_FILL,BLUE); /*蓝色*/
}
}
int QpChange(int x,int y,int t)/*判断棋盘的变化*/
{
int i,j,k,kk,ii,jj,yes;
yes=0;
i=(x-120)/40; /*计算数组元素的行下标*/
j=(y-120)/40; /*计算数组元素的列下标*/
SetPlayColor(t);/*设置棋子变化的颜色*/
/*开始往8个方向判断变化*/
if(j<6)/*往右边*/
{
for(k=j+1;k<8;k++)
if(a[i][k]==a[i][j]||a[i][k]==0)/*遇到自己的棋子或空格结束*/
break;
if(a[i][k]!=0&&k<8)
{
for(kk=j+1;kk<k&&k<8;kk++)/*判断右边*/
{
a[i][kk]=a[i][j]; /*改变棋子颜色*/
fillellipse(120+i*40,120+kk*40,15,15);
}
if(kk!=j+1) /*条件成立则有棋子改变过颜色*/
yes=1;
}
}
if(j>1)/*判断左边*/
{
for(k=j-1;k>=0;k--)
if(a[i][k]==a[i][j]||!a[i][k])
break;
if(a[i][k]!=0&&k>=0)
{
for(kk=j-1;kk>k&&k>=0;kk--)
{
a[i][kk]=a[i][j];
fillellipse(120+i*40,120+kk*40,15,15);
}
if(kk!=j-1)
yes=1;
}
}
if(i<6)/*判断下边*/
{
for(k=i+1;k<8;k++)
if(a[k][j]==a[i][j]||!a[k][j])
break;
if(a[k][j]!=0&&k<8)
{
for(kk=i+1;kk<k&&k<8;kk++)
{
a[kk][j]=a[i][j];
fillellipse(120+kk*40,120+j*40,15,15);
}
if(kk!=i+1)
yes=1;
}
}
if(i>1)/*判断上边*/
{
for(k=i-1;k>=0;k--)
if(a[k][j]==a[i][j]||!a[k][j])
break;
if(a[k][j]!=0&&k>=0)
{
for(kk=i-1;kk>k&&k>=0;kk--)
{
a[kk][j]=a[i][j];
fillellipse(120+kk*40,120+j*40,15,15);
}
if(kk!=i-1)
yes=1;
}
}
if(i>1&&j<6)/*右上*/
{
for(k=i-1,kk=j+1;k>=0&&kk<8;k--,kk++)
if(a[k][kk]==a[i][j]||!a[k][kk])
break;
if(a[k][kk]&&k>=0&&kk<8)
{
for(ii=i-1,jj=j+1;ii>k&&k>=0;ii--,jj++)
{
a[ii][jj]=a[i][j];
fillellipse(120+ii*40,120+jj*40,15,15);
}
if(ii!=i-1)
yes=1;
}
}
if(i<6&&j>1)/*左下*/
{
for(k=i+1,kk=j-1;k<8&&kk>=0;k++,kk--)
if(a[k][kk]==a[i][j]||!a[k][kk])
break;
if(a[k][kk]!=0&&k<8&&kk>=0)
{
for(ii=i+1,jj=j-1;ii<k&&k<8;ii++,jj--)
{
a[ii][jj]=a[i][j];
fillellipse(120+ii*40,120+jj*40,15,15);
}
if(ii!=i+1)
yes=1;
}
}
if(i>1&&j>1)/*左上*/
{
for(k=i-1,kk=j-1;k>=0&&kk>=0;k--,kk--)
if(a[k][kk]==a[i][j]||!a[k][kk])
break;
if(a[k][kk]!=0&&k>=0&&kk>=0)
{
for(ii=i-1,jj=j-1;ii>k&&k>=0;ii--,jj--)
{
a[ii][jj]=a[i][j];
fillellipse(120+ii*40,120+jj*40,15,15);
}
if(ii!=i-1)
yes=1;
}
}
if(i<6&&j<6)/* 右下*/
{
for(k=i+1,kk=j+1;kk<8&&kk<8;k++,kk++)
if(a[k][kk]==a[i][j]||!a[k][kk])
break;
if(a[k][kk]!=0&&kk<8&&k<8)
{
for(ii=i+1,jj=j+1;ii<k&&k<8;ii++,jj++)
{
a[ii][jj]=a[i][j];
fillellipse(120+ii*40,120+jj*40,15,15);
}
if(ii!=i+1)
yes=1;
}
}
return yes;/*返回是否改变过棋子颜色的标记*/
}
void DoScore()/*处理分数*/
{
int i,j;
score1=score2=0;/*重新开始计分数*/
for(i=0;i<8;i++)
for(j=0;j<8;j++)
if(a[i][j]==1)/*分别统计两个人的分数*/
score1++;
else
if(a[i][j]==2)
score2++;
}
void PrintScore(int playnum)/*输出成绩*/
{
if(playnum==1)/*清除以前的成绩*/
{
setfillstyle(SOLID_FILL,BLUE);
bar(550,100,640,400);
}
setcolor(RED);
settextstyle(0,0,4);/*设置文本输出样式*/
if(playnum==1)/*判断输出哪个棋手的分,在不同的位置输出*/
{
sprintf(playone,"%d",score1);
outtextxy(550,200,playone);
}
else
{
sprintf(playtwo,"%d",score2);
outtextxy(550,300,playtwo);
}
setcolor(0);
}
void playWin()/*输出最后的胜利者结果*/
{
settextstyle(0,0,4);
setcolor(12);
if(score2>score1)/*开始判断最后的结果*/
outtextxy(100,50,"black win!");
else
if(score2<score1)
outtextxy(100,50,"white win!");
else
outtextxy(60,50,"you all win!");
}

④ 《游戏人工智能编程案例精粹》pdf下载在线阅读全文,求百度网盘云资源

《游戏人工智能编程案例精粹》网络网盘pdf最新全集下载:
链接: https://pan..com/s/1XVAZ2EGjzh7np1P-XLWEWA

?pwd=znfa 提取码: znfa
简介:主要讲述如何使游戏中的角色具有智能的技术。

⑤ c语言游戏编程实例

生命游戏
/* ------------------------------------------------------ */
/* PROGRAM game of life : */
/* This is a finite implementation of John H. Conway's */
/* Game of Life. Refere to my book for detail please. */
/* */
/* Copyright Ching-Kuang Shene July/25/1989 */
/* ------------------------------------------------------ */

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 50 /* board size */
#define OCCUPIED 1 /* occupied flag */
#define UNOCCUPIED 0
#define YES 1
#define NO 0

char cell[MAXSIZE][MAXSIZE]; /* the board */
char work[MAXSIZE][MAXSIZE]; /* a working */
int row; /* No. of rows you want */
int column; /* no. of columns you want */
int generations; /* maximum no. of generation*/

/* ------------------------------------------------------ */
/* FUNCTION read_in : */
/* This function reads in the number of generations, */
/* the number of rows, the number of columns and finally */
/* the initial configuration (the generation 0). Then put*/
/* your configuration to the center of the board. */
/* ------------------------------------------------------ */

void read_in(void)
{
int max_row, max_col; /* max # of row and col. */
int col_gap, row_gap; /* incremnet of row and col */
int i, j;
char line[100];

gets(line); /* read in gens, row and col*/
sscanf(line, "%d%d%d", &generations, &row, &column);
for (i = 0; i < row; i++)/* clear the board */
for (j = 0; j < column; j++)
cell[i][j] = UNOCCUPIED;
max_col = 0; /* read in the config. */
for (max_row = 0; gets(line) != NULL; max_row++) {
for (i = 0; line[i] != '\0'; i++)
if (line[i] != ' ')
cell[max_row][i] = OCCUPIED;
max_col = (max_col < i) ? i : max_col;
}
row_gap = (row - max_row)/2; /* the moving gap */
col_gap = (column - max_col)/2;
for (i = max_row + row_gap - 1; i >= row_gap; i--) {
for (j = max_col + col_gap - 1; j >= col_gap; j--)
cell[i][j] = cell[i-row_gap][j-col_gap];
for ( ; j >= 0; j--)
cell[i][j] = UNOCCUPIED;
}
for ( ; i >= 0; i--)
for (j = 0; j < column; j++)
cell[i][j] = UNOCCUPIED;
}

/* ------------------------------------------------------ */
/* FUNCTION display : */
/* Display the board. */
/* ------------------------------------------------------ */

#define DRAW_BOARDER(n) { int i; \
printf("\n+"); \
for (i = 0; i < n; i++) \
printf("-"); \
printf("+"); \
}
void display(int gen_no)
{
int i, j;

if (gen_no == 0)
printf("\n\nInitial Generation :\n");
else
printf("\n\nGeneration %d :\n", gen_no);

DRAW_BOARDER(column);
for (i = 0; i < row; i++) {
printf("\n|");
for (j = 0; j < column; j++)
printf("%c", (cell[i][j] == OCCUPIED) ? '*' : ' ');
printf("|");
}
DRAW_BOARDER(column);
}

/* ------------------------------------------------------ */
/* FUNCTION game_of_life : */
/* This is the main function of Game of Life. */
/* ------------------------------------------------------ */

void game_of_life(void)
{
int stable; /* stable flag */
int iter; /* iteration count */
int top, bottom, left, right; /* neighborhood bound */
int neighbors; /* # of neighbors */
int cell_count; /* # of cells count */
int done;
int i, j, p, q;

display(0); /* display initial config. */
done = NO;
for (iter = 1; iter <= generations && !done; iter++) {
memmove(work, cell, MAXSIZE*MAXSIZE); /**/
stable = YES; /* assume it is in stable */
cell_count = 0; /* # of survived cells = 0 */
for (i = 0; i < row; i++) { /* scan each cell...*/
top = (i == 0) ? 0 : i - 1;
bottom = (i == row - 1) ? row-1 : i + 1;
for (j = 0; j < column; j++) {
left = (j == 0) ? 0 : j - 1;
right = (j == column - 1) ? column-1 : j + 1;

/* compute number of neighbors */

neighbors = 0;
for (p = top; p <= bottom; p++)
for (q = left; q <= right; q++)
neighbors += work[p][q];
neighbors -= work[i][j];

/* determine life or dead */

if (work[i][j] == OCCUPIED)
if (neighbors == 2 || neighbors == 3) {
cell[i][j] = OCCUPIED;
cell_count++;
}
else
cell[i][j] = UNOCCUPIED;
else if (neighbors == 3) {
cell[i][j] = OCCUPIED;
cell_count++;
}
else
cell[i][j] = UNOCCUPIED;
stable = stable && (work[i][j] == cell[i][j]);
}
}
if (cell_count == 0) {
printf("\n\nAll cells die out.");
done = YES;
}
else if (stable) {
printf("\n\nSystem enters a stable state.");
done = YES;
}
else
display(iter);
}
}

/* ------------------------------------------------------ */

void main(void)
{
read_in();
game_of_life();
}


⑥ 如何编程游戏

学习游戏编程主要是自学和报班学习,但对于普通人来说不建议自学。

当下互联网行业发展迅速,与之相关的产业大多发展都很好,游戏设计的前景自然也是相当不错的。一个游戏问世要经历很多环节,剧本设计,原画创作,场景建模,但核心部分还是编程语言开发。

主要学的内容如下:

1.游戏程序设计:C++程序设计入门;基本数据类型和输入输出;流程控制语句;数组、指针和引用、函数;程序结构和书写规;范结构体和联合体、类;继承与多态;异常处理与程序调试。

2.算法与数据结构:算法分析;数据结构;基本算法;STL的概念与使用;静态库与动态库;XML库的使用。

3.Win32程序设计:Windows程序入门;Windows消息;GDI绘图游戏工具与MFC;网络编程基础。

4.游戏数学和智能应用:游戏中的坐标系;矢量、矩阵;几何碰撞;物理模拟;人工智能与寻路算法。

5.2D游戏技术与应用:2D游戏技术概论;游戏地图系统;GUI系统;战斗系统设计;任务系统;优秀的声音引擎BASS;Cocos2D-X引擎;Box2D物理引擎。

互联网行业目前还是最热门的行业之一,学习IT技能之后足够优秀是有机会进入腾讯、阿里、网易等互联网大厂高薪就业的,发展前景非常好,普通人也可以学习。

想要系统学习,你可以考察对比一下开设有相关专业的热门学校,好的学校拥有根据当下企业需求自主研发课程的能力,能够在校期间取得大专或本科学历,中博软件学院、南京课工场、南京北大青鸟等开设相关专业的学校都是不错的,建议实地考察对比一下。

祝你学有所成,望采纳。

⑦ 游戏编程

游戏制作类书籍推荐(中文)

书名:大型多人在线游戏开发MASSIVELY MULTIPLAYERGAME DEVELOPMENT
作者:亚历山大
译者:史晓明
说明:本书是一本系统介绍MMP(大型多人,Massively Multiplayer)在线游戏开发知识的文集,汇集业内最优秀的游戏开发人员智慧的精华。本书不仅从MMP游戏的角度对客户端技术进行了讨论,还深入剖析了MMP游戏设计、架构、服务端开发、数据库技术以及MMP游戏核心系统等特定于MMP游戏的知识。对于广大MMP游戏开发人员来说,本书是不可多得的参考资料。

书名:C++游戏编程
作者:(美)罗比斯 李鹏 贾传俊
说明:本书从游戏开发的角度出发,把C++应用到游戏软件领域。介绍一些C++的实战经验,用常规的C++技术解决游戏开发者经常遇到的问题。重点讲述已经在实际的项目中应用的技术,而不是大段地罗列代码。 本书是游戏开发经典丛书系列之一,适合游戏开发人员、业余游戏软件开发爱好者和有关游戏软件开发培训班使用,也可以人秋大专院校相关专业的参考书。

书名:Visual Basic 6.0/.NET游戏开发实例
作者:姜波 宁峰
说明:本书是一本面向广大编程爱好者的游戏设计类图书。本书最大的特色在于以游戏开发案例为主要的内容。书中涉及到的游戏都是大家耳熟能详的。比如推箱子,俄罗斯方块,五子棋,坦克大战等。为了使您紧跟技术进步的潮流,我们还为您介绍了目前非常流行的智能设备编辑。我们不仅做到了通俗易懂,图文并茂。
本书适用于游戏编程爱好者,程序设计人员和Visual Basic的初学者。也可作为培训机构的培训教材。

书名:盛大游戏原画设计精选
作者:上海盛大新华网络发展有限公司 南京艺术
说明:本书介绍如何品味游戏的角色设计和原画创作,从游戏脚本到初级造型——体会《神迹》,充分理解脚本意图,提炼与夸张《神迹》的场景,塑造个性(上)——走进《梦幻国度》,自身比例关系之Q版造型,《梦幻国度》的场景,塑造个性(下)——走进《英雄年代》,自身比例关系之传统造型,《英雄年代》的场景,关于道具——解析《三国豪侠传》,营造视觉效果——感受《传奇世界》……

书名:3D游戏 卷1:实时渲染与软件技术
作者:Alan Watt,Fabio Policarpo
译者:沈一帆 陈文斌 朱怡波
说明:综合介绍当前流行的三维游戏开发技术,主要内容包括:建模及基础数学,经典的三维图形学,实时渲染,对象的控制,二维技术,软件技术等。书中的所有内容都是围绕一个功能强大的游戏开发引擎,即Fly3D来写的。其目的是使你可以编写源代码来实现自己的想法,或是通过编写或修改插件来对现有的实例进行试验,甚至可以开发属于自己的游戏。随书光盘给出了完整的Fly 3D SDK及一些演示片段和图片。

书名:3D游戏:卷2 动画与高级实时渲染技术
作者:Alan Watt,Fabio Policarpo
译者:沈一帆 陈文斌 朱怡波
说明:本书从实践的角度出发,详细介绍3D游戏开发的高级技术,并具体描述了一个游戏引擎的构建过程。全书着重讨论三个主题:游戏开发的一般过程(构造过程、实时处理过程和软件设计);实时渲染过程;角色动画。所有主题均围绕一个具体的游戏开发系统Fly3D SDK 2.0(包含在光盘中)加以介绍。 本书旨在为当今的三维游戏引擎技术提供一个综合的解决方案,将游戏理论技术与具体引擎代码分析相结合,使读者尽快地进入开发者角色,了解整个游戏开发过程和客户(游戏设计者)的需求,并初步具备游戏引擎开发能力。 本书适合作为高等院校相关专业的教学参考书,同时可供相关技术人员和游戏开发人员阅读。

书名:Visual C++角色扮演游戏程序设计
作者:坂本千寻
译者:博硕文化
说明:本书适合已有VC++使用经验的读者,书中共分十个章节,从最基本的RPG的角色扮演游戏设计要素开始介绍,再来教您Windows窗口程序设计与RPG游戏配合的基本知识、图形文件的显示与全盛地图与人物相关的坐标处理、人物角色移动的思维与逻辑、战斗的设计与程序判断、RPG里所产生的事件的处理、角色参数的编辑设定和程序设计重点、音效加入与故事的整合等,每一章节都有完整高水准的程序实例配合解说,对想要学习游戏制作的读者提供了极佳的参考。

书名:Visual C++冒险游戏程序设计
作者:坂本千寻
译者:博硕文化
说明:本书针对冒险型游戏(AVG),从游戏策划与设计开始介绍,然后再以VC++为实际开发工具,完整详细地指导读者开发一套高水准的冒险型游戏。
书中着重的不是华丽的演出或新技术的说明,而是务实且仔细地审视冒险游戏最基本的本质思维与逻辑部分。再者,书中许多程序的观念与技巧内容也适用于游戏以外的程序设计,这些技术都是作者经验累积的成果,不是一般入门书会提供的,书中许多内容与观念都是想要进阶与提升技术的读者所需要的,不仅适用于想要开发冒险型游戏的读者,也适合想要以“游戏”为题材来学习程序设计的读者。

书名:C++游戏编程
作者:(美)Noel Llopis
译者:李鹏/ 贾传俊
说明:本书从游戏开发的角度出发,把C++应用到游戏软件领域。介绍一些C++的实战经验,用常规的C++技术解决游戏开发者经常遇到的问题。重点讲述已经在实际的项目中应用的技术,而不是大段地罗列代码。
本书是游戏开发经典丛书系列之一,适合游戏开发人员、业余游戏软件开发爱好者和有关游戏软件开发培训班使用,也可以人秋大专院校相关专业的参考书。

名:Cg教程:可编程实时图形权威指南
译者:洪伟 刘亚妮 李骑 丁莲珍
说明:Cg是最早的为可编程图形硬件设计的高级编程语言,本书教你如何编写Cg程序。
本书共10章,第1章简要介绍Cg语言。随后的每一章分别介绍Cg中的一个概念和技术的说明,包括最简单的Cg程序,参数、纹理和表达式,如何进行顶点变换,如何用Cg实现光照模型,如何用Cg顶点程序实现模型的动画和变换,如何实现环境贴图,如何实现凹凸贴图,雾、卡通光照、投影聚光、阴影贴图和复合技术,目前可用的Cg的顶点和片断的简要描述(Profile)等内容。

书名:网络游戏开发
译者:姚晓光 恽爽 王鑫
说明:本书出自两位世界级资深网络游戏专家之手,全面介绍了如何构架、发行和维护网络游戏,专业而又详尽地讲述了网络游戏制作、发行及运营中的一些实际细节。书中汇集了网络游戏开发历程中的经验与教训。
对于从事网络游戏开发的业内人土,特别是管理人员,本书是不可多得的佳作。本书同样适合于对网络游戏开发有兴趣的玩家和读者。
网络游戏已经出现———不再是未来的梦想!如果你是网络游戏从业人士。就绝对不能错过本书!
“本书汇集了许多大型网络游戏开发的优秀经验,采用书中的这些建议可以为公司节省数百万美元的成本 ” Gordon Walton,Maxis公司副总裁,《模拟人生在线》执行制作人。

书名:Windows游戏编程大师技巧(第二版)
原名:Tricks of the Windows Game Programming Gurus,2nd
说明:本书是着名游戏程序设计类书籍作者André LaMothe的两卷本《Windows游戏编程大师技巧》中的第一卷的第二版。和作者撰写的其他畅销书一样,在书中随处可见许多有趣但又有一定难度的源程序。作者循循善诱地从程序设计的角度介绍了在Windows环境下进行游戏开发所需的全部知识,包括Win32编程以及DirectX中所有主要组件(包括DirectDraw、DirectSound、DirectInput和DirectMusic)。书中还用单独的章节详细讲授了2D图形学和光栅化技术、游戏算法、多线程编程、文本游戏和解析、人工智能(包括模糊逻辑、神经网络和遗传算法)、物理建模(完全碰撞反应、动量传递和正反向运动学)及实时模拟等游戏程序开发中的关键技术。

书名:Visual C++网络游戏建模与实现
作者:苏羽 王媛媛
说明:本书讲述如何使用UML进行棋牌类网络游戏建模、如何用Visual C++编程实现该游戏,书中集作者近年来从事网络游戏开发之经验。 全书共分14章,1~6章介绍网络通信编程,是网络游戏设计的基础;7~12章介绍如何用UML对网络游戏进行可视化建模;第13章介绍如何用Visual C++编写有一定难度的客户端程序;第14章介绍如何使用数据库管理游戏数据。由于本书重点在于介绍网络游戏整体框架的建模和编程,所以在讲解时只给出了编程思想和实现的过程,并没有提供全部实现过程的源程序,但提供了关键的实现代码和设计类框图。使你对网络游戏编程有较深入的理解。 本书适用于软件工程师、网络程序员、大学计算机软件专业和网络专业的学生,以及从事网络游戏开发的程序设计人员。

书名:Visual C++游戏设计(第二版)
作者:荣钦科技
说明:本书用浅显生动的语言、经典的案例带领您进入游戏设计的美妙世界,帮助您实现开发游戏的梦想。书中参照开发大型游戏《仙剑奇侠传》所需要的技术,如:镂空动画、半透明动画、碰撞检测、斜角卷动的地图、人工智能、3D动画、3D音效等,对游戏的设计和开发过程进行了系统而又详细的介绍。使您能清楚地了解游戏设计过程中的各种知识,包括Visual C++的基本操作、游戏画面的坐标系统、规划游戏的主要架构,以及使用DirectX来设计3D游戏等。本书理论与实例并重,讲述了多种游戏设计的思想和技巧,适合作为游戏程序设计爱好者和新鲜人士阅读,也可供多媒体开发人员参考使用。

书名:PC游戏编程(网络游戏篇)
译者:CG实验室/王鑫/罗金海/赵千里
说明:本书的作者都是第一线的网络游戏开发人员,书中的所有内容都整理自完整的网络游戏项目,是实践经验的总结。第二章到第十四章的内容,基本是从一个多人在线冒险型网络游戏项目中整理而来,第十五章则整理于一个即时战略游戏项目。在内容的讲述中尽量避免了和具体游戏内容的关联,以便更具有通用性。本书的目标是帮助读者掌握常见类型的网络游戏的开发环境、流程、关键制作技术、方法和技巧,读者通过学习和实践甚至可以成为专业的网络游戏程序设计师。本书面向的读者对象主要是有一定编程经验,并对制作网络游戏很有兴趣的爱好者或者是有单机游戏设计经验,正在向网络游戏转达型的程序设计师。同时对于非程序开发,但对网络游戏项目很有兴趣的朋友也是很好的参考书。

书名:Visual C++ 游戏设计入门
作者:普悠久玛数位科技
说明:Visual C++ 6.0是目前电脑游戏界开发游戏程序的最佳工具,它用传统优良的C++语言配合Visual C++6.0集成开发环境来设计游戏程序,不论在开发的速度还是在运行的性能上,都有最优异的表现! 本书由浅入深地以MFC的程序架构来说明各种与游戏设计相关的技巧,使初学者能够轻松地掌握游戏设计的基本理论和实现技巧。通过难度适中的实例,引领读者逐步进入游戏设计的殿堂,从而分享笔者在游戏设计过程中的心得,即使是游戏程序设计生手的您,也能够探寻设计的奥妙! 本书适用于电脑游戏编程的初学者。

名:进阶实战3DS MAX角色设计及游戏开发
作者:傅富垣
说明:本书属于《技胜e筹》系列丛书,是以我国台湾版的相应图书为蓝本改编而成。在随书附赠的光盘中,包含了本书学习时所需的文件:模型(场景)文件、材质、纹理贴图、免费Plug-In程序和游戏引擎等。本书共分两篇,分别介绍了一些相关的高级概念;使用3DS MAX时的应用技巧,制作人物模型;如何利用免费的Plug-In(插件)程序,制作人物脸部的纹理贴图;如何使用3DS MAX内置的骨骼系统(Bones),制作角色动画;如何使用3DS MAX及Character Studio,以及如何将动态人物导入到游戏引擎中等内容。本书非常适合3DS MAX 的入门用户以及培训班的学员,同时也是进阶用户不可缺少的参考书。

书名:3DS MAX角色动画和游戏制作教程
作者:天一工作室
说明:本教程本着理论结合实际的原则,使用生动的实例教学法,详述如何使用3ds max 4制作角色动画和游戏的方法和技巧。 本教程共分为18章,每章都包含一个完整的实例,从不同角度针对不同的应用讲述3ds max 4不同的功能和应用技巧。主要内容包括:低多边形角色建模,面片角色建模,角色的材质和贴图创建骨骼,反向动力学,皮肤和弹性修改器,角色的行走姿势,口形同步和面部表情,制作游戏中的建筑物、太空船动画和爆炸效果,创建烟雾、喷水、太阳,使用特殊建模工具、约束与控制器、新的渲染功能和“经典实例——风云”。 对初学者来说,本教程图文并茂、循序渐进、范例精美,易于理解。对于3ds max的老用户来说,通过学习本版作品能掌握许多功能应用过程中的技巧。本教程自始至终都注重理论讲解和实际操作相结合,把3ds max 4.O的功能融汇贯通到实际操作之中,同时注重对关键步骤的操作技巧作及时、精辟的讲解。 本教程适合于各种层次的3D设计人员及3ds max爱好者学习,也可以作为3ds max 4. 0的培训教材。 本版CD内容为本教程文件。

书名:Visual Basic 游戏编程21天自学通
原名:Sams Teach Yourself Game Programming with Visual Basic
说明:本书以三周的学习计划,21天的课时按排,教你学会使用Visual Basic编写自己的游戏程序的方法和技巧。 全书从介绍游戏编程的基本知识和编制简单的游戏程序入手,通过丰富的示例和作者提供的示例源代码,学习游戏编程的艺术、WindowsAPI调用,游戏屏幕绘制、文本绘制、编写游戏算法、图片显示、播放动画、声音效果以及游戏程序检测等一系列从设计到编制的全部工程;学习编制实时游戏,为RPG游戏创建编辑器等高级技术,从专家级的游戏编制经验中学会使用VB达到创建自己富有吸引力的作品。 本书面向有一定VB基础的用户,从自学的特点来编写。你可以一章一章逐步学习也可以选择你最感兴趣的章节来学习。

书名:C游戏编程从入门到精通
作者:浦滨
说明:本书以C语言游戏编程入门,以102个实例,近200个函数较为系统地介绍了C基于游戏编程与开发的力法与技巧,内容丰富并相互包容,相互渗透。以实际的基于不同平台的游戏制作为背景,知识阐述与实际案例结合,深入浅出,具体、直观、全面,可操作性强;是一本难得的集入门、深入到精通C游线编程的综合书籍。 该书将大学计算机及大量相关专业课程的知识运用到C语言游戏编程的实践中,并从C语言游线编程实践角度来诠释计算机及许多其他专业课题,内容涉及计算机硬件、软件等方面的编程技术。具体内容包括,图形绘制、中文显示、动画实现、文件调用、内存使用、声卡调用、中断、内存驻留技术、接口技术、数据库实现、简单病毒、界面技术等进行了详尽的介绍,并且配以大量的源程序以及程序分析对所涉及的理论进行充分的讲解和支撑。

书名:PC游戏编程(入门篇)
作者:林鹏 戴波 袁霜霁
说明:第一章 基石 1. 1 BOSS登场--GAF简介第二章 2D图形程式初体验 2.l 饮水思源--第一个"游戏"程式 2.2 知其所以然一一2D图形学基础 2.3 进入图形世界的钥匙--GAFDDraw 2.4 2D图像的本质--图层表面 2.5 场景的秘密--背景卷动 2.6 诱惑--来自"精灵"的问候 2.7 餐后甜点--GAFApp/GAFDDraw的其他法宝第三章 塞壬的歌声魔力和第三类接触 3.1 1,2,3--计算机音乐概述 3.2 塞壬的歌声--音效程式的魔力 3.3 专业伴奏--掌握MIDI 3.4 第三类接触--和玩家打交道第四章 打造自己的PRG传奇 4.l 九种武器--RPG游戏程式框架 4.2 魔法书的封面--标题画面和其他 4.3 创世界--场景的生死轮回 4.4 永远的主角--NPC和大魔王 4.5 魔法咒语--剧情和脚本 4.6 泰斯叔叔的袋子--RPG的道具箱 4.7 英雄的宿命--战斗 4.8 传说的终结--人定胜天第五章 好风借力 更上层楼 5.l 思维的底层--人工智能入门 5.2 虚拟的现实--走进3D世界第六章 技巧完美篇 6.1 与数据共舞--游戏程序优化技巧 6.2 站在别人的肩上--常用开发库使用介绍附录一 GAFApp类接口简明参考附录二 GAFDDraw类接口简明参考附录三 GAFDInput类接口简明参考附录四 游戏编程/制作相关网站

⑧ C语言的经典编程例子


程序员》推荐C++ 图书三人谈

主持人:熊节(透明),《程序员》杂志编辑,C-View成员
嘉 宾:孟岩(梦魇),联想公司掌上设备事业部应用开发处任职,C-View成员。与侯捷先生合译《C++ Standard Library》一书
金尹(恶魔),上海天宇公司CTO,在《程序员》连载有“自由与繁荣的国度”系列文章

透明:“学C++用哪本书入门”,这是被问得最多的一个问题。但是哪一本书是最好的入门书?似乎很难找到答案。《C++ Primer》太厚,《Effective C++》对读者要求比较高,《Essential C++》又常常被批评为“太浅”。
其实说穿了:no silver bullet。想从一本书学会C++,那是不可能的。有朋友问我如何学C++,我会建议他先去找本数据结构书,把里面的习题全部用C++做一遍,然后再去看《Effective C++》。myan经常说“要在学习初期养成好习惯”,我对此颇不以为然。
个人认为,《Essential C++》适合作教材,《C++ Primer》适合作参考书,《Effective C++》适合作课外读物。

恶魔:很后悔当初买了《C++ Primer》。因为从我个人角度来看,它的功能效用基本是和《The C++ Programming Language》重合。当然对于入门来说,它还是很不错的。但是《C++ Primer》太厚,一来导致看书极其不方便,二来系统学习需要花比较长的时间。对于目前这个越来越快餐化的时代来说,的确有很多不适合的地方,不过可以作为初学者的参考书。现在我以一块K3 CPU的代价把它借给了别人,希望我那位同事能够从中得到一些益处。
如果已经具备了C基础,我建议看国内的书,例如钱能的《 C++大学教程(第二版) 》。(如果没有C的基础还是看谭浩强的C语言)。这本书对C讲得还算比较清晰,有很多习题值得一做,特别是最后的struct和union两个部分。其中的一些算法比较拖沓和繁琐(比如树和链表的遍历算法),读者可以尝试修改这些例子,作为最后对C语言的一些总结测试。

梦魇:这个问题让我想起四五年前的情形。今天对于C++有一点认识的人,多半是从那几年就开始学C++了。那时根本没有品牌观念。从书店里找一本C++书,如果看着还算明白,就买下来。我记得那时候宛延闿、张国锋、麦中凡教授的书都受到很高的赞誉。我个人最早的一本C++书是Greg Perry的一本书,今天想起来,其实是一本打着C++旗号的C语言教程。对我作用最大的一本书是国防科技出版社出版的一本书,书名记不得了,作者叫斯蒂芬·布莱哈。
透明:还记得以前曾批评过一本C++书,是北航出的,整本书就没有出现过class关键字。那本书,说穿了其实只是介绍了C语言和iostream库的用法,根本不能算C++。而当时我常常推荐的一本书是电子科技大学张松梅老师的C++教程。那本书,直到今天来看也没有太大的问题,唯一的缺憾就是由于年代久远,许多东西已经过时了。而对于一本技术书籍来说,“过时”是最不可接受的。
总体来说,那时使用C++的人真是在“盲人摸象”。不过这也有好处,就是对C++的很多细节能搞清楚,以后看到经典好书时比较容易理解;当然坏处就是概念不清,甚至都不知道C++和Visual C++、Borland C++到底有什么不一样。

梦魇:整个90年代,其实大部分人对于C++的认识都似是而非。一开始是等同于Borland C++,后来是等同于Visual C++和MFC。所以一般来说,打着BC和VC旗号的书卖得很好,人们觉得这就是C++。而我比较幸运,布莱哈的那本书虽然从现在的眼光来看谈不上高超,但基本路子是对的。可能是因为原书是给UNIX程序员的培训教材,所以没有让我一开始就形成“C++ == VC++”的认识。
其实一直到1996年,我们那里搞计算机的都是唯Borland C++马首是瞻的,到了VC 4.0出来,一下子格局全变了。1997年VC5推出之后,书店里MFC书铺天盖地,学MFC的人,头抬得都比别人高一些。不过现在看来,那时候大部分的MFC书都是三流货色。我曾经有一段时间认为,那一批程序员中间有不少被误导了。根本原因就是相对的封闭。

透明:我觉得一本书的价值有两方面:第一,教给你实用的技术;第二,促使你去思考。对于一本介绍VC(或者说MFC)使用方法的书,我根本不希望它能促使我有什么思考,所以我就一定要求它在技术上精益求精完美无瑕。我刚开始用VC的时候,买的第一本书就是潘爱民老师翻译的《VC技术内幕》(第四版),没有受到那些“三流货色”的误导,应该说是很幸运的。

梦魇:1999年机械工业出版社开始出版“计算机科学丛书”,其中的《Thinking in C++》第一版受到了广泛的欢迎。其实我一直不认为这本书很出色,虽然拿过一次大奖。然而我们都得承认,这本书在C++书籍领域里第一次建立了品牌观念,很多初学者开始知道,不是随便买哪一本都一样的。再往后就是2000年的《 深入浅出MFC(第二版) 》第二版,以及侯先生在《程序员》上发表的那一篇《C++/OOP大系》,加上整个大环境的变化,品牌观念深入人心,C++书籍市场终于开始逐渐与世界同步。
回想往事,我的感觉是,那个需要战战兢兢选择入门书的时代已经过去,今天的C++初学者,大可以放心地买口碑好、自己读起来思路顺畅的书,入门不再是太大的问题。还有一些程序员已经学了几年C++,但看到今天出版的一些新书,感觉比较陌生,这也不是什么问题。侯先生经常说“凡走过必留下足迹”,所谓“走弯路”,未必不是一件好事。
至于具体的推荐表,就不好一概而论了。总之在我的印象里,《Essential C++》、《C++ Primer》、钱能教授的C++教程,都不错。甚至有人一上来就看Bjarne Stroustrup的《The C++ Programming Language》,只要他喜欢,也没什么不可以。

透明:我同意你的观点。不管怎么说,编程是门实践性非常强的学问。要想对C++对象模型有深入的了解,最好的办法就是写一串程序去看结果;要想学会OOP,也只能从项目中学。对于初学者,最好的学习方法就是不停地写程序,写真正有用的程序,写到有问题的时候就去查书,于是自然就会知道哪本书好哪本书不好。不过我们的教育制度能不能让大学里的学生们有这样的学习机会,我表示怀疑。
以我的经验,学C++有两个门槛:入门和使用。完全看不懂C++,这是一个门槛,但是只要有一本合适的入门书,很快就能跨过。要想真正用上C++,却不是件很容易的事情。尤其对于学生来说,接触到的东西多是“玩具”,很难有实战的机会。所以经常看见有人问“C++到底能做什么”,这是C++学习中一个比较麻烦的问题。我们都是做了相当长时间的C++程序之后才看到一些真正经典的书,也正是因为走了相当长的弯路之后才知道这些书的经典之所在。所谓弯路,我想也是一种必须的积累。就算一开始就看《Essential C++》和《C++ Primer》,没有两三年的时间恐怕还是难有所得。

恶魔:有两句十分有道理的话,一是我大学的C语言老师说的“写程序不如说是抄程序”,另一句是一网友说的“好的设计来自借鉴,天才的设计来自剽窃”。对于我这个理性批判主义者来说,这两句话的确不太适合。但是无论从哪个角度来讲,对于初学者来说,剽窃大师的作品是通向成功的最快捷径。
我个人认为,对于C++的初学者来说,首先要确定自己专业领域内主要使用的特性的方向。因为C++的特性如此众多,初学者想贪多基本是不可能成功的。C++的编程范式基本可以分为ADT+PP、GP和OO三个方向。对于ADT+PP范式来说,初学者的主要问题不是学习C++,而是学习C的使用。对于这样的初学者,国内的几本书还是写得比较清楚,符合中国人的习惯,比如谭浩强的《C语言教程》、钱能的《C++语言大学教程》。这两本书我首推第一本,因为这一本我潜心研究了一年,这本书当中很多程序是可以剽窃的,而且可以对这些程序进行加工和提升。比如结构这一章中,它所给出的用struct来实现链表、二叉树的算法是相当蹩脚的。学习ADT+PP的初学者将这本书揣摩透以后可以尝试修改这两个程序。另外这本书的第二版稍微涉及了一些关于“类”的内容。学习ADT+PP的初学者,可以不被OO中的一些专有特性扰乱自己的思路,对于类层次扁平、无继承、无多态的程序编写是有很大好处的。

透明:你好象比较推崇国内教授写的书。现在社会上有种不好的风气:一捧就捧上天,一贬就贬下地。就好象对待谭教授的书,前几年是奉为经典,这几年又有很多人使劲批评。学C++更是有点“崇洋媚外”,总是觉得初学就应该看《Essential C++》。我看这种观点也是片面的。

恶魔:当然《Essential C++》也值得看看。但是我个人觉得这本书没有谭浩强的《C语言教程》来得好。主要原因是:第一,C++的所有特性都点到了,但是不深,看了以后会三心二意没有方向;第二,可以抄袭借鉴的例子太少。《C语言教程》中有很多有趣的问题,比如猴子吃桃、汉诺塔等等,这些例子对于刚刚涉及C/C++语言编程的人来说是学习编程很好的例子。《Essential C++》只能是前两本书看透以后,作为学习C++特性的一个过渡性的书籍。让读者真正领略到什么是C++的编程、和C编程的不同点在哪里。

透明:我发现一个很有趣的现象:初学者往往喜欢问“哪本书比较好”,这让我很是不解。这有点像一个刚学打篮球的人问“王治郅和科比谁比较厉害”。当然科比更厉害一些。但如果你是想学打篮球,这两个人都非常非常有资格教你,你跟谁学都能学得很强——关键不是在于你选哪个老师,而是在于你自己用多少功夫去学。

透明:回到原来话题。学会了C++的语法,能看懂C++代码之后,必须有些书来指导进阶(或者叫指点迷津)。我觉得《设计模式》很好,能够让读者看到一些精妙的用法。不过正如我经常说的,模式带来的麻烦和好处一样多,甚至麻烦还要更多。而且,C++本身的问题使得在C++中使用GoF模式愈加麻烦。

梦魇:《Design Patterns》这本书绝对是不可以没有的,而且中英文版都不可少。最初我看中文版,说实话看不懂,但是也不觉得人家翻译得不好,所以就想,大概是原文就很难懂,加上自己水平有限。于是总是想着再找几本patterns的书来看。后来找到几本书,口碑还不错,不过水平高下,一比就出来了,还是那本《Design Patterns》最经典,最耐看。英文版出来之后,两个版本对照看,明白多了。现在觉得,其实就设计模式来讲,把这本看明白了就很不错了,不用再花费很多心思找其他的书。我现在的包里始终夹着这本书,随身携带,有备无患。
至于说设计模式的副作用,和可能带来的弊端,我的体会也挺多。不过是这样,我们想一想,究竟什么情况下设计模式可以用得很好呢?一种是有经验丰富的人引导,比如要是Robert Martin带队,你在某个地方用错了设计模式,他就会指出来,说这里不对,将来会产生什么样的弊端。对于他来说,丰富的实践经验足以支持他进行“预测型”设计。但是大部分人没这个能力,因此我们只好走第二条路和第三条路,就是“试探型”设计和“重构型”设计。遇到一个问题,你觉得用某种模式挺合适的,就大胆地用了,成功是积累经验,发现不好,出了问题了,只好改回来,那也是积累教训。这叫做“试探型”。至于重构,应该算是最有组织、成功率最高的工程化方法。先把问题“quick and dirty”地解决了,所有的暗礁都暴露出来,然后再根据实际情况采用合适的模式优化设计。现在XP和UP都高度重视refactory,UP在Elaboration和Construction阶段都鼓励抽出专门的iterations进行重构。所以说如果组织快速的软件开发,当然比较倾向于这条路——打成功率嘛。

透明:讲到重构,我顺便说说《Refactoring》这本书的影响。从工程本身的角度来说,你所谓的“重构型设计”是没有什么问题的。但中国的开发者(也包括我在内)往往比较冲动,比较容易相信银弹的存在。曾经有那么一段时间,我在Java中尝试过了重构的方法之后,又拿到C++中去尝试。结果发现,在Java中速度非常快的重构过程,到C++中就被减慢了。究其原因,就是因为C++和Java的约束条件不同。拿着Java中成功的案例直接套C++,不失败才怪。
所以,我必须说:《Refactoring》这本书很有价值。但对于C++程序员来说,它的价值是让你思考,思考这种方法的可行性。如果一个C++程序员没有打算迁移到Java,那么我必须告诉他:《Refactoring》这本书不是让你照着它用的,甚至不是让你去相信它的。对于C++程序员,《Refactoring》全书可以放心相信的只有第13章,其他的部分,都必须非常谨慎地对待。

梦魇:我还要就“试探型”的方法多说两句,我觉得对于个人发展来讲,“试探”也是必不可少的,撞墙不可怕,高水平的人不都是撞出来的吗?你失败了一次,就知道这个模式有什么潜在的问题,下次再用,就会多看几步,像下棋似的。撞的多了,路数就出来了。
我不知道你们是否有这个感觉:用错了模式,吃了亏,再回过头去翻翻《Design Patterns》,看到人家早就指出来这个问题,不过就是那么几句话,原来看上去干巴巴的,现在觉得句句都讲到心坎上,GoF的形象马上就高大起来,还带着光环,感觉是既兴奋又懊悔。

透明:现在回头来看,我更欣赏myan推荐给我的《Designing Object-Oriented C++ Applications Using Booch Method》。这本书能够帮助C++程序员理清思路培养习惯,可惜国内没有引进。相比后来商业味浓厚的UML系列书籍,我觉得这本书对于面向对象的阐释精辟独到,至今未有能出其右者。

梦魇:刚才我们两人都说到Robert Martin,他可是我的榜样。那本1995年的《Designing Object Oriented C++ Application》,我觉得是每一个C++软件工程师都应该反复研读的书。可惜不仅国内没有引进,在国外的名气也不大。如果你觉得面向对象的那些道理你好像都明白,可就是一遇到实际问题就使不上劲,那这本书就是你的最佳导师。
提到理清思路,还有一本书不得不提,就是Andrew Koenig的《Ruminations On C++》。每个人都应该问自己,我学了这么多年的C++,究竟什么是C++最基本的设计理念?遇到问题我第一个直觉是什么?第一个试探型的解决方案应该具有那些特点?如果你不能给出明确的答案,就应该认真地去读这本书,读完了你就有了“主心骨”。

透明:插一句话,谈谈“推荐书”的问题。入门书基本上是放之四海而皆准的,所以推荐的意义也不大。而入门后的发展方向,每个人不同,这个时候就需要“高人”的指点。举个例子:我学C++的时候,myan还不认识我,所以也没有给我推荐书,我还是学过来了,所以即使你当时向我推荐了《Essential C++》或者《C++ Primer》,我也不会太感谢你;但在我认真研究OO的时候,你推荐Robert Martin那本书给我,对我帮助就特别大,而且我从别的地方也很难找到类似的推荐,所以我就很感谢你。
一个程序员,必须有framework的意识,要学会用framework,还要主动去分析framework(在这方面,《Design Patterns》能有一定的帮助)。但是,真正高质量、成气候的framework的书恐怕也就只有针对MFC的。从这个角度来说,MFC纵有千般不是,C++程序员都非常有必要先去用它、熟悉它、研究它,甚至借助《深入浅出MFC》这样的书来剖析它。不然,很难有framework的意识和感觉。
当然,另一个framework也很好,那就是STL。不管用不用MFC、STL,对这两个东西的掌握和理解都是极有帮助的。最近我又在看《深入浅出MFC》,虽然已经不用MFC编程了,但帮助是一定有的。

梦魇:MFC和STL方面,我还是比较推崇侯先生的两本书《深入浅出MFC》和《STL源码解析》。
《深入浅出MFC》这本书,名气自然是大得不得了,不过也有不少人批评。其实书也没有十全十美的,批评当然是少不了的,不过有的时候我看到有人评论这本书,把它跟Inside VC相比,真的是牛头不对马嘴。
你刚才其实说得很对,程序员应该有一点framework意识。而这本《深入浅出MFC》与其说是在讲MFC编程,不如说通篇是在拿MFC为例分析Application Framework的架构和脉络。所以无论你对于MFC本身是什么态度,这本书对每一个C++程序员都有很大的益处。

透明:是的。《VC技术内幕》会告诉你“DYNAMIC_CREATE这个宏怎么用”,《深入浅出MFC》则告诉你“DYNAMIC_CREATE这个宏是怎么实现的”。所以,如果你只需要在VC下写一些小应用程序,《深入浅出MFC》的价值并不太大;但是,如果你需要设计一个稍微大一点的东西(不一定是framework),MFC的设计思想就会有所帮助。

梦魇:另外,我觉得对于MFC也应该有一个公允的评价。过去是吹捧得天上有地下无,书店里铺天盖地都是MFC的书,搞得大家只知有MFC,不知有C++,甚至直到现在还有人问:“我是学MFC呢,还是学C++?VC++是不是比C++更高级的语言?”MFC成了一尊神像,阻碍了人们的视线。所以得把它从神坛上拉下来。这就是过去一两年有很多人,包括我在内批评MFC的一个目的。可是现在大家视野开阔了,.NET也出来了,MFC不再是神像了,少数人就开始以贬损MFC为乐了。我觉得这种态度是不对的。
什么叫好的框架?我觉得在十几年的时间能够象MFC这样保持稳定并且不断进步的框架就是好的框架。可能我们在一些具体的设计问题上有不同看法,觉得“这个地方这么设计不是更漂亮吗?”很多时候是的,但是这不重要,重要的是MFC成熟稳定、有十几年的成功经验,这是最了不起的东西。
另外一点,MFC中间包括着学习Win32 API编程的最佳资料。这是除了其framework方面之外的另一个亮点。我现在使用Win32 API开发,但是经常参考MFC的源代码,收获很大。

透明:STL方面,我对于剖析它的源代码兴趣并不大,毕竟里面源代码多是算法问题。所以,《STL源码剖析》我也只是随便翻翻就束之高阁了。我觉得这本书用来做计算机系的数据结构和算法教材不错,不知道有没有老师乐意这样做。
对于STL,我的态度一向都是“应用至上”。不过,我一直认为SGI STL本身就是一本精彩的书,一本数据结构和算法的经典参考书,同时也是泛型技术的参考书。想知道一个算法是如何实现的,看看STL源代码就行;想知道如何使用type traits,STL源代码里面也有例子。看别人写的书,总觉得隔着一层纱,有点挠不到痒处的感觉。SGI STL的代码写得非常漂亮,一个C++程序员如果不看看这本书,实在是可惜。

梦魇:至于STL,除了《STL源码解析》之外,我举贤不避亲,强烈推荐侯先生与我合译的那本《The C++ Standard Library》。这本书质量之高是无需怀疑的。我现在手边常备此书,随时查阅,对我帮助很大。

透明:C++和Java相比,最大的优势就是它没有一个专门的公司来管它,最大的弱点也是它没有一个专门的公司来管它。Java程序员在学会简单的语法之后,立刻进入SUN提供的framework,一边用这个现成的framework做实际开发,一边在开发过程中继续学习Java一些幽深的特性。而这个时候,C++程序员恐怕还在问“VC和BCB哪个好”呢。这无疑是浪费时间。

梦魇:刚才你说Java和C++的优劣,这个话题已经成了我们这个年代永不消失的声波了。我也不想再谈这个。不过有一点我得说清楚:现在我们很多用C++的人吃了不少苦头,探过脖子去看看Java,觉得它真是太可爱了,这种印象是不准确的。另外,Java也不简单,而且会越来越庞大复杂。在很多场合,Java还不具有竞争力。至于将来如何,我看有些Java爱好者也过分乐观了,似乎计算机科学界几十年解决不了的问题都可以借着Java的东风解决掉,恐怕没那么容易。

透明:那当然。我再次强调:No Silver Bullet。读书很重要,但古人说“行万里路,读万卷书”,还是把“行路”放在“读书”前面。尤其对于技术书籍,如果它不能帮我解决问题、不能给我带来非常实际的利益,那么我是不会去读它的。恶魔说得对,我们这个社会很快餐,我们这个行业尤其很快餐,我们也只能努力适应它。

⑨ 如何自己编程小游戏

使用类编程思路清晰,可读性强,本例通过编写贪吃蛇展示类的基本应用。最终效果如下:

网页教学网:本文中全部的Fla源码在文章最后全部打包供大家下载研究学习使用。

看不懂链接名等内容的,可以看我的另一个教程“ 简单射击游戏教程 ”,或许有所帮助。全部源文件如下:贪吃蛇—类编程.rar

第一步:“蛇”类初始化

新建fla文件,同目录下新建as文件,取名Snake.as,类名必须和文件名相同。fla文件中新建蛇节点元件,链接名为node,第一帧和类中写入相应代码。
第一步:“蛇”类初始化.rar

第二步:蛇的移动

写个move方法,在init方法中设置时间间隔。
第二步:蛇的移动.rar

第三步: 键盘改变移动方向

写个changeDirection方法,在主场景第一帧用键盘事件调用该方法,控制蛇的方向。
第三步:键盘改变移动方向.rar

第四步:增加节点

写个addNode方法,新节点产生在蛇尾即nodes[length - 1]的位置上,暂时加个按钮调用addNode方法,观察结果。
第四步:增加节点.rar

第五步:碰撞判断

修改move方法,假如头节点与蛇身其他部位重合,clearInterval删除move的定时调用。同时changeDirection也要加多个判断,不能让头节点和第二节点重合,加多这个判断是为了防止一个Bug的产生,一些贪吃蛇程序并没有注意到这点。这个Bug产生原因如下:
假设蛇向右移动,是不能进行向左改变方向,但由于move方法是定时调用的,比如每300毫秒一次,所以在这300毫秒内可能进行了多次快速按键。第一次按向下,蛇的xDirection和yDirection改变为向下,但move的执行时间没到,又紧接着按左,因为蛇方向在数据上已经改变,所以捕捉不到不能向左的判断,快速按键造成蛇反向移动的Bug就产生了,加个上述判断就好了。
第五步:碰撞判断.rar

第六步:食物类编写

新建Food类,注意用extends继承MovieClip,这样元件才能链接它,在主场景中新建食物元件,链接Food类,实例名为food,拖入场景。在Food中写入appear和disappear方法,做两个临时按键调用它们观察效果。
第六步:食物类编写.rar

最终完成:吃食物

Food中定时调用appear,并通过setSnake引入Snake实例snake,判断蛇身坐标不让新食物与之重合。Snake中通过setFood引入Food实例food,判断是否吃到食物,做出相应处理,如食物消失,增加蛇节点,改变setSnake。场景第一帧也要setSnake引入蛇头。

以后还要增加新功能,如阻碍物设置等,都可以通过改变as文件完成。虽然类编程比直接控制影片较为繁琐,但由于使用了面向对象,以后再对程序进行完善时都可依照对象行为思考,每个方法就是对象的每个行为,什么行为需要改变就找对应的方法修改,思路清晰。

阅读全文

与从游戏里编程经典案例相关的资料

热点内容
引力app在哪里下载 浏览:605
编写app如何得到钱 浏览:798
吉利汽车软件放哪个文件夹安装 浏览:223
多文件编译c 浏览:541
头顶加密后为什么反而更稀疏 浏览:793
离心机压缩机扬程高 浏览:658
xshell连接linux命令 浏览:5
把多个文件夹的内容合并在一起 浏览:483
基于单片机的浇花系统设计ppt 浏览:685
卷积码编译码及纠错性能验证实验 浏览:354
请在删除驱动器之前暂停加密什么意思 浏览:787
光催化pdf 浏览:98
java字符串包含某字符 浏览:528
ssm身份认证源码 浏览:466
预排序遍历树算法 浏览:671
加密装置如何打开ping功能 浏览:478
python下载372 浏览:901
u盘子文件夹隐藏 浏览:296
本地误删svn文件夹 浏览:685
海康威视python通道名 浏览:241