数组与C语言程序编程学习游戏设计,你也能写个推箱子游戏!

本文中的推箱子玩法:上:W,下:S,左:A,右:D。

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

当我第一次看到我们所使用的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

#include

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");

}

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

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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容