博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言自主设计迷宫类游戏实例
阅读量:3917 次
发布时间:2019-05-23

本文共 7628 字,大约阅读时间需要 25 分钟。

附:

C语言实现计算器完整代码:

(破败圣迹之逃出生天)使用设计说明

Design By 海上的雨

 

 

 

 

                                                                                                                                                                                                      

1 软件介绍(使用说明)

用w、a、s、d或者W、A、S、D分别控制角色的移动(上、左、下、右),使目标向○处逃生!触碰◎则死亡!逃生或死亡则游戏结束。

游戏开始界面↓

死亡界面↓

逃生界面↓

2 函数设计(设计思路)

图形构成

破败圣迹之逃出生天由主角、墙壁、道路、逃生标志、死亡标志、装饰符以及文字构成。自建一个txt文档储存数据,用数字1代替墙壁"▓",2代表角色"♀" ,3代表道路"  ",4代表文字"破败圣迹之逃出生天"、5代表装饰符"卐"、6代表装饰符"卍"、7代表逃生标志"○"、*代表死亡标志"◎"来构成图形化界面。

使用voidshuru(char shuju[29][26],int *a,int *b);以及      void shuchu(char shuju[29][26],int *a,int*b);这两个函数对txt文档进行提取和显示。其中voidshuru(char shuju[29][26],int *a,int *b)函数作用是从文件中读取信息,并将数据存放于二维数组shuju[29][26]中,*a与*b记录角色的位置。void shuchu(char shuju[29][26],int *a,int *b)函数的作用是从二维数组shuju[29][26]中读信息,并根据shuju[29][26]中的各个值输出相应的符号。

以下为实现代码:

void shuru(char shuju[29][26],int *a,int*b)

{

         inti=0,j=0;

         FILE*fp;

   char ch;

         if((fp=fopen("破败圣迹之逃出生天.txt","r"))==NULL)

         {

                   printf("文件路径不正确!");

                   exit(1);

         }

         ch=fgetc(fp);

         while(ch!=EOF)

         {  

                   if(ch=='1')

       {

                           

                            shuju[i][j]=ch;

                            j++;

                            if(j==26)

                            {

                                     i++;

                                     j=0;

                            }       

                   }

                   elseif(ch=='2')

                   {

                           

                            shuju[i][j]=ch;

                            (*a)=i;

                            (*b)=j;

           j++;

                            if(j==26)

                            {

                                     i++;

                                     j=0;

                            }

                   }

                   elseif(ch=='3')

                   {

                            shuju[i][j]=ch;

           j++;

                            if(j==26)

                            {

                                     i++;

                                     j=0;

                            }

                   }

                   else

                   {       

           shuju[i][j]=ch;

           j++;

                            if(j==26)

                            {

                                     i++;

                                     j=0;

                            }

                   }

       ch=fgetc(fp);

         }

         fclose(fp);

}

void shuchu(char shuju[29][26],int *a,int*b)

{

         inti,j;

         system("cls");

         for(i=0;i<29;i++)

                   for(j=0;j<26;j++)

                   {

                            if(shuju[i][j]=='1')

                                     printf("▓");

                            elseif(shuju[i][j]=='2')

                            {  

                                     printf("♀");

                                     (*a)=i;

                (*b)=j;

                            }

                            elseif(shuju[i][j]=='3')

                            {

                                     printf("  ");

                            }

                            elseif(shuju[i][j]=='4')

                            {

                                     printf("破败圣迹之逃出生天");

                            }

                            elseif(shuju[i][j]=='5')

                            {

                                     printf("卐");

                            }

                            elseif(shuju[i][j]=='6')

                            {

                                     printf("卍");

                            }

                            elseif(shuju[i][j]=='7')

                            {

                                     printf("○");

                            }

                            elseif(shuju[i][j]=='*')

                            {

                                     printf("◎");

                            }

                            elseif(shuju[i][j]=='8')

                            {

                                     printf("W:向上移动\tS:向下移动");

                            }

                            elseif(shuju[i][j]=='9')

                            {

                                     printf("A:向左移动\tD:向右移动");

                            }

                            /*elseif(shuju[i][j]=='*')

                            {

                                     printf("A:向左移动");

                            }*/

                            /*elseif(shuju[i][j]=='/')

                            {

                                     printf("D:向右移动");

                            }*/

                            elseif(shuju[i][j]=='+')

                            {

                                     printf("向○处逃生!触碰◎则死亡!");

                            }

                            else

                            {

                                     putchar(shuju[i][j]);

                            }

                   }

                   printf("\n");

}

主角移动、死亡、逃生的实现

定义二维数组用来记录各个位置。可以理解为用坐标表示位置,当键入w/a/s/d通过getch()对玩家输入的控制键进行不显示的读取,然后对shuju [i][j]进行相应的改变,之后运行shuchu(shuju,&a,&b)进行输出绘图,从而完成了角色"♀"的移动。为了保证角色不向墙壁移动,在调换shuju [i][j]的内容时调用if语句进行相关设定。同理,当主角走入死亡标记"◎"或逃生标记"○"时通过调制if语句对游戏进行死亡或逃生的展现。

以下为对应代码:

ch=getch();

    while(1)

       {

              switch(ch)

              {

              case 'w':

              case 'W':

                     {

                            if(shuju[a-1][b]=='3'||shuju[a-1][b]=='*')

                            { 

                                   c=shuju[a-1][b];

                                   shuju[a-1][b]=shuju[a][b];

                                   shuju[a][b]=c;

                                   shuchu(shuju,&a,&b);

                            }

                            break;

                     }

              case 'a':

              case 'A':

                     {

                            if(shuju[a][b-1]=='3'||shuju[a][b-1]=='*')

                            {

                                   c=shuju[a][b-1];

                                   shuju[a][b-1]=shuju[a][b];

                                   shuju[a][b]=c;

                                   shuchu(shuju,&a,&b);

                            }

                            break;

                     }

              case 's':

              case 'S':

                     {

                            if(shuju[a+1][b]=='3'||shuju[a+1][b]=='*')

                            {

                                   c=shuju[a+1][b];

                                   shuju[a+1][b]=shuju[a][b];

                                   shuju[a][b]=c;

                                   shuchu(shuju,&a,&b);

                            }

                            break;

                     }

              case 'd':

              case 'D':

                     {

                            if(shuju[a][b+1]=='3'||shuju[a][b+1]=='*')

                            {

                                   c=shuju[a][b+1];

                                   shuju[a][b+1]=shuju[a][b];

                                   shuju[a][b]=c;

                                   shuchu(shuju,&a,&b);

                            }

                            break;

                     }

              }

              if(shuju[22][23]=='2')

              {

                     printf("你已逃出生天!\n");

                     break;

              }

       if(shuju[3][13]=='2'||shuju[3][19]=='2'||shuju[9][5]=='2'||shuju[7][20]=='2'||shuju[12][19]=='2'||shuju[17][13]=='2'||shuju[23][19]=='2')

              {

                     printf("你已死亡!\n");

                     break;

              }

              ch=getch();

       }

}       

数据的读取

由”图形构成”部分可知,我们已经将有代表意义的1.2.3···等数据排列在一个txt文档里。然后通过(fp=fopen("破败圣迹之逃出生天.txt","r"))==NULL确认文件是否存在,并读取数据存入fp中。然后对fp进行操作,实现数据的读取。

以下为实现代码:

void shuru(char shuju[29][26],int *a,int*b)

{

         inti=0,j=0;

         FILE*fp;

   char ch;

         if((fp=fopen("破败圣迹之逃出生天.txt","r"))==NULL)

         {

                   printf("文件路径不正确!");

                   exit(1);

         }

         ch=fgetc(fp);

         while(ch!=EOF)

         {  

                   if(ch=='1')

       {

                           

                            shuju[i][j]=ch;

                            j++;

                            if(j==26)

                            {

                                     i++;

                                     j=0;

                            }       

                   }

                   elseif(ch=='2')

                   {

                           

                            shuju[i][j]=ch;

                            (*a)=i;

                            (*b)=j;

           j++;

                            if(j==26)

                            {

                                     i++;

                                     j=0;

                            }

                   }

                   elseif(ch=='3')

                   {

                            shuju[i][j]=ch;

           j++;

                            if(j==26)

                            {

                                     i++;

                                     j=0;

                            }

                   }

                   else

                   {       

           shuju[i][j]=ch;

           j++;

                            if(j==26)

                            {

                                     i++;

                                     j=0;

                            }

                   }

       ch=fgetc(fp);

         }

         fclose(fp);

游戏结束

通过while(1)语句当满足设定的if语句并break出时则游戏接触。

以下为实现代码:

while(1)

{

if(shuju[22][23]=='2')

                   {

                            printf("你已逃出生天!\n");

                            break;

                   }

         if(shuju[3][13]=='2'||shuju[3][19]=='2'||shuju[9][5]=='2'||shuju[7][20]=='2'||shuju[12][19]=='2'||shuju[17][13]=='2'||shuju[23][19]=='2')

                   {

                            printf("你已死亡!\n");

                            break;

                   }

                   ch=getch();

         }

}

3 数据结构

Ø  void shuru(char shuju[29][26],int *a,int *b);函数用与对储存数字以及字符的txt文档进行读取、转化、存储。

Ø  void shuchu(char shuju[29][26],int *a,int *b);函数用于通过设定不用的数字及字符代表相应的意义,对shuju[i][j]进行绘制。

Ø  getch();函数用于对输入的数据不进行显示而是直接保存,使游戏界面清洁。

Ø  while(1)

         {

         switch(ch)

                   {

If()

{

}

If()

{

}

Ch=getch();

}

}  函数用于设定通过键入的案件对shuju[a][b]内的数据进行相应的改变并进行游戏胜利与失败的设定。

Ø           FILE *fp;

    char ch;

         if((fp=fopen("破败圣迹之逃出生天.txt","r"))==NULL)

{

}  函数对存放数据的txt文档进行读取并保存于fp。

Ø  while(ch!=EOF)

       { 

If()

{

}

}   函数表示当ch不是标准输入的结尾时运行if语句。

Ø           system("cls");函数用于清屏,使用户在操作后能够使用一个新的界面。

4 最后

设计感悟

²  C语言程序图形化界面的行程可以先用数字或字符替代,然后进行读取操作。方便快捷,可修改性强。

²  把文件中的数据读到数组中,可以减少文本的读取次数。

C语言感悟

²  设计程序时多运行测试,多以用户的角度进行思考,对程序源代码进行不断地完善。

²  程序工程量大时在源代码中做好注释,可以在浏览时能够更直观、快速的浏览代码。

²  程序工程量较大时需要考虑先编写整体结构,然后对源代码进行改善。

²  编程中有许多类似的代码行,善于运用复制粘贴可以加快编程速度。

²  遇到无法实现的地方多运用网络资源或向先导求知,能够快速丰富自己的C语言知识库。

 

 

 

 

 

 

#include
#include
#include
void main(){ void shuru(char shuju[29][26],int *a,int *b); void shuchu(char shuju[29][26],int *a,int *b); int a,b; char ch,c; char shuju[29][26]; shuru(shuju,&a,&b); shuchu(shuju,&a,&b); ch=getch(); while(1) { switch(ch) { case 'w': case 'W': { if(shuju[a-1][b]=='3'||shuju[a-1][b]=='*') { c=shuju[a-1][b]; shuju[a-1][b]=shuju[a][b]; shuju[a][b]=c; shuchu(shuju,&a,&b); } break; } case 'a': case 'A': { if(shuju[a][b-1]=='3'||shuju[a][b-1]=='*') { c=shuju[a][b-1]; shuju[a][b-1]=shuju[a][b]; shuju[a][b]=c; shuchu(shuju,&a,&b); } break; } case 's': case 'S': { if(shuju[a+1][b]=='3'||shuju[a+1][b]=='*') { c=shuju[a+1][b]; shuju[a+1][b]=shuju[a][b]; shuju[a][b]=c; shuchu(shuju,&a,&b); } break; } case 'd': case 'D': { if(shuju[a][b+1]=='3'||shuju[a][b+1]=='*') { c=shuju[a][b+1]; shuju[a][b+1]=shuju[a][b]; shuju[a][b]=c; shuchu(shuju,&a,&b); } break; } } if(shuju[22][23]=='2') { printf("你已逃出生天!\n"); break; } if(shuju[3][13]=='2'||shuju[3][19]=='2'||shuju[9][5]=='2'||shuju[7][20]=='2'||shuju[12][19]=='2'||shuju[17][13]=='2'||shuju[23][19]=='2') { printf("你已死亡!\n"); break; } ch=getch(); }}void shuru(char shuju[29][26],int *a,int *b){ int i=0,j=0; FILE *fp; char ch; if((fp=fopen("破败圣迹之逃出生天.txt","r"))==NULL) { printf("文件路径不正确!"); exit(1); } ch=fgetc(fp); while(ch!=EOF) { if(ch=='1') { shuju[i][j]=ch; j++; if(j==26) { i++; j=0; } } else if(ch=='2') { shuju[i][j]=ch; (*a)=i; (*b)=j; j++; if(j==26) { i++; j=0; } } else if(ch=='3') { shuju[i][j]=ch; j++; if(j==26) { i++; j=0; } } else { shuju[i][j]=ch; j++; if(j==26) { i++; j=0; } } ch=fgetc(fp); } fclose(fp);}void shuchu(char shuju[29][26],int *a,int *b){ int i,j; system("cls"); for(i=0;i<29;i++) for(j=0;j<26;j++) { if(shuju[i][j]=='1') printf("▓"); else if(shuju[i][j]=='2') { printf("♀"); (*a)=i; (*b)=j; } else if(shuju[i][j]=='3') { printf(" "); } else if(shuju[i][j]=='4') { printf("破败圣迹之逃出生天"); } else if(shuju[i][j]=='5') { printf("卐"); } else if(shuju[i][j]=='6') { printf("卍"); } else if(shuju[i][j]=='7') { printf("○"); } else if(shuju[i][j]=='*') { printf("◎"); } else if(shuju[i][j]=='8') { printf("W:向上移动\tS:向下移动"); } else if(shuju[i][j]=='9') { printf("A:向左移动\tD:向右移动"); } /*else if(shuju[i][j]=='*') { printf("A:向左移动"); }*/ /*else if(shuju[i][j]=='/') { printf("D:向右移动"); }*/ else if(shuju[i][j]=='+') { printf("向○处逃生!触碰◎则死亡!"); } else { putchar(shuju[i][j]); } } printf("\n");}

 

 

你可能感兴趣的文章
2年Java开发工作经验面试总结
查看>>
最全面的Java多线程用法解析
查看>>
Java ClassLoader 原理详细分析
查看>>
Java中创建对象的5种方式
查看>>
Java并发控制机制详解
查看>>
Java Executor 框架学习总结
查看>>
15个顶级Java多线程面试题及答案
查看>>
成为优秀Java程序员的10大技巧
查看>>
一位10年Java工作经验的架构师聊Java和工作经验
查看>>
Java架构师学习路线
查看>>
号称精通Java的你,是否真的名副其实
查看>>
你可以把编程当做一项托付终身的职业
查看>>
细思极恐——你真的会写Java吗?
查看>>
Java并发面试,幸亏有点道行,不然又被忽悠了
查看>>
Java基础面试题收集整理
查看>>
SpringBoot基础篇Bean之条件注入@Condition使用姿势
查看>>
让你秒懂线程和线程安全,只需5步!
查看>>
Spring Boot学习之Logback和Log4j2集成与日志发展史
查看>>
Java注解(annotation)机制
查看>>
volatile关键字全面解析
查看>>