JZ怎样用C语言编写游戏231.docx
《JZ怎样用C语言编写游戏231.docx》由会员分享,可在线阅读,更多相关《JZ怎样用C语言编写游戏231.docx(48页珍藏版)》请在冰豆网上搜索。
![JZ怎样用C语言编写游戏231.docx](https://file1.bdocx.com/fileroot1/2023-6/28/e83233f7-723d-4ab0-a7bd-91fee6c41648/e83233f7-723d-4ab0-a7bd-91fee6c416481.gif)
JZ怎样用C语言编写游戏231
如何用语言编写游戏
网络游戏是常谈的话题,是交互式娱乐的主力军,是一种高层次的综合艺术,更是一个民族的文化,世界观的全新传播方式作为游戏玩家的我们,是不是想设计一个属于自己的游戏呢?
爱玩是人的天性,而语言是我们计算机专业都要学习的一门基础学科.一般来说,是比较枯燥的.那么,我们能不能通过编一些小
游戏来提高它的趣味性呢?
这样学习程序设计,就不会是一件坚韧
枯燥的事,它变得象电脑游戏一样充满好奇,富有乐趣.这正是
我要写这文档追求.
总是从开始
学习编程的第一个程序,一般就是打印一个亲切的词语——"
!
".让我们来看看这个最简单的程序:
<>*把输入输出函数的头文件包含进来*
()
{
(",
!
")*在屏幕上输出字符串"!
"*
*退出函数,并返回*
}
下面我们发现几个值得改进的地方,程序的运行结果一闪而过
每执行这个程序一次都能看见上次运行留下的字符,我们
还希望屏幕输出一个笑脸来欢迎我们.(大家不要小看了这个笑脸
曾经有人发贴专门问呢)让我们来改进一下这个程序吧!
在语句的前面加一句();,表示按任意键结
束,在语句前用函数清屏,要使用这个函数和
函数,需要在程序开头再包含头文件码也有
许多非常好玩的字符,比如码值为的就是一个笑脸,我们可
以用("",)来输出一个笑脸.
现在我们把程序改成一个更好看的了.下
面让我们开始做游戏吧!
心动的开始,一个运动中的笑脸
大家小时侯喜欢看动画片吗?
哈哈,我猜你们都喜欢吧!
下面就让
我们来做一个小动画吧.在屏幕上显示一个运动的小笑脸,而且当
它到达屏幕的边缘时会自动弹回来.
先在程序定义一个在屏幕中运动的点的结构:
{
*该点的位置,包括坐标和坐标*
*该点在轴轴的速度*
};
运动的原理是,先擦去物体先前的轨迹,让物体按其速度移动一段
距离,再画出该物体.让我们看到以下代码:
(,)*把光标移到指定的坐标*
("")*输出一个空格,把先前的字符擦去*
然后我们让物体按其速度运动:
*水平方向按轴的速度运动*
*垂直方向按轴的速度运动*
运动后还要判断物体是否出界,如果出了界,就令物体反弹,即让
它下一刻的速度等于现在的速度的相反数.最后打印出这个笑脸:
(,);
("\",);*输出码值为的"笑脸"字符*
怎么样?
是不是很有趣呢?
不过这个笑脸一直是自己运动,能不能
让我们来控制它运动呢?
答案是肯定的,让我们继续往下学吧!
交互的实现——让我们来控制笑脸运动
这个程序的主要功能是接受按键,如果接收的是方向键,就让笑脸
顺着方向移动,如果接收的是键就退出程序,其他按键则忽略
处理.接受按键我们用以下两条语句:
(())*等待按键*
()*把接收的按键的键盘码赋给变量*
然后用语句来判断按键以及执行相关制作,如下:
()*对变量的值进行判断*
{
:
*如果按的是向上键*
…;*让物体向上运动,并退出*
:
*如果按的是向下键*
…;*让物体向下运动,并退出*
:
*向左键*
…*向左运动*
:
*向右键*
…*向右运动*
赞
回复
闲人
位粉丝
楼
:
*其他按键则忽略处理*
}
怎么样,是不是有了玩游戏的感觉了?
不过这个程序没有什么追求
也没有什么判断胜负的条件.下面我们就利用这个能控制它移动
的笑脸来做一个更有趣的游戏吧!
在迷宫中探索
小时侯,我常在一些小人书和杂志上看见一些迷宫的游戏,非常喜
欢玩,还常到一些书上找迷宫玩呢.好的,现在我们用语言来编
个迷宫的游戏,重温一下童年的乐趣.
第一步,我们定义一个二维数组,用它来保存迷宫的地图,其中
[][]''表示在()坐标上的点是墙壁函数
在屏幕上输出迷宫的地图和一些欢迎信息.
在函数里,我们定义了"小人"的坐标和"追求地"的
坐标.在游戏循环中,我们增加了一些用来判断胜负的语句:
()*如果人的坐标等于目
的地的坐标*
{
(,);
("!
!
");*输出胜利信息*
….
}
在判断按键时,如果玩家按的是方向键,我们还要先判断前面是不
是有"墙壁",如果有的话,就不能往前移动了.好的,我们在判
断按键的语句的各个分支加上了判断语句,如下:
([…][…]'')*如果前面是墙壁,就不执行
下去*
哇噻!
真棒,我们做出了一个完整的游戏了.当然你还可以通过修
改二维数组来修改迷宫的地图,让它更有挑战性.不过,我们
要设计一个更好玩的游戏——
聪明的搬运工
大家一定玩过"搬运工"的游戏吧!
这是在电脑和电子字典上较流
行的益智游戏,让我们动手做一个属于自己的"搬运工"吧!
程序依然用数组来保存地图,数组元素如果为空格则表示什么
也没有,''表示箱子,''表示墙壁,'*'表示追求地,'
'表示箱子在追求地.我们以后每推一下箱子,不但要改变屏幕的
显示,也要改变相应元素的值.
游戏的主循环依然是接受按键.当接收一个方向键,需要判断小人
前面一格的状态,如果是空地或追求地,则人物可以直接移动;如
果是墙壁,则不可移动;如果是箱子或追求地上的箱子,则需要继
续判断箱子前面一格的状态:
如果前一格是空地或追求地,则人推
箱子前进,否则不可移动.好的,我们在中增加了这些判断
语句.
程序还有一个重要的功能就是判断胜利.数组用来记录全部目
的地的坐标,我们每执行一步制作后,程序就要通过数组判断
这些追求地上是否都有箱子了.
真棒啊!
我们可以做游戏了.而且是一个老少皆宜,趣味十足的游
戏呢!
当然,我们可以通过修改数组来制作不同的游戏地图,
我们还可以相互分享好的游戏地图呢.
尾声:
在等高级语言还没出来的时候,很多应用程序也是语言开发的
语言在与硬件联系紧密的编程中,也占有重要地位.
其实我觉得学习编程,可以通过一些小游戏,实用的例子来学习.
象学习音乐的人,不是要等到把全部乐理学完后才演奏一个完整的
曲子.而是刚开始学时就有一些简单的曲子让你演奏,让你立刻就
有成就感,让你很快就能卖弄出来在别人面前表现自己了.通过编
游戏来学习编程,把学习变成游戏,不失为学习计算机的一种好方
法.
好了,编游戏就这么简单,希望大家也尝试用语言或其他的语言
来做几个自己喜欢的小游戏.
进度延迟函数
函数名:
功能:
将程序的执行暂停一段进度(毫秒)
用法:
();
重画屏幕区域的函数
函数名:
功能:
将指定区域的一个位图存到主存中
用法:
(,,,,*);
函数名:
功能:
在屏幕上输出一个位图
用法:
(,,*,);
图像大小函数
函数名:
功能:
返回保存位图像所需的字节数
用法:
(,,,);
异或模式函数
函数名:
功能:
设置图形方式下画线的输出模式
用法:
();
参数可以被设置位或者两种模式。
当被设置为,其后的图形制作将都采用异或方式。
此外之前提到的()函数也可以采用异或模式向屏幕复制图像。
检测键盘输入函数
函数名:
功能:
检查当前按下的键
用法:
();
键盘接口函数
函数名:
功能:
直接使用服务的键盘接口
用法:
();
该函数通过中断执行键盘制作,由参数来决定具体的制作。
具体制作
读取按键的码
测试是否有按键如果没有按键返回如果按键为返回如果是其他按键返回按键本身键值(直到此按键被取出后恢复)
返回状态
以下是当为的时候,返回值的具体含义
返回值触发特殊键
()函数的优点在于:
.和()函数一样可以在不影响主程序运行的情况下检测是否有按键。
.可以方便地检测普通键具体码和扫描码。
.可以方便地检测功能键具体扫描码。
.可以检测特殊按键。
.只需要一个函数就能解决检测按键和读入按键的任务。
声音与延迟函数
函数名:
功能:
以指定频率打开扬声器
用法:
();
函数名:
功能:
关闭扬声器
用法:
();
函数名:
功能:
将程序的执行暂停一段进度(毫秒)
用法:
();
()函数用于让喇叭发声,()函数用于使正在发声的喇叭静音。
要使程序中的发声的具体方法,是调用()函数并延迟一定进度,然后使用()函数静音,具体语句实现方法如下:
();
();
();
产生随即数函数
函数名:
功能:
随机数发生器
用法:
();
函数名:
功能:
随机数发生器
用法:
();
初始化随机数函数
函数名:
功能:
初始化随机数发生器
用法:
();
()函数
函数名:
功能:
通用软中断接口
用法:
(,*,*);
其中为软中断号,函数通过寄存器向中断发出具体功能命令,函数将中断调用结果返回寄存器。
()函数
函数名:
功能:
设置中的所有字节为,数组的大小由给定
用法:
*(*,,);
标准显示模式表
模式(进制)适配器显示类型颜色字符格式屏幕大小字符大小缓冲区首址属性类型
文本***彩色
文本***彩色
赞
回复
闲人
位粉丝
楼
文本***彩色
文本***彩色
文本***彩色
()文本***彩色
图形***彩色
图形***彩色
图形***彩色
图形***单色
图形***单色
图形***单色
文本单色***单色
()文本单色***单色
图形***彩色
图形***彩色
图形***彩色
图形***彩色
图形单色***单色
图形***彩色
图形***彩色
图形***彩色
图形***彩色
图形***彩色
常规内存函数
申请函数:
()()()()()()
函数名:
功能:
内存分配函数
用法:
*();
函数名:
功能:
从远堆中分配存储块
用法:
*();
函数名:
功能:
分配主存储器
用法:
*(,);
函数名:
功能:
从远堆栈中申请空间
用法:
*(,);
函数名:
功能:
重新分配主存
用法:
*(*,);
函数名:
功能:
调整远堆中的分配块
用法:
*(*,);
使用函数:
()()()()
函数名:
功能:
从源中拷贝个字节到目标中
用法:
*(**);
函数名:
功能:
设置中的所有字节为,数组的大小由给定
用法:
*(*,,);
函数名:
功能:
移动一块字节
用法:
*(**);
函数名:
功能:
拷贝字节
用法:
(,,,,);
释放函数:
()()
函数名:
功能:
释放已分配的块
用法:
(*);
函数名:
功能:
从远堆中释放一块
用法:
();
指针制作函数:
()()()
函数名:
功能:
设置一个远指针
用法:
*(,);
函数名:
功能:
获取远地址偏移量
用法:
(*);
函数名:
功能:
获取远地址段值
用法:
(*);
功能调用索引表:
功能号功能版本
功能功能功能功能功能功能功能功能功能功能功能功能功能功能功能功能功能功能取版本号请求高内存区释放高内存区全程启用全程停用局部启用局部停用查询状态查询自由扩展内存分配扩展内存块释放扩展内存块移动扩展内存块锁住扩展内存块扩展内存块解锁取句柄信息重新分配扩展内存块请求上位存储块释放上位存储块规范规范规范规范规范规范规范规范规范规范规范规范规范规范规范规范规范规范
以下是一个用线和矩形绘制的简单赛车
<>
<>
(){
;
(,"");
();
();
();
();
();
();
();
();
();
();
();
();
();
();
();
();
}
接下来我们试着绘制赛道,周围的绿化树木和简单的集装箱车
代码如下:
<>
<>
<>
<>
<>
;
;
;
()
{
;
(<)
(**);
(<)
{
();
(**);
();
}
}
()
{
;
[];
();
();
(<)
{
(,**,,**);
(,**,,**);
(,**,,**);
(,**,,**);
(,**,,**);
(,**,,**);
}
(<)
{
[];
[]**;
[];
[]**;
[];
[]**;
[];
[]**;
[];
[]**;
[];
[]**;
[][];
[][];
();
}
}
()
{
();
();
(****);
(****);
(****);
(****);
(****);
}
()
{
();
();
();
();
();
();
();
();
();
();
();
();
}
()
{
;
(,,"");
();
();
();
();
();
();
();
();
();
}
用做的简单的坦克大战小游戏(给初学者点动力)
闲人
位粉丝
楼
<>
<>
<>
<>
<>
*石头砖块水老家玩家敌人*
[][]{,
};
{
;
;
;
};
{
*行坐标*
*列坐标*
*方向*
[]*颗子弹*
*分数*
};
{
;
;
;
;
*用来判断走的路是否往返*
*是否攻击的变量,随机生成*
;
}[]*敌人的结构体,其实可以添加不同的颜色来表示不同种类的坦克*
[][];
()*图象驱动开始*
()*图象驱动结束*
()*画地图*
()*画水*
()*画砖*
()*画石头*
()*画老家*
()*去除内容*
()*画玩家*
()*画敌人*
()*输出分数*
()*玩游戏过程*
()*游戏失败*
();*延时函数传入微秒数*
()*这里开始都是按键函数*
(*)();
();
();
();
()
{
();
();
();
();
}
()*延时函数传入微秒数*
{
;
;
>>;
;
();
}
()*图象驱动开始*
{;
(,":
\\\\");
();
();
}
()*图象驱动结束*
{
();
();
}
()*画石头*
{
();
(****);
赞
回复
闲人
位粉丝
楼
}
()*画水*
{
();
(****);
}
()*画砖*
{
();
(****);
();
(****);
(****);
(****);
(****);
}
()*画老家*
{
();
();
(**);
}
()*去除内容*
{
();
();
(****);
}
()*画玩家*
{
()*玩家为红色*
(**);
()*判断玩家方向*
{
(****)*上*
(****)*右*
(****)*下*
(****)*左*
}
}
()*画敌人*
{
([])
();
([])
();
*这里是判断三种颜色的坦克*
();
(**);
([])*判断玩家方向*
{
(****)*上*
(****)*右*
(****)*下*
(****)*左*
}
}
()*输出分数*
{
[];
;
(,"");
();
();
();
();
();
}
()*画地图*
{;
(<)
{
(<)
([][])
();
([][])
();
([][])
();
([][])
();
([][])
{
;
;
;
();
(<)
[]*颗子弹的方向都为,表示不存在*
}
([][])
{
[][][][]*第一个敌人*
[];
();
}
}
(<)*敌人都没出现*
[][];
(,"");
()*首次输出得分*
();
(,"");
();
(,"");
}
()
{
;
();
();
();
();
()
{
;
[];
}
{
[];
回复
闲人
位粉丝
楼
[];
}
();
}
()
{
;
(<)
[][];
();*中断向量值*
();*中断程序地址存入指定的中断向量表中*
}
()
{
();
}
()
{
;
[][];
[];
;
}
()*游戏失败*
{
();
()*把老家给去除*
(**);
();
();
();
(,"");
()
{
(())
;
}
}
()*玩游戏的过程*
{
*是的时候表示失败*
;
();
()
{
(<)*画敌人的子弹*
{
([]>)
([]*[]*);
}
(<)*画玩家子弹*
{
([]>)*大于表示玩家子弹存在*
([]*[]*);
}
()*关键的进度改动*
(<)*去敌人的子弹*
{
([]>)
([]*[]*);
}
(<)*去玩家除子弹*
{
([]>)
([]*[]*);
}
(<)*玩家子弹位置的变化*
{
([]<)
;
([])
{[][][];}
([])
{[][][];}
([])
{[][][];}
([])
{[][][];}
*打到石头或者砖头的情况下减少子弹*
([[]][[]])*打到石头*
[]*子弹消失*
([[]][[]])*打到砖头*
{
[];
([][])*砖头打掉*
[[]][[]]*被打掉的地方变成可走的地方*
}
([[]][[]])*自己打到老家*
{;}
(<)
{
([]<)*不存在的不判断*
;
([][][][])*打中敌人*
{
[];
([][]);
[[]][[]]*被打掉的地方变成可走的地方*
[][]*这个敌人消失*
()*输出得分*
}
}
}
(<)*敌人子弹位置的变化*
回复
闲人
位粉丝
楼
{
([]<[]<)
;
([])
{[][][];}
([])
{[][][];}
([])
{[][][];}
([])
{[][][];}
*打到石头或者砖头的情况下减少子弹*
([[]][[]])*打到石头*
[]*子弹消失*
([[]][[]])*打到砖头*
{
[];
([][])*砖头打掉*
[[]][[]]*被打掉的地方变成可走的地方*
}
([[]][[]])*敌人打到老家*
{;}
([][])*打中玩家*
{
(<)
[]*玩家子弹都消失*
[];
([][]);
[[]][[]]*被打掉的地方变成可走的地方*
*好人被打掉后就失败*
}
}
();
(<)*敌人方向随机的改变*
{
([]<)
;
()
{
[]();
([][])
;
([][])
;
([][])
;
([][])*这里个是判断有没有往返走*
;
([]([[]][[]][[]][[]][[]][[]]))
;
([]([[]][[]][[]][[]][[]][[]]))
;
([]([[]][[]][[]][[]][[]][[]]))
;
([]([[]][[]][[]][[]][[]][[]]))
*以上个是是否碰到了墙壁或者水什么的*
([][])*把原来的地方擦掉*
[][];
([])
{[][][];}
([])
{[][][];}
([])
{[][][];}
([