凡铁游戏提供最新游戏下载和手游攻略!

C语言编程入门:设计与实现“推箱子”游戏

发布时间:2024-10-21浏览:25

我从小就喜欢玩电脑游戏,但我所玩过的每一个游戏都难以满足我的需求。从此,我开始自己构思游戏,并希望将来能够掌握游戏设计技术,自己制作游戏。所以,高考完后,我毅然决然地选择了北邮计算机科学与技术专业。

当我第一次看到我们所使用的Dev C++的时候,我的内心是崩溃的,在我的眼中,这个C语言编译器能做的也就是读取数据,处理数据,再把结果输出来(当时我并没有发现计算机游戏做的也就是这事),设计出的程序的界面也就是一张黑板,就这玩意能搞出个游戏出来?好吧,如果你非要把猜数字当一个游戏我也没话说。

就当我对C语言的兴趣越来越弱的时候,QQ空间中一个贪吃蛇的C语言源码吸引了我的眼球;紧接着,我看到了同班大佬用C制作的推箱子。从那时起,我开始意识到使用C语言制作游戏并不是一件不可能的事。

不久,计导课上出现了数组这个玩意。数组说白了就是一种数据储存的方式,但这种奇特的数据储存方式却极大的方便了我们对数据的访问。

以前我们如果要保存10个整数,就需要定义10个变量(假设是A-J)去储存这些数;如果我想把这10个数中每个数都加上1,就要动用10条语句。

A=A+1;

B=B+1;

......

J=J+1;

而如果使用数组(假设是X[10])储存这些数,只需要一个循环,就能达到我的要求,即:

for(i=0;i<10;i++){

X[i]=X[i]+1;

}

想想看,如果要处理100个数的话,用数组是不是极大的减少了代码的数量?这就是数组的好处。

但这样的数组还是搞不出什么可以愉快玩耍的游戏来的。不过很快,我们班的大佬们给我介绍了我们当前所学数组的升级版——二维数组。

目前的一维数组可以被看做一行N列的数,也就是这样。

0 1 2 3……

[] [] [] []……

而二维数组可以储存M行N列的数,他可以储存M*N个数,也就是这样。

0 1 2……

0 [] [] []……

1 [] [] []……

2 [] [] []……

……………

这下有的玩了,如果数组中存的是字符的话,那么我们把数组中的东西输出出来,不就能构出一个图形吗?然后我们就可以通过对数组中某个储存单位的字符的改变,使输出后呈现出的图形发生改变,比如:

. . . 某操作 . . .

. $ .------> $ . .

. . . . . .

X[i][j]=’$’ X[i][j-1]=’$’

这不就有游戏的效果了吗?

当然,为了更好的游戏体验,我们需要用到system(“cls”);用于清除当前屏幕上的东西,随时更新图像。这样,我们至少可以做出个走地图的东西出来。

当然,光只有走地图还是不能算做游戏的,我们还需要在地图上加很多元素。比如说墙。

###############

# # # #

# # $ #

###############

这个时候该怎么办呢?

数组的能力体现出来了,在知道主角坐标(X,Y)的情况下,我们只需要判断坐标为(X+1,Y),(X-1,Y),(X,Y+1),(X+1,Y-1)的位置在数组中对应的值是不是#就可以了。用代码表示如下:

(其中map[][]中储存着地图每个坐标对应的元素,用#表示墙。X,Y为主角的位置坐标,key中储存着你输入的控制指令。)

If(key==’W’){

If(map[X][Y-1]!=’#’){

Y=Y-1;

}

}

这样一来,当你输入的控制指令为W(向上)时,计算机就会判断主角位置上方是什么,如果不是#,主角就可以向上走一格了。

运用这种方法,我们可以轻松整出一个走迷宫的游戏出来。如果我们在地图上增加更多元素,那游戏内容不就更丰富了吗?利用闲暇时间动手试一试吧。

顺带发一下我写的推箱子,其算法并不算是好算法,仅供大家参考:

#include<stdio.h>

#include<stdlib.h>

char x[15][12];

int box[5][2]={5,6,2,3,6,1,9,8,4,2};//箱子的位置,每两个为一组,表示箱子的X,Y坐标

int flag[5][2]={2,1,1,10,13,10,4,4,9,1};//目标点的位置,每两个为一组,表示箱子的X,Y坐标

int actorx=8,actory=6;//主角的初始位置。

void move();//主角移动函数

void clearmap();//初始化与更新地图函数

void printmap();//打印地图函数

void movebox();//移动箱子函数

int adjwin();//胜利判断函数,若胜利则返回1

main()

{

char s;//储存控制指令的变量

clearmap();

printmap();

while(1){//死循环,让程序不至于中途退出

if(kbhit()){//判断是否按下按键

s=getch();//将按下的按键储存在s中

move(s);

s=0;

}

if(adjwin()==1){

printf("You win!\n");

system("pause");

return 0;//可以退出程序

}

}

}

void move(int key){

if(key=='A'||key=='a'){

if(x[actorx-1][actory]=='B'){

movebox(key);//如果主角上方是箱子,进入推箱子判断函数,下边同理

}

if(x[actorx-1][actory]==' '||x[actorx-1][actory]=='*'){

actorx-=1;//如果主角上方是空白处‘ ’或目标点‘*’,则上移,下面同理

}

}if(key=='D'||key=='d'){

if(x[actorx+1][actory]=='B'){

movebox(key);

}

if(x[actorx+1][actory]==' '||x[actorx+1][actory]=='*'){

actorx+=1;

}

}if(key=='W'||key=='w'){

if(x[actorx][actory-1]=='B'){

movebox(key);

}

if(x[actorx][actory-1]==' '||x[actorx][actory-1]=='*'){

actory-=1;

}

}if(key=='S'||key=='s'){

if(x[actorx][actory+1]=='B'){

movebox(key);

}

if(x[actorx][actory+1]==' '||x[actorx][actory+1]=='*'){

actory+=1;

}

}

system("cls");//清空屏幕

printmap();//打印地图,实现地图更新

}

void movebox(int key){

int i,j;

if(key=='A'||key=='a'){

for(i=0;i<5;i++){

if(box[i][0]==actorx-1&&box[i][1]==actory){

//判断那个箱子在主角的左方,下同理

if(x[box[i][0]-1][box[i][1]]!='#'){//判断箱子左方是不是墙,下同理

box[i][0]-=1;//箱子左移,下同理

clearmap();//更新箱子在地图中的位置,由于在箱子上上移后,主角上方变为空地,主角会上移,所以这里不需要变换主角位置

}

}

}

}

if(key=='D'||key=='d'){

for(i=0;i<5;i++){

if(box[i][0]==actorx+1&&box[i][1]==actory){

if(x[box[i][0]+1][box[i][1]]!='#'){

box[i][0]+=1;

clearmap();

}

}

}

}

if(key=='W'||key=='w'){

for(i=0;i<5;i++){

if(box[i][0]==actorx&&box[i][1]==actory-1){

if(x[box[i][0]][box[i][1]-1]!='#'){

box[i][1]-=1;

clearmap();

}

}

}

}

if(key=='S'||key=='s'){

for(i=0;i<5;i++){

if(box[i][0]==actorx&&box[i][1]==actory+1){

if(x[box[i][0]][box[i][1]+1]!='#'){

box[i][1]+=1;

clearmap();

}

}

}

}

}

void clearmap(){

int i,j;

for(j=0;j<12;j++){

for(i=0;i<15;i++){

x[i][j]=' ';//先把地图中所有东西清空

}

}

for(i=0;i<15;i++){

x[i][0]='#';

x[i][11]='#';

}

for(i=0;i<12;i++){

x[0][i]='#';

x[14][i]='#';

}

x[2][5]='#';

x[3][1]='#';

x[3][2]='#';

x[3][3]='#';

x[3][4]='#';

x[3][5]='#';

x[4][5]='#';

x[5][5]='#';

x[6][5]='#';

x[7][5]='#';

x[7][6]='#';

x[7][7]='#';

x[7][8]='#';

x[8][8]='#';

//安放墙

for(i=0;i<5;i++){

x[flag[i][0]][flag[i][1]]='*';

}

//安放目标点

for(i=0;i<5;i++){

x[box[i][0]][box[i][1]]='B';

}

//安放箱子,其位置上有目标点,则覆盖之

}

int adjwin(){

int i,j,k=0;

for(j=0;j<12;j++){

for(i=0;i<15;i++){

if(x[i][j]=='*'){

k=1;

}

}

}

if(k==1){

return 0;

}else{

return 1;

}

}//判断地图上所有目标点是否被覆盖,若是,则返回1

void printmap(){

int i,j,k;

for(j=0;j<12;j++){

for(i=0;i<15;i++){

if(i==actorx&&j==actory){

printf("$ ");//将主角当前位置用$表示

}else{

printf("%c ",x[i][j]);

}

}

printf("\n");

}

}//打印地图中所有符号

C语言是面向过程的,而C++是面向对象的

(效果图和上方推箱子图一样)

如果多想想的话,在使用二维数组的情况下,我们可以搞出平面游戏出来,那如果使用三维数组呢?如果使用n维数组呢?那可就更好玩了。

这些是C/C++能做的

服务器开发工程师、人工智能、云计算工程师、信息安全(黑客反黑客)、大数据 、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程师、游戏服务器、分布式系统、游戏辅助等

用户评论

凉城°

这款C语言编程游戏设计和数组结合得超级好,简单又好玩。

    有6位网友表示赞同!

陌離

终于找到了一个既能学编程又能玩游戏的方式,真是太棒了!

    有16位网友表示赞同!

柠栀

C语言学习路上的好帮手,跟着这个小游戏进步飞快。

    有12位网友表示赞同!

巷陌繁花丶

第一次用数组写推箱子小游戏,感觉特别有成就感~

    有8位网友表示赞同!

一别经年

玩这款游戏觉得学C语言都没那么枯燥了。

    有6位网友表示赞同!

゛指尖的阳光丶

数组的运用变得轻松有趣,小游戏的互动性太加分了。

    有9位网友表示赞同!

剑已封鞘

编程和游戏设计终于在我一个平台实现了!

    有18位网友表示赞同!

?亡梦爱人

这个推箱子小游戏让我重新燃起了对编程的热情。

    有8位网友表示赞同!

发型不乱一切好办

简单易懂的操作方式,适合初学者学习C语言。

    有15位网友表示赞同!

心亡则人忘

边玩游戏边锻炼大脑,一举两得的好事。

    有17位网友表示赞同!

咆哮

喜欢这种自己动手制作游戏的体验,太满足啦!

    有12位网友表示赞同!

热点资讯