C语言自主设计迷宫类游戏实例

附:

C语言实现计算器完整代码:https://blog.csdn.net/qq_41915690/article/details/80466865

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

Design By 海与炜

                                                                                                                                                                                                      

1 软件介绍(使用说明)

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

游戏开始界面↓

死亡界面↓

扫描二维码关注公众号,回复: 2193141 查看本文章

逃生界面↓

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<stdio.h>
#include<stdlib.h> 
#include<conio.h>  
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");
}


猜你喜欢

转载自blog.csdn.net/qq_41915690/article/details/80463892
今日推荐