失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 滑动拼图小游戏(C语言)

滑动拼图小游戏(C语言)

时间:2020-04-30 23:38:22

相关推荐

滑动拼图小游戏(C语言)

目录

前言

一,拼图的打印

二,数据的初始化

三,小方格的移动

四,步数的累加

五,游戏结束的判断

六,作弊器

七,主函数

八,全部代码

总结:

前言

之前在看到一个Java写的滑动拼图的小游戏,然后那个运行后的界面是用了图形化输出,然后我想用C语言可不可以简化一下实现游戏的效果,本来移动是一张打乱的图片,我就直接简化成数字输出,于是我就写了下面的代码,希望各位大佬能帮我看一下哪些地方有问题,哪些地方没有考虑全面。

首先我是对游戏分了下面几个点要实现

一,拼图的打印

拼图的打印我是用一个4*4的二维数组来打印的,二维数组的索引和可以很好的实现拼图的移动,因为数据很多地方要用到,我就直接把他设置成全局变量了,我这是用int类型的数组来打印,用char类型的数组来打印也可以。

//初始数据int data[4][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}};

数组初始数据设置好了就是他的输出,我编写了一个函数来实现拼图的打印,当然这个有要注意的是,原本我是想在0位置输出0的,但是在拼图移动的时候不是很顺眼,我就想在输出时候直接不输出了,但是不输出也不行,我就用到了\t(制表符),他会控制两个输出的距离,也达到了理想中的效果。

//打印界面void initPrint(){//打印游戏界面for(int i=0;i<4;i++){for(int j=0;j<4;j++){//标记0元素的位置,输出空白if(data[i][j]==0){printf("\t");}else{printf("%d\t",data[i][j]);}}printf("\n");}}

二,数据的初始化

拼图打印完成了之后就是对于拼图里面数据的打乱,我这里采用的是随机打散,先用一个一维数组来存储数据,随机打乱之后存入二维数组中。

#include<time.h>#include<stdlib.h>//打乱二维数组,随机排序void initData(){//就是一个写法,写这个才能用随机数的函数srand((unsigned)time(NULL));int init[16];int i=0;//初始化init数组for(i=0;i<16;i++){init[i]=i;}//随机打散for(i=0;i<16;i++){int r=rand()%16;//范围[0,16)int tmp=init[i];init[i]=init[r];init[r]=tmp;}//存储到二维数组data当中for(i=0;i<16;i++){data[i/4][i%4]=init[i];}}

三,小方格的移动

前期的准备好了之后就是小方格的移动,这里规定了a:左移,w:上移,d:右移,s:下移为了增强代码的可读性,我对此进行了宏定义,因为写字符没有实际的意义。

#define UP 'w' //上#define DOWN 's' //下#define LEFT 'a' //左#define RIGHT 'd' //右

对于移动,以向左移动为例,就是空白位置的字符,和他右边位置的字符交换,达成的效果就是小方块左移。那就需要时刻知道0元素的索引,所以在拼图打印的时候就要保存好0元素的索引。这里我把0元素的索引用x,y来记录,移动还有就是边界的判断,当0元素在最右边的时候,右边是没有元素的,所以肯定是不能移动的,此时判定移动无效。玩家看到的是小方块的移动,对于输出就是把输出清空再重新打印,这里用到了刷新的一个函数。

#include<windows.h>//这就是再判断的时候提高代码的可读性,写字符没有实际的意义#define UP 'w' //上#define DOWN 's' //下#define LEFT 'a' //左#define RIGHT 'd' //右//记录0元素的位置int x=0;int y=0;//打印界面void initPrint(){//刷新system("cls");//Sleep(500);//打印游戏界面for(int i=0;i<4;i++){for(int j=0;j<4;j++){//标记0元素的位置,输出空白if(data[i][j]==0){x=i;y=j;printf("\t");}else{printf("%d\t",data[i][j]);}}printf("\n");}}//开始游戏void startGame(){do{char c;scanf("%c",&c);if(c==UP){//上移//当0处于最下方时,下面没有元素,所以不能进行交换,移动无效if(x==3){continue;}//0元素下移,也就是下方元素和0进行交换,效果就是下方元素上移int tmp=data[x][y];data[x][y]=data[x+1][y];data[x+1][y]=tmp;//重新打印initPrint();}else if(c==DOWN){//下移//当0处于最上方时,上面没有元素,所以不能进行交换,移动无效if(x==0){continue;}//0元素上移,也就是上方元素和0进行交换,效果就是上方元素下移int tmp=data[x][y];data[x][y]=data[x-1][y];data[x-1][y]=tmp;//重新打印initPrint();}else if(c==LEFT){//左移//当0处于最右方时,右面没有元素,所以不能进行交换,移动无效if(y==3){continue;}//0元素右移,也就是右方元素和0进行交换,效果就是右方元素左移int tmp=data[x][y];data[x][y]=data[x][y+1];data[x][y+1]=tmp;//重新打印initPrint();}else if(c==RIGHT){//右移//当0处于最左方时,左面没有元素,所以不能进行交换,移动无效if(y==0){continue;}//0元素左移,也就是左方元素和0进行交换,效果就是左方元素右移int tmp=data[x][y];data[x][y]=data[x][y-1];data[x][y-1]=tmp;//重新打印initPrint();}}while(true);}

四,步数的累加

对于步数的累加就是定义一个全局变量,在有效移动后累加,在输出的时候打印一下即可。

五,游戏结束的判断

游戏结束我是定义另一个4*4的二维数组,把数据装好,两个数组元素进行比较,所以元素的相同就游戏胜利。

//获胜数据int win[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};bool victory(){for(int i=0;i<4;i++){for(int j=0;j<4;j++){if(data[i][j]!=win[i][j]){return false;}}}return true;}

后面我感觉随机打乱游戏最终可能结束不了,反正以我的智商是结束不了,我就对判定胜利的函数进行了改进。

bool victory(){for(int i=0;i<3;i++){for(int j=0;j<4;j++){if(data[i][j]!=win[i][j]){return false;}}}//13和0的位置是确定的,就14,15的位置可以随意if((data[3][0]!=win[3][0])&&(data[3][3]!=win[3][3])){return false;}return true;}

六,作弊器

这个我是设置一个字符,按到这个字符就直接胜利。

七,主函数

//主函数int main(){initData();//初始化数据initPrint();//打印拼图startGame();//开始游戏return 0;}

八,全部代码

/*游戏规则1.移动a:左移w:上移d:右移s:下移输入之后按下回车2.参考点 (本来是输出0,后面改成不直观,就用了\t)空白方格3.结束(13,14,15)(14,15,13)(15,13,14)1,2,3,45,6,7,89,10,11,1213,14,154.作弊输入p直接胜利5.说明13,14,15随机组合有六种其中正确有(13,14,15)(14,15,13)(15,13,14)因为拼图是随机打散的,所以最终结果可能不能胜利于是就规定1,2,3,45,6,7,89,10,11,1213,15,14也算胜利增加(13,15,14)(15,14,13)(14,13,15)*///所需要的头文件#include<stdio.h>#include<time.h>#include<stdlib.h>#include<windows.h>//这就是再判断的时候提高代码的可读性,写字符没有实际的意义#define UP 'w' //上#define DOWN 's' //下#define LEFT 'a' //左#define RIGHT 'd' //右//初始数据int data[4][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}};//获胜数据int win[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};//记录0元素的位置位置int x=0;int y=0;//统计步数int step=0;//所有函数的声明void initPrint();//打印界面void initData();//随机打散void startGame();//开始游戏bool victory();//判断是否结束游戏//主函数int main(){initData();initPrint();startGame();return 0;}//打印界面void initPrint(){//刷新system("cls");//Sleep(500);//输出步数printf("step: %d \n",step);//打印游戏界面for(int i=0;i<4;i++){for(int j=0;j<4;j++){//标记0元素的位置,输出空白if(data[i][j]==0){x=i;y=j;printf("\t");}else{printf("%d\t",data[i][j]);}}printf("\n");}//胜利了,正常中止程序if(victory()){printf("游戏胜利\n");exit(0);}}//打乱二维数组,随机排序void initData(){//就是一个写法,写这个才能用随机数的函数srand((unsigned)time(NULL));int init[16];int i=0;//初始化init数组for(i=0;i<16;i++){init[i]=i;}//随机打散for(i=0;i<16;i++){int r=rand()%16;//范围[0,16)int tmp=init[i];init[i]=init[r];init[r]=tmp;}//存储到二维数组data当中for(i=0;i<16;i++){data[i/4][i%4]=init[i];}}//开始游戏void startGame(){do{char c;scanf("%c",&c);if(c==UP){//上移//当0处于最下方时,下面没有元素,所以不能进行交换,移动无效if(x==3){continue;}//0元素下移,也就是下方元素和0进行交换,效果就是下方元素上移int tmp=data[x][y];data[x][y]=data[x+1][y];data[x+1][y]=tmp;//累计步数step++;//重新打印initPrint();}else if(c==DOWN){//下移//当0处于最上方时,上面没有元素,所以不能进行交换,移动无效if(x==0){continue;}//0元素上移,也就是上方元素和0进行交换,效果就是上方元素下移int tmp=data[x][y];data[x][y]=data[x-1][y];data[x-1][y]=tmp;//累计步数step++;//重新打印initPrint();}else if(c==LEFT){//左移//当0处于最右方时,右面没有元素,所以不能进行交换,移动无效if(y==3){continue;}//0元素右移,也就是右方元素和0进行交换,效果就是右方元素左移int tmp=data[x][y];data[x][y]=data[x][y+1];data[x][y+1]=tmp;//累计步数step++;//重新打印initPrint();}else if(c==RIGHT){//右移//当0处于最左方时,左面没有元素,所以不能进行交换,移动无效if(y==0){continue;}//0元素左移,也就是左方元素和0进行交换,效果就是左方元素右移int tmp=data[x][y];data[x][y]=data[x][y-1];data[x][y-1]=tmp;//累计步数step++;//重新打印initPrint();}else if(c=='p'){//作弊int count=1;for(int i=0;i<4;i++){for(int j=0;j<4;j++){data[i][j]=count++;}}data[3][3]=0;initPrint();}}while(true);}bool victory(){/*for(int i=0;i<4;i++){for(int j=0;j<4;j++){if(data[i][j]!=win[i][j]){return false;}}}return true;*///改for(int i=0;i<3;i++){for(int j=0;j<4;j++){if(data[i][j]!=win[i][j]){return false;}}}//13和0的位置是确定的,就14,15的位置可以随意if((data[3][0]!=win[3][0])||(data[3][3]!=win[3][3])){return false;}return true;}

总结:

这个是自己写的第一个小游戏,思路是之前看了一个Java的程序,但是写的整个过程中是自己思考后的结果,自我感觉良好,还是挺开心的,如果有写的不对的地方,希望各位大佬可以指正。

如果觉得《滑动拼图小游戏(C语言)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。