求推荐用C语言晶晨硬件开发教程推荐游戏的教程资料!

用C语言编写的简单的猜数字游戏
#include &stdio.h&
#include &time.h&
#include &stdlib.h&
int main()
int random = 0;
int input = 0;
int start = 1;
while (start)
printf(&*********************\n&);
printf(&**1 start
0.exit**\n&);
printf(&*********************\n&);
printf(&请选择:&&);
scanf(&%d&, &start);
switch (start)
srand((unsigned)time(NULL));
random = rand()%100;
printf(&请输入你猜的数:&&);
scanf(&%d&, &input);
if (input & random)
printf(&猜大了\n&);
else if (input & random)
printf(&猜的太小了\n&);
printf(&你好厉害啊\n&);
printf(&感谢使用猜数字游戏,bye bye\n&);C语言是一门重要的基础课程,但传统教材一般偏向于语法规则的介绍,实例偏数学算法,过于抽象、趣味性不强。针对这些问题,本书把游戏开发实践应用于C语言课程设计教学,课程设计中尽量站在初学者的角度,降低开发游戏的难度,不超出所学知识范围,逐步提高读者对编程的兴趣和能力。本书的授课方法已在实际教学中验证,大一学生普遍能写出数千行代码的复杂游戏,编程能力显著提升。
C语言是一门重要的基础课程,但传统教材一般偏向于语法规则的介绍,实例偏数学算法,过于抽象、趣味性不强。针对这些问题,本书把游戏开发实践应用于C语言课程设计教学,课程设计中尽量站在初学者的角度,降低开发游戏的难度,不超出所学知识范围,逐步提高读者对编程的兴趣和能力。本书的授课方法已在实际教学中验证,大一学生普遍能写出数千行代码的复杂游戏,编程能力显著提升。
目录第1章C语言游戏开发快速入门1.1弹跳的小球1.1.1显示静止的小球1.1.2小球下落1.1.3上下弹跳的小球1.1.4斜着弹跳的小球1.1.5控制小球弹跳的速度1.1.6小结1.2最简单的飞机游戏1.2.1scanf控制飞机移动1.2.2getch控制飞机移动1.2.3显示复杂的飞机图案1.2.4发射激光1.2.5打靶练习1.2.6小结1.3程序调试方法1.3.1语法错误1.3.2逻辑错误1.3.3常用技巧第2章函数封装的游戏开发2.1飞机游戏2.1.1代码重构2.1.2新式子弹2.1.3静止的敌机2.1.4敌机移动2.1.5击中敌机2.1.6清屏功能2.1.7小结2.2用函数实现反弹球消砖块2.2.1代码重构2.2.2显示边框2.2.3显示移动挡板2.2.4反弹小球2.2.5消砖块2.2.6小结2.3flappy bird2.3.1下落的小鸟2.3.2显示小鸟和障碍物2.3.3让障碍物移动2.3.4判断是否碰撞2.3.5障碍物循环出现2.3.6小结第3章应用数组的游戏开发3.1生命游戏3.1.1游戏的初始化3.1.2繁衍或死亡3.1.3小结3.2用数组实现反弹球消砖块3...
直属事业部
扫描关注官方微博
扫描关注官方微信
版权所有(C)2014 清华大学出版社有限公司 京ICP备号 京公网安备48号教你如何使用C语言编写简单小游戏_百度知道
教你如何使用C语言编写简单小游戏
我有更好的答案
//声明#include&stdio.h&#include&stdlib.h&#include&time.h&#include&conio.h&#include&windows.h&#define SIZE 4static int score=0;void putn(int n[][SIZE]);void getn(int n[][SIZE]);int isempty(int n[][SIZE]);int isfull(int n[][SIZE]);void math(int n[][SIZE],char c);void tow(int n[][SIZE]);void toa(int n[][SIZE]);void tos(int n[][SIZE]);void tod(int n[][SIZE]);//主函数int main(){
int n[SIZE][SIZE];
char c=' ';
for(i=0;i&SIZE;i++)
for(j=0;j&SIZE;j++)
n[i][j]=0;
printf( &***********************\n&
2048(%dX%d)
control:W/A/S/D
&press any key to begin \n&
&***********************\n&,SIZE,SIZE);
system(&cls&);
//n[0][1]=2048;
//n[0][3]=2048;
if(isempty(n))
if(!isempty(n)&&isfull(n))
sleep(200);
c=getch();
while(c!='w'&&c!='a'&&c!='s'&&c!='d')
c=getch();
math(n,c);
system(&cls&);
Game Over!\n&,score);
return 0;}//函数void putn(int n[][SIZE]){
for(i=0;i&SIZE;i++)
for(j=0;j&SIZE;j++)
printf(&|\n&);
for(j=0;j&SIZE;j++)
if(n[i][j]==0)
printf(&|%4d &,n[i][j]);
printf(&|\n&);
for(j=0;j&SIZE;j++)
printf(&|_____&);
printf(&|\n&);
printf(&score: %d&,score);}void getn(int n[][SIZE]){
a=rand()%SIZE;
b=rand()%SIZE;
while(n[a][b]!=0)
a=rand()%SIZE;
b=rand()%SIZE;
n[a][b]=2;}int isempty(int n[][SIZE]){
int i,j,count=0;
for(i=0;i&SIZE;i++)
for(j=0;j&SIZE;j++)
if(n[i][j]==0)
count++;}int isfull(int n[][SIZE]){
int i,j,count=0;
for(i=0;i&SIZE;i++)
for(j=1;j&SIZE-1;j++)
if(n[i][j]==n[i][j+1]||n[i][j]==n[i][j-1])
for(j=0;j&SIZE;j++)
for(i=1;i&SIZE-1;i++)
if(n[i][j]==n[i+1][j]||n[i][j]==n[i-1][j])
return count&0?0:1;}void math(int n[][SIZE],char c){
case 'w':tow(n);
case 'a':toa(n);
case 's':tos(n);
case 'd':tod(n);
default :;
}}void tow(int n[][SIZE]){
int i,j,a;
int m[SIZE];
for(a=0;a&SIZE;a++)
m[a]=0;for(j=0;j&SIZE;j++){
for(a=0;a&SIZE;a++)
for(i=0;i&SIZE-1;i++)
if(n[i][j]==0)
n[i][j]=n[i+1][j];
n[i+1][j]=0;
}}for(j=0;j&SIZE;j++){
for(a=0,i=0;i&SIZE;i++)
if(n[i][j]!=n[i+1][j]&&n[i][j]!=0||n[i][j]==2048)
m[a++]=n[i][j];
n[i][j]=0;
else if(n[i][j]==n[i+1][j])
m[a++]=n[i][j]+n[i+1][j];
score+=m[a-1];
n[i][j]=0,n[i+1][j]=0;
for(i=0;i&SIZE;i++)
n[i][j]=m[i];
}}}void toa(int n[][SIZE]){
int i,j,a;
int m[SIZE];
for(a=0;a&SIZE;a++)
m[a]=0;for(i=0;i&SIZE;i++){
for(a=0;a&SIZE;a++)
for(j=0;j&SIZE-1;j++)
if(n[i][j]==0)
n[i][j]=n[i][j+1];
n[i][j+1]=0;
}}for(i=0;i&SIZE;i++){
for(a=0,j=0;j&SIZE;j++)
if(n[i][j]!=n[i][j+1]&&n[i][j]!=0||n[i][j]==2048)
m[a++]=n[i][j];
n[i][j]=0;
else if(n[i][j]==n[i][j+1])
m[a++]=n[i][j]+n[i][j+1];
score+=m[a-1];
n[i][j]=0,n[i][j+1]=0;
for(j=0;j&SIZE;j++)
n[i][j]=m[j];
}}}void tos(int n[][SIZE]){
int i,j,a;
int m[SIZE];
for(a=0;a&SIZE;a++)
m[a]=0;for(j=SIZE-1;j&=0;j--){
for(a=SIZE-1;a&=0;a--)
for(i=SIZE-1;i&0;i--)
if(n[i][j]==0)
n[i][j]=n[i-1][j];
n[i-1][j]=0;
}}for(j=SIZE-1;j&=0;j--){
for(a=SIZE-1,i=SIZE-1;i&=0;i--)
if(n[i][j]!=n[i-1][j]&&n[i][j]!=0||n[i][j]==2048)
m[a--]=n[i][j];
n[i][j]=0;
else if(n[i][j]==n[i-1][j])
m[a--]=n[i][j]+n[i-1][j];
score+=m[a+1];
n[i][j]=0,n[i-1][j]=0;
for(i=SIZE-1;i&=0;i--)
n[i][j]=m[i];
}}}void tod(int n[][SIZE]){
int i,j,a;
int m[SIZE];
for(a=0;a&SIZE;a++)
m[a]=0;for(i=SIZE-1;i&=0;i--){
for(a=SIZE-1;a&=0;a--)
for(j=SIZE-1;j&0;j--)
if(n[i][j]==0)
n[i][j]=n[i][j-1];
n[i][j-1]=0;
}}for(i=SIZE-1;i&=0;i--){
for(a=SIZE-1,j=SIZE-1;j&=0;j--)
if(n[i][j]!=n[i][j-1]&&n[i][j]!=0||n[i][j]==2048)
m[a--]=n[i][j];
n[i][j]=0;
else if(n[i][j]==n[i][j-1])
m[a--]=n[i][j]+n[i][j-1];
score+=m[a+1];
n[i][j]=0,n[i][j-1]=0;
for(j=SIZE-1;j&=0;j--)
n[i][j]=m[j];
}}}需要注意的是:srand((unsigned) time(0);rand();是固定形式,不要更改任何一个字符!如果不能编译,请把sleep(200);注释掉,如果提示不能找到system(&cls&);请把system(&cls&)更换为clrscr();
采纳率:80%
来自团队:
x,包括x坐标和y坐标*/ int xv,&#47!&quot, 2)来输出一个笑脸. 现在我们把Hello,world程序改成一个更好看的H);*该点在x轴,y轴的速度*&#47.h;*垂直方向按y轴的速度运动*/运动后还要判断物体是否出界,如果出了界,就令物体反弹;*水平方向按x轴的速度运动*/man.y += man,我们在判断按键的switch语句的各个分支加上了判断语句,如下.C语言在与硬件联系紧密的编程中;) break.y == des.y) /*如果人的坐标等于目的地的坐标*&#47,我猜你们都喜欢吧!下面就让我们来做一个小动画吧;/*该点的位置,即让 它下一刻的速度等于现在的速度的相反数, 心动的开始,一个运动中的笑脸 大家小时侯喜欢看动画片吗?哈哈;{ gotoxy(35.3;*&#39,让物体按其速度移动一段距离;, 2); /*输出ASCII码值为2的&quot爱玩是人的天性,而C语言是我们计算机专业都要学习的一门基础 学科:struct move_point{ int x, y,world.在main函数里,我们定义了&quot,ASCII码也有 许多非常好玩的字符,比如ASCII码值为2的就是一个笑脸,我们还可以相互分享好的游戏地图呢. 尾声: 在C++等高级语言还没出来的时候,很多应用程序也是C语言开发的,如果有的话;笑脸&quot,再画出该物体.让我们看到以下代码:gotoxy( printf(&搬运工&吧!程序依然用数组map来保存地图,数组元素如果为空格则表示什么也没有,'%c\b&/*在屏幕上输出字符串&Hello,world!&*/return 0.好的,我们在switch中增加了这些判断语句.程序还有一个重要的功能就是判断胜利.数组Des用来记录全部目的地的坐标,我们每执行一步操作后;哇噻!真棒;表示目的地!&quot,就不执行下去*&#47,我们可以通过修改map数组来制作不同的游戏地图;/*把光标移到指定的坐标*&#47. 1, 总是从Hello,world开始 学习编程的第一个程序,'i'表示箱子在目的地;).在游戏循环中,我们增加了一些用来判断胜负的语句,让你很快就能卖弄出来在别人面前表现自己了.通过编游戏来学习编程.在屏幕上显示一个运动的小笑脸,而且当它到达屏幕的边缘时会自动弹回来.&#47.x == des.x &&b&#39.那么,我们能不能通过编一些小游戏来提高它的趣味性呢,可以通过一些小游戏.DrawMap函数在屏幕上输出迷宫的地图和一些欢迎信息, man.y).先在程序定义一个在屏幕中运动的点的结构,不失为学习计算机的一种好方法. 好了,编游戏就这么简单.不过,我们要设计一个更好玩的游戏—— 5, 聪明的搬运工 大家一定玩过&搬运工&quot.y);printf(&运动的原理是,先擦去物体先前的轨迹;的游戏吧!这是在电脑和电子字典上较流行的益智游戏,让我们动手做一个属于自己的&quot,程序就要通过Des数组判断这些目的地上是否都有箱子了.真棒啊!我们可以做游戏了;man的坐标和&目的地&quot,用它来保存迷宫的地图,其中map[x][y] == '#'表示在(x,y)坐标上的点是墙壁; //*如果前面是墙壁;表示墙壁,&#39,每执行这个程序一次都能看见上次运行留下的字符.3,我们 还希望屏幕输出一个笑脸来欢迎我们. 让我们来改进一下这个程序吧?是不是很有趣呢, 3)?不过这个笑脸一直是自己运动,world了.下面让我们开始做游戏吧! 2.下面我们就利用这个能控制它移动的笑脸来做一个更有趣的游戏吧,我们可 以用printf(&%c&.最后打印出这个笑脸.当然你还可以通过修改二维数组map来修改迷宫的地图;/*退出main函数,并返回0*/} 下面我们发现几个值得改进的地方,1,程序的运行结果一闪而过 ;字符*/printf(& &小人&des的 坐标,在return语句的前面加一句! 4, 在迷宫中探索 小时侯,我常在一些小人书和杂志上看见一些迷宫的游戏,非常喜欢玩,还常到一些书上找迷宫玩呢!1.当接收一个方向键,需要判断小人前面一格的状态,如果是空地或目的地,则人物可以直接移动;如果是墙壁,则不可移动;如果是箱子或目的地上的箱子,则需要继续判断箱子前面一格的状态;.让我们来看看这个最简单的C程序:#incolude
/*把输入输出函数的头文件包含进来*/int main(){printf(&Hello, world,我们还要先判断前面是不是有&墙壁&,实用的例子来学习.象学习音乐的人,不是要等到把全部乐理学完后才演奏一个完整的曲子.而是刚开始学时就有一些简单的曲子让你演奏,就不能往前移动了.好的;Ok! You win,趣味十足的游戏呢!当然:if (man,把学习变成游戏,我们做出了一个完整的游戏了. 首先?这样学习程序设计,就不会是一件艰苦 ,枯燥的事,表示按任意键结束.2,在printf语句前用clrscr函数清屏,要使用这个函数和getch函数,需要在程序开头再包含头文件conio:if (map[…][…] == &#39,也要改变map相应元素的值.游戏的主循环依然是接受按键:如果前一格是空地或目的地,则人推箱子前进,否则不可移动;*输出胜利信息*/….}在判断按键时,如果玩家按的是方向键;},重温一下童年的乐趣,让你立刻就有成就感;表示箱子,&#39,我们定义一个二维数组map,它变得象电脑游戏一样充满好奇,富有乐趣!&#&#39.其实我觉得学习编程,希望大家也尝试用C语言或其他的语言来做几个自己喜欢的小游戏:gotoxy(man.x, man,能不能 让我们来控制它运动呢?
不过这个程序没有什么目的,也没有什么判断胜负的条件;);怎么样.而且是一个老少皆宜,一般就是打印一个亲切的词语——&Hell o:getch ();.我们以后每推一下箱子,不但要改变屏幕的显示,让它更有挑战性.2;#&#39.&#47.好的,现在我们用C语言来编个迷宫的游戏;/*输出一个空格,把先前的字符擦去*/然后我们让物体按其速度运动:man.x += man.一般来说,是比较枯燥的,也占有重要地位
本回答被提问者采纳
/*水平方向按x轴的速度运动*&#47!&quot,让我们动手做一个属于自己的&搬运工&.让我们来看看这个最简单的C程序:#incolude &stdio.h&gt,则人物可以直接移动.x && man.y == des! You win!&); /*输出胜利信息*&#47! 2, 心动的开始,如下:switch (key) /*对变量key的值进行判断*&#47,需要判断小人前面一格的状态, 在迷宫中探索 小时侯, … /*让物体向上运动;*输出一个空格;表示箱子在目的地.我们以后每推一下箱子, man.y),就令物体反弹,即让 它下一刻的速度等于现在的速度的相反数.最后打印出这个笑脸:gotoxy(, 2)来输出一个笑脸,在printf语句前用clrscr函数清屏;…,而且当它到达屏幕的边缘时会自动弹回来.先在程序定义一个在屏幕中运动的点的结构:struct move_point{ int x. 现在我们把H &#47,我们 还希望屏幕输出一个笑脸来欢迎我们;Hello,world程序改成一个更好看的Hello,world了;} 下面我们发现几个值得改进的地方:gotoxy(man.x, man,先擦去物体先前的轨迹,让物体按其速度移动一段距离,再画出该物体,还常到一些书上找迷宫玩呢.好的,如果是空地或目的地;#&#39,并退出switch*/case LEFT: /*向左键*/ … break.2;%c&quot.y);/,表示按任意键结束;;&#47,1;*如果前面是墙壁,就不执行下去*/哇噻?哈哈,我猜你们都喜欢吧:man爱玩是人的天性,而C语言是我们计算机专业都要学习的一门基础 学科,比如ASCII码值为2的就是一个笑脸,我们可 以用printf(&quot,world,如果接收的是方向键,程序的运行结果一闪而过 .2,每执行这个程序一次都能看见上次运行留下的字符,不但要改变屏幕的显示,也要改变map相应元素的值.游戏的主循环依然是接受按键.当接收一个方向键,我常在一些小人书和杂志上看见一些迷宫的游戏.x += man.xv!下面就让我们来做一个小动画吧.在屏幕上显示一个运动的小笑脸: &#47,如果玩家按的是方向键,我们还要先判断前面是不是有&然后我们让物体按其速度运动, world!&);&#47,数组元素如果为空格则表示什么也没有,我们定义了&小人&man的坐标和&quot!真棒,我们做出了一个完整的游戏了.当然你还可以通过修改二维数组map来修改迷宫的地图,让它更有挑战性.不过; …&#47,y)坐标上的点是墙壁.DrawMap函数在屏幕上输出迷宫的地图和一些欢迎信息.在main函数里;i'*该点的位置,包括x坐标和y坐标*&#47. 1, 总是从Hello,world开始 学习编程的第一个程序,我们要设计一个更好玩的游戏—— 5,{case UP: /*如果按的是向上键*&#47,否则不可移动.好的,要使用这个函数和getch函数,y轴的速度*/};运动的原理是; … /*让物体向下运动;墙壁&quot.那么,我们能不能通过编一些小游戏来提高它的趣味性呢;如果是箱子或目的地上的箱子, 交互的实现——让我们来控制笑脸运动 这个程序的主要功能是接受按键,&#47,需要在程序开头再包含头文件conio.h.3,ASCII码也有 许多非常好玩的字符.程序还有一个重要的功能就是判断胜利;*如果人的坐标等于目的地的坐标*/{ gotoxy(35, 3); printf(&Ok,把先前的字符擦去*&#47,一个运动中的笑脸 大家小时侯喜欢看动画片吗.}在判断按键时,'b'表示箱子;*等待按键*/key = bioskey(0)?答案是肯定的,让我们继续往下学吧! 3;/*其他按键则忽略处理*/}怎么样;表示在(x,如下:if (map[…][…] == '#')&#47!&/*垂直方向按y轴的速度运动*/*向左运动*/case RIGHT;运动后还要判断物体是否出界. 让我们来改进一下这个程序吧!1,在return语句的前面加一句:getch ().x.3;*把光标移到指定的坐标*/printf(&quot,我们增加了一些用来判断胜负的语句:if (man.x ==*在屏幕上输出字符串& int xv,就让笑脸顺着方向移动,如果接收的是ESC键就退出程序,其他按键则忽略处理.接受按键我们用以下两条语句:while (bioskey(1) == 0);//*把接收的按键的键盘码赋给变量key*/然后用switch语句来判断按键以及执行相关操作;return 0;/printf(&%c\*/吧;*把输入输出函数的头文件包含进来*&#47,也没有什么判断胜负的条件.下面我们就利用这个能控制它移动的笑脸来做一个更有趣的游戏吧! 4,则需要继续判断箱子前面一格的状态:如果前一格是空地或目的地,非常喜欢玩;*向右键*&#47,'*'表示目的地,&#39,并退出switch*/case DOWN: /*如果按的是向下键*&#47,我们在switch中增加了这些判断语句;目的地&des的 坐标.在游戏循环中; &#47?这样学习程序设计,就不会是一件艰苦 ,枯燥的事,并返回0*&#47,现在我们用C语言来编个迷宫的游戏,重温一下童年的乐趣. 首先,我们定义一个二维数组map,用它来保存迷宫的地图;搬运工&的游戏吧!这是在电脑和电子字典上较流行的益智游戏!程序依然用数组map来保存地图,是不是有了玩游戏的感觉了?不过这个程序没有什么目的.下面让我们开始做游戏吧, 2),则人推箱子前进;,如果有的话,就不能往前移动了;*输出ASCII码值为2的&笑脸&字符*/怎么样?是不是很有趣呢?不过这个笑脸一直是自己运动,能不能 让我们来控制它运动呢,它变得象电脑游戏一样充满好奇,富有乐趣;int main(){printf(&quot.好的,我们在判断按键的switch语句的各个分支加上了判断语句,则不可移动.数组Des用来记录全部目的地的坐标,我们每执行一步操作后,程序就要通过Des数组判断这些目的地上是否都有箱子了.真棒啊!我们可以做游戏了.而且是一个老少皆宜,趣味十足的游戏呢!当然,我们可以通过修改map数组来制作不同的游戏地图,我们还可以相互分享好的游戏地图呢. 尾声: 在C++等高级语言还没出来的时候,很多应用程序也是C语言开发的.C语言在与硬件联系紧密的编程中,也占有重要地位.其实我觉得学习编程,可以通过一些小游戏,实用的例子来学习.象学习音乐的人,不是要等到把全部乐理学完后才演奏一个完整的曲子.而是刚开始学时就有一些简单的曲子让你演奏,让你立刻就有成就感,让你很快就能卖弄出来在别人面前表现自己了.通过编游戏来学习编程,把学习变成游戏,不失为学习计算机的一种好方法. 好了,编游戏就这么简单,希望大家也尝试用C语言或其他的语言来做几个自己喜欢的小游戏.; &);&#47,如果出了界;*向右运动*/default: break.y += man.yv,'#'表示墙壁,一般就是打印一个亲切的词语——&H*退出main函数, 聪明的搬运工 大家一定玩过&quot.y) /Hello,其中map[x][y] == &#39.让我们看到以下代码;b&;/*该点在x轴.一般来说,是比较枯燥的;如果是墙壁
puts(“求赐教!”);
其他1条回答
为您推荐:
您可能关注的内容
c语言的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。课程要求,用C++做个小软件应用游戏什么的_百度知道
课程要求,用C++做个小软件应用游戏什么的
要求大概代码2000行有木有大神帮忙想想做什么比较简单,比较好。如果大神本来就有代码愿意分享分享 感激不尽啊在厚颜无耻地说一句,代码有注释就更好啦
很急很急的
我有更好的答案
时间要求紧吗, 不仅的话我这里有电子书和对应视频。 用MFC实现的
采纳率:16%
贪吃蛇,自己下个吧,
谁会这么无聊
为您推荐:
其他类似问题
您可能关注的内容
软件应用的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。利用C语言实现2048小游戏的方法
转载 & & 投稿:daisy
2048是比较流行的一款数字游戏,相信对大家来说都不陌生,这篇文章给大家分享了利用C语言实现2048小游戏的方法,对大家学习理解C语言具有一定的参考借鉴价值,有需要的朋友们下面来一起看看吧。
首先上一张图,因为这里只是在用C语言验证算法,所以没有对界面做很好的优化,丑是理所应当的。
了解了游戏的工作原理,实际上可以将游戏描述为四个带有方向的同一操作:
&&& 1、将所有数字向一个方向移动至中间没有空位
&&& 2、将相邻的两个相同的数字加和然后放在更靠近移动方向前部的一个位置上
另外需要判断一下玩家当前输入的内容是否可以执行,如果不可以执行等待用户下一条记录。
同时需要对游戏的进程进行控制,如果可以继续游戏,那么运行玩家继续输入下一条指令,而如果不可以进行,那么提示无法继续游戏的提示。
首先的问题就是光标键的输入。光标键属于功能键,使用常规的scanf当然是无法进行读取的,而使用更加接近硬件的getch()进行以字节为单位的标准输入。当使用getch()函数进行标准输入时,如果用户输入了一个功能键,例如光标键、Home、PgUp、PgDn、End之类的键,getch()将能够读取得到两个字符。当遇到功能键输入的时候,可以编写一个检测程序以获取对应按键的数据:
#include&stdio.h&
int main(){
printf("%d\n",getch());
随后运行这个数据提取程序,程序将按照一个字节一行,以整型的格式输出getch得到的数据。这里我查询到2048需要用到的四个按键↑↓←→对应的两个字节为:
然后就是游戏的主要的代码
#include&stdio.h&
//标准输入输出
#include&stdlib.h&
//基本工具函数
#define bool int
//C里边没有布尔类型,就自己造
#define true 1
//bool的两种值
#define false 0
int MAP[4][4]= {0};
//地图,默认0认为是空位
typedef enum {
//定义一个方向类型的枚举变量
void printMap();
//绘制图形
Direction getNextDirection(); //从键盘读入下一个用户操作
bool canMove(Direction direction); //判断是否可以进行指定方向的操作
void doAction();
//游戏事件
void move(Direction direction);
//移动数字
void putNew();
//放入一个新的数字
int main() {
Direction nextS
srand(time(0));
//游戏开始默认放两个数字
printMap();
//打印格子
while(1) {
if(!canMove(UP)&&!canMove(LEFT)&&!canMove(DOWN)&&!canMove(RIGHT)) //任意方向都不能移动,那么终止游戏
nextStep=getNextDirection();
//获取下一个用户操作
if(nextStep==UNKNOW)
//如果不知道用户按了个什么键或者用户胡乱按的,那么进入新的循环
if(!canMove(nextStep)) //如果下一步不可继续操作,进入新的循环
system("cls");
//对于Windows来说,执行命令行命令cls清屏
doAction(nextStep);
//执行操作
//放新的数字
printMap();
//打印格子
printf("You Died!");
//提示游戏结束
//等待游戏结束
void printMap() {
printf("*-------*-------*-------*-------*\n");
for(i=0; i&4; i++) {
printf("|");
for(j=0; j&4; j++) {
MAP[i][j]?printf("%d",MAP[i][j]):printf(" ");
printf("\t|");
printf("\n");
printf("*-------*-------*-------*-------*\n");
void doAction(Direction direction){
int i,j,k;
* 为了方便处理问题,将每个方向的运动操作简化为三步
* 1.将数字归并到一个方向
* 2.处理相同数字可消,并将消掉的数据定为0
* 3.再次将数字归并到一个方向
//1.移动数字,取消数字之间的空位
move(direction);
//2.按照方向处理相同数字
switch(direction){
//按列枚举
for(i=0;i&4;i++){
//对于每一行的每一个元素
for(j=0;j&3;j++){
//如果元素非零,并且当前和下一个相同,当前的翻倍,下一个置零
if(MAP[j][i]&&MAP[j][i]==MAP[j+1][i]){
MAP[j][i]+=MAP[j+1][i];
MAP[j+1][i]=0;
case LEFT://同上
for(i=0;i&4;i++)
for(j=0;j&3;j++)
if(MAP[i][j]&&MAP[i][j]==MAP[i][j+1]){
MAP[i][j]+=MAP[i][j+1];
MAP[i][j+1]=0;
case DOWN://同上
for(i=0;i&4;i++)
for(j=3;j&0;j--)
if(MAP[j][i]&&MAP[j][i]==MAP[j-1][i]){
MAP[j][i]+=MAP[j-1][i];
MAP[j-1][i]=0;
case RIGHT://同上
for(i=0;i&4;i++)
for(j=3;j&0;j--)
if(MAP[i][j]&&MAP[i][j]==MAP[i][j-1]){
MAP[i][j]+=MAP[i][j-1];
MAP[i][j-1]=0;
//3.移动数字,取消因为上一步置零过程中新产生的空位
move(direction);
void move(Direction direction) { //移动数字
int i,j,k;
switch(direction) {
//按列枚举
for(i=0;i&4;i++)
//对于每一行的每一个元素
for(j=0;j&4;j++)
//如果非零,那么应当取消当前位置,后边元素向前移动
if(!MAP[j][i]){
for(k=j;k&3;k++){
MAP[k][i]=MAP[k+1][i];
//新产生的空位置零
MAP[k][i]=0;
case LEFT://同上
for(i=0;i&4;i++)
for(j=0;j&4;j++)
if(!MAP[i][j]){
for(k=j;k&3;k++){
MAP[i][k]=MAP[i][k+1];
MAP[i][k]=0;
case DOWN://同上
for(i=0;i&4;i++)
for(j=3;j&=0;j--)
if(!MAP[j][i]){
for(k=j;k&0;k--){
MAP[k][i]=MAP[k-1][i];
MAP[k][i]=0;
case RIGHT://同上
for(i=0;i&4;i++)
for(j=3;j&=0;j--)
if(!MAP[i][j]){
for(k=j;k&0;k--){
MAP[i][k]=MAP[i][k-1];
MAP[i][k]=0;
bool canMove(Direction direction) { //判断是否可以进行指定方向的操作
switch(direction) {
//依次检查每一列
for(i=0;i&4;i++){
//首先排除在远端的一串空位,直接将j指向第一个非零元素
for(j=3;j&=0;j--)
if(MAP[j][i])
//j&0代表这一列并非全部为0
//依次检查每一个剩余元素,遇见空位直接返回true
for(;j&=0;j--)
if(!MAP[j][i])
//依次检查相邻的元素是否存在相同的非零数字
for(j=3;j&0;j--)
if(MAP[j][i]&&MAP[j][i]==MAP[j-1][i])
case DOWN://同上
for(i=0;i&4;i++){
for(j=0;j&4;j++)
if(MAP[j][i])
for(;j&4;j++)
if(!MAP[j][i])
for(j=0;j&3;j++)
if(MAP[j][i]&&MAP[j][i]==MAP[j+1][i])
case LEFT://同上
for(i=0; i&4; i++){
for(j=3;j&=0;j--)
if(MAP[i][j])
for(;j&=0;j--)
if(!MAP[i][j])
for(j=0;j&3;j++)
if(MAP[i][j]&&MAP[i][j]==MAP[i][j+1])
case RIGHT://同上
for(i=0; i&4; i++){
for(j=0;j&4;j++)
if(MAP[i][j])
for(;j&4;j++)
if(!MAP[i][j])
for(j=0;j&3;j++){
if(MAP[i][j]&&MAP[i][j]==MAP[i][j+1])
//当允许条件都被检查过后,返回不可执行的结果
Direction getNextDirection() {
//第一个字节必须是224,否则判定输入的不是功能键
if(getch()!=224) return UNKNOW;
//根据第二字节对应出来用户的操作
switch(getch()) {
return UP;
return DOWN;
return LEFT;
return RIGHT;
return UNKNOW;
void putNew(){
//为了方便操作,临时存储一下所有空闲格子的指针,这样可以用一个线性的内存随机访问实现对所有空位中任一空位的随机访问.
int* boxes[16]={NULL};
//用来临时保存目标格子的地址
//统计一共有多少个有效空格
int count=0;
//统计空位,发现空位即保存地址并累加计数器
for(i=0;i&4;i++)
for(j=0;j&4;j++)
if(!MAP[i][j]){
boxes[count]=&MAP[i][j];
if(count){
//如果有空位,那么对这一位进行随机赋值操作,对于每一位可能性是相同的
target=boxes[rand()%count];
//50%可能出现2 50% 可能出现4
*target=rand()%2?2:4;
以上就是这篇文章的全部内容了,小编认为像俄罗斯方块、2048这些稍微偏算法的小游戏是程序员必写的几个小程序。希望这篇文章对大家的学习或者工作能有所帮助,如果有疑问大家可以留言交流。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 开发用笔记本推荐 的文章

 

随机推荐