c++游戏编程过程
发布时间:2025-05-23 21:15:59 发布人:远客网络
一、c++游戏编程过程
C++效率高,游戏一般需要运行的非常快,其它语言都不如C++编写的程序快,所以一般用C++编写游戏的表现效果是最好的,所以你的选择很对,当然现学JAVA游戏编程也很好的。
学习编程最重要的是有恒心,多积累经验,多自己尝试编些东西,你上面写的东西说明你已经有了很大的决心,这点很可贵,学习过程中有困难是肯定的,但我凭上面你说的相信你会成功的,建议如下:
钱能. C++程序设计教程.第一版.清华大学出版社
然后再学一下VC++,再自己试着多编一些东西,编程最重要的是积累经验。
写游戏主要是理解面向对象,OOA,OOD,设计模式和算法设计,特别是游戏中设计到的各种寻路算法,等等。!完成了上面两步工作,有空再多看看面向对象编程和设计方面的书籍,UML,设计模式类的书籍,再专门找些游戏编程的书经常研究,你就完全可以从事软件开发这个很有“前途”的职业了
Visual C++游戏编程人员至少要会的:
软件工程,会用某个源代码管理工具(VSS SVN什么的)
数据结构和算法,游戏编程对效率比较关心。
英语,许多好的资料都是英文的。
再给你介绍一些网站能找c++游戏编程的资料:
游戏制作人的网络平台www.gameres.com
购买游戏编程书籍的专业网站www.dearbook.com
学一个月,可以用VC写一些小程序自己玩玩
学两个月,可以用VC写像样点的东西在周围人面前炫炫
学三个月,可以用VC给老板开始干活了
学一年后,决定要不要继续,if(继续)学习MFC、ATL、STL、C#、BCB、Network、Databa
se、Algorithm... else开始就是个错误
学三年后,学会怎么来用编程语言来解决问题,VC、BCB等都只是解决问题的工具。这时候
你如果还在学C++,你可以从事软件开发这个很有“前途”的职业了
学习C++基础然后到掌握C++游戏编程这个过程要多久时间?
这个问题并不能给出明确的回答,因为学习这东西因人而异,如果你是很认真的学,作为正常人,2至3个月,可以在这个语言入门了(是指语言的基本用法,不包括界面之类的东西)。
但是要游戏编程,你得先学windows编程,例如MFC(据我所知,暴雪的魔兽世界也是以MFC为基础编写的),但是游戏里面使用了大量的DirectX的函数,你还得花上两个月的时间去学习DirectX编程。总体上需要的时间是8个月到一年。还有就是你一定要懂得一些基本的算法和数据结构。
推荐《windows游戏编程大师技巧(第二版)》和它的下卷《3D游戏编程大师技巧》。作者讲的比较浅显易懂,而且风格也比较幽默。
opengl和directx都是标准,计算机图形api的标准,和有没有硬件加速无关
opengl是The Industry's Foundation for High Performance Graphics,公开标准,很多公司共同参与的
directx只有微软参与,而且只能在微软的平台上运行
PC游戏越来越趋向directx,主机还是趋向于opengl es,其实说白了这2个没很大差别,学习的话directx资料多点,sdk也很好用。
顺便说一下,游戏的主流运行环境不是windows,是主机。
二、用C语言编写小游戏
用c语言编写一个五子棋吧,不怎么难,给你程序,自己参考一下
#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);/*输出胜利者信息*/
initgraph(&gd,&gr,"c:\\tc");/*初始化图形系统*/
closegraph();/*关闭图形系统*/
score1=score2=0;/*棋手一开始得分都为0*/
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);/*黑色实体填充模式*/
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);
fillellipse(120+3*40,120+4*40,15,15);
fillellipse(120+4*40,120+3*40,15,15);
score1=score2=2;/*有棋后改变分数*/
x=120,y=80;/*每次棋子一开始出来的坐标,x为行坐标,y为列坐标*/
while(1)/*具体一个棋手走棋的过程*/
PrintScore(1);/*输出棋手1的成绩*/
PrintScore(2);/*输出棋手2的成绩*/
SetPlayColor(t);/*t变量是用来判断棋手所执棋子的颜色*/
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移动*/
if(!QpChange(x,y,t))/*落子后判断棋盘的变化*/
a[(x-120)/40][(y-120)/40]=0;/*恢复空格状态*/
if(cc>=64-score1-score2)/*如果尝试超过空格数则停步*/
break;/*棋盘变化了,则轮对方走棋*/
if(key==LEFT&&x>120)/*左方向键*/
if(key==RIGHT&&x<400&&y>80)/*右方向键*/
if(key==UP&&y>120)/*上方向键*/
if(key==DOWN&&y<400)/*下方向键*/
if((score1+score2)==64||score1==0||score2==0)/*格子已经占满或一方棋子为0判断胜负*/
t=t%2+1;/*一方走后,改变棋子颜色即轮对方走*/
void SetPlayColor(int t)/*设置棋子颜色*/
setfillstyle(SOLID_FILL,15);/*白色*/
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])
setfillstyle(SOLID_FILL,15);break;/*白色*/
setfillstyle(SOLID_FILL,8);break;/*黑色*/
setfillstyle(SOLID_FILL,BLUE);/*蓝色*/
int QpChange(int x,int y,int t)/*判断棋盘的变化*/
i=(x-120)/40;/*计算数组元素的行下标*/
j=(y-120)/40;/*计算数组元素的列下标*/
SetPlayColor(t);/*设置棋子变化的颜色*/
if(a[i][k]==a[i][j]||a[i][k]==0)/*遇到自己的棋子或空格结束*/
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)/*条件成立则有棋子改变过颜色*/
if(a[i][k]==a[i][j]||!a[i][k])
for(kk=j-1;kk>k&&k>=0;kk--)
fillellipse(120+i*40,120+kk*40,15,15);
if(a[k][j]==a[i][j]||!a[k][j])
for(kk=i+1;kk<k&&k<8;kk++)
fillellipse(120+kk*40,120+j*40,15,15);
if(a[k][j]==a[i][j]||!a[k][j])
for(kk=i-1;kk>k&&k>=0;kk--)
fillellipse(120+kk*40,120+j*40,15,15);
for(k=i-1,kk=j+1;k>=0&&kk<8;k--,kk++)
if(a[k][kk]==a[i][j]||!a[k][kk])
if(a[k][kk]&&k>=0&&kk<8)
for(ii=i-1,jj=j+1;ii>k&&k>=0;ii--,jj++)
fillellipse(120+ii*40,120+jj*40,15,15);
for(k=i+1,kk=j-1;k<8&&kk>=0;k++,kk--)
if(a[k][kk]==a[i][j]||!a[k][kk])
if(a[k][kk]!=0&&k<8&&kk>=0)
for(ii=i+1,jj=j-1;ii<k&&k<8;ii++,jj--)
fillellipse(120+ii*40,120+jj*40,15,15);
for(k=i-1,kk=j-1;k>=0&&kk>=0;k--,kk--)
if(a[k][kk]==a[i][j]||!a[k][kk])
if(a[k][kk]!=0&&k>=0&&kk>=0)
for(ii=i-1,jj=j-1;ii>k&&k>=0;ii--,jj--)
fillellipse(120+ii*40,120+jj*40,15,15);
for(k=i+1,kk=j+1;kk<8&&kk<8;k++,kk++)
if(a[k][kk]==a[i][j]||!a[k][kk])
if(a[k][kk]!=0&&kk<8&&k<8)
for(ii=i+1,jj=j+1;ii<k&&k<8;ii++,jj++)
fillellipse(120+ii*40,120+jj*40,15,15);
return yes;/*返回是否改变过棋子颜色的标记*/
score1=score2=0;/*重新开始计分数*/
if(a[i][j]==1)/*分别统计两个人的分数*/
void PrintScore(int playnum)/*输出成绩*/
if(playnum==1)/*清除以前的成绩*/
setfillstyle(SOLID_FILL,BLUE);
settextstyle(0,0,4);/*设置文本输出样式*/
if(playnum==1)/*判断输出哪个棋手的分,在不同的位置输出*/
sprintf(playone,"%d",score1);
sprintf(playtwo,"%d",score2);
void playWin()/*输出最后的胜利者结果*/
if(score2>score1)/*开始判断最后的结果*/
outtextxy(100,50,"black win!");
outtextxy(100,50,"white win!");
outtextxy(60,50,"you all win!");
三、c语言 贪吃蛇 程序
蛇每吃一个食物蛇身子就增加一格,用UP, DOWN, LEFT, RIGHT控制蛇头的运动,而蛇身子跟着蛇头走,每后一格蛇身子下一步走到上一格蛇身子的位置,以此类推。
typedef enum{UP, DOWN, LEFT, RIGHT} DIR;
struct Snake_body*next;//下一个蛇身
struct Snake_body*prev;//前一个蛇身
SetConsoleCursorPosition(hout, pos);
else if(j== 0|| j== WID- 1)//第一列或最后一列
PSNAKE pnew=(PSNAKE)calloc(1, sizeof(SNAKE));
pnew->next= head;//新创建蛇身的next指向原先的蛇头
head->prev= pnew;//原先的蛇头的prev指向新创建的蛇身
head= pnew;//把新创建的蛇身作为新的蛇头
SetConsoleCursorPosition(hout, head->pos);
if(head->pos.Y> BEG_Y+ 1)
if(head->pos.Y< BEG_Y+ HEI- 2)
if(head->pos.X> BEG_X+ 2)
if(head->pos.X< BEG_X+(WID- 2)* 2)
AddBody(pos);//添加了一个新的蛇头
SetConsoleCursorPosition(hout, ptmp->pos);
DIR dir= RIGHT;//初始蛇的方向是向右的
COORD pos={BEG_X+ 2, BEG_Y+ HEI/ 2};
system("mode con cols=90 lines=30");
hout= GetStdHandle(STD_OUTPUT_HANDLE);
printf("------------贪吃蛇的移动------------");
1,可以设置光标,就能实现制定位置打印制定符号。
2,涉及一个结构体,包含两个元素坐标元素和一个结构体指针。
3,结构体串联形成链表,遍历获取成员坐标,打印符号得到蛇身。
4,不断的加头,去尾,重新遍历坐标,再打印形成蛇的移动。
5,食物产生的位置判定,不能越界,也不能与蛇身体重合。
6,蛇的转向判定,一条规则,不允许倒退。
7,转向的实现,跟行进方向决定新的关节坐标(当前头的上下左右)
8,死亡检测,是否头节点坐标是否与墙壁重合,是否与身体其他关节重合。
9,加速减速,设置刷新休眠时间实现。