導航:首頁 > 編程語言 > 從游戲里編程經典案例

從游戲里編程經典案例

發布時間: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文件完成。雖然類編程比直接控制影片較為繁瑣,但由於使用了面向對象,以後再對程序進行完善時都可依照對象行為思考,每個方法就是對象的每個行為,什麼行為需要改變就找對應的方法修改,思路清晰。

閱讀全文

與從游戲里編程經典案例相關的資料

熱點內容
海康威視python通道名 瀏覽:239
如何用app覆蓋全部曲庫 瀏覽:602
變異布林源碼 瀏覽:684
表格加密設置列印區域 瀏覽:437
卡耐基pdf下載 瀏覽:922
現在最流行的單片機 瀏覽:88
機頂盒刷機源碼 瀏覽:985
編碼pdf下載 瀏覽:944
隔壁同學app怎麼 瀏覽:299
c語言宏命令 瀏覽:542
php卡死源碼 瀏覽:574
time庫中的clock函數python 瀏覽:989
cad視覺移動命令怎麼打開 瀏覽:821
安卓java調用python 瀏覽:395
java標准時間 瀏覽:137
華為伺服器湖北渠道商雲主機 瀏覽:30
韓式面部護理解壓視頻 瀏覽:301
pdf換成jpg圖片 瀏覽:897
dh加密演算法 瀏覽:107
安卓手機如何隱藏微信信息提示 瀏覽:632