迷宫游戏代码c语言

2024-09-12

迷宫游戏代码c语言(共5篇)

迷宫游戏代码c语言 篇1

#include

#include

#define LEN sizeof(SEAT)

#define MAXSIZE 100

#define LENGTH 30

typedef struct

{

int x;//横坐标

int y;//纵坐标

int di;//表示方向,0-3分别表示东南西北。

}SEAT;

struct StackList

{

SEAT stack[MAXSIZE];

int top;

}*Stack;

int EmptyStack(StackList*Stack)//判断是否为空栈

{

if(Stack->top==0)

return 0;

else

return 1;

}

int Move[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//分别表示向东、西、南、北需要加上的坐标

int Mase[LENGTH][LENGTH]={0};//初始化为0

int length,width;

void InitMase()//在迷宫的外围添加一层“墙壁”(赋值为1),使得迷宫的任意一点都有四个方向

{

int i,j;

for(i=0;i

{

for(j=0;j

Mase[i][j]=1;

}

for(i=0;i

{

for(j=0;j

Mase[j][i]=1;

}

}

void InitStack(StackList*Stack)//初始化

{

Stack->top=0;

return;

}

int PushStack(StackList*Stack,SEAT CurSeat)//进栈

{

if(Stack->top==MAXSIZE-1)

return false;

else

{

Stack->stack[Stack->top].x=CurSeat.x;

Stack->stack[Stack->top].y=CurSeat.y;

Stack->stack[Stack->top].di=CurSeat.di;

Stack->top++;

return true;

}

}

int PopStack(StackList*Stack)//出栈

{

if(Stack->top==0)

return false;

else

{

Stack->top--;

return true;

}

}

int Pass(SEAT p)//判断当前是否可行

{

if(Mase[p.x][p.y]==0)

{

return true;

}

else

return false;

}

SEAT NextSeat(SEAT CurSeat)//查找下一个点,并返回

{

SEAT temp;

temp.x=CurSeat.x+Move[CurSeat.di][0];

temp.y=CurSeat.y+Move[CurSeat.di][1];

return temp;

}

void Mark(SEAT p)//标记已经走过的点,避免重复

{

Mase[p.x][p.y]=-1;

}

int PathWay(SEAT start,SEAT end)//找路线

{

Stack=(struct StackList*)malloc(sizeof(struct StackList));

InitStack(Stack);

SEAT CurSeat;

CurSeat.x=start.x+1;//由于多加了一层墙壁,因此坐标的值要加1

CurSeat.y=start.y+1;//

CurSeat.di=start.di;//

do

{

if(Pass(CurSeat))

{

PushStack(Stack,CurSeat);

Mark(CurSeat);

if(CurSeat.x==end.x+1&&CurSeat.y==end.y+1)//如果找到出口,返回{

return true;

}

else

{

int find=0;

while(CurSeat.di<3&&find==0)//找下一个结点的方向

{

CurSeat.di++;

SEAT temp;

temp=NextSeat(CurSeat);

if(Mase[temp.x][temp.y]==0)

{

temp.di=-1;

CurSeat=temp;

find =1;

}

}

}

}

else

{

if(EmptyStack(Stack))//当前的点不能走,出栈

PopStack(Stack);

if(EmptyStack(Stack))//当前的点变为前一个点

{

CurSeat=Stack->stack[Stack->top-1];

}

while(CurSeat.di==3&&EmptyStack(Stack))////当前的点找不到下一个点,出栈

{

PopStack(Stack);

CurSeat=Stack->stack[Stack->top-1];//当前的点变为前一个点}

if(EmptyStack(Stack))

{

int find=0;

while(CurSeat.di<3&&find==0)////找下一个结点的方向

{

CurSeat.di++;

SEAT temp;

temp=NextSeat(CurSeat);

if(Mase[temp.x][temp.y]==0)

{

temp.di=-1;

CurSeat=temp;

find =1;

}

}

}

}

}while(EmptyStack(Stack));

return false;

}

void PrintStack(StackList*Stack)//输出路线

{

if(Stack->top==0)

printf(“There is no route can be out of the mazen”);

else

{

int i;

for(i=0;itop;i++)

{

if(i!=0)

printf(“->(%d,%d)”,Stack->stack[i].x-1,Stack->stack[i].y-1);

else

printf(“(%d,%d)”,Stack->stack[i].x-1,Stack->stack[i].y-1);

}

}

}

void PrintMase()//输出迷宫

{

int i,j;

for(i=1;i

{

for(j=1;j

{

if(j!=1)

printf(“ %d”,Mase[i][j]);

else

printf(“%d”,Mase[i][j]);

}

printf(“n”);

}

}

int main()

{

int n;

SEAT start,end;

printf(“Please enter the maze of the length and width:n”);

scanf(“%d%d”,&length,&width);

printf(“Please enter the number of the maze wall unit(0

printf(“Please enter the labyrinth of the coordinates of the wall unit(0<=row,column):n”);while(--n>=0)

{

int x,y;

scanf(“%d%d”,&x,&y);

Mase[x+1][y+1]=1;

}

InitMase();

PrintMase();

printf(“Please enter the coordinates entrance(0<=x<%d,0<=y<%d):n”,length,width);

scanf(“%d%d”,&start.x,&start.y);

start.di=-1;

printf(“Please enter the coordinates exports(0<=x<%d,0<=y<%d):n”,length,width);

scanf(“%d%d”,&end.x,&end.y);

end.di=0;

if(PathWay(start,end))

PrintStack(Stack);

else

printf(“There is no route can be out of the mazen”);return 0;

迷宫游戏代码c语言 篇2

程序设计是各大高校计算机教育教学中必不可少的实践环节, 然而部分学生由于各种原因会选择抄袭其他学生的程序。根据相关机构的调查显示:高达85.4%[1]的学生承认抄袭过别人的编程作业。学生们在抄袭时会进行一些简单的修改, 使抄袭后的程序尽可能不被发现, 如果要靠人工主观地逐个查找, 不仅花费了更多的时间和精力, 也很难准确辨认是否抄袭。

本文主要研究通过对C语言源代码进行一系列规范化处理, 再针对规范代码进行数字签名比较而识别代码抄袭的方法。本文中所提及的规范化过程设计词法分析的方法, 对变量和函数进行无类型化处理, 使用语法分析对表达式进行规范化等处理过程。

1 常见的抄袭检测方法

现在的程序代码复制检测系统大多采用基于属性计数与基于结构度量相结合的方法检测程序代码的相似性[2]。如美国Stanford大学的Moss (Measure Of Software Similarity) 系统[3]、德国Karlsruhe大学的JPlagn、Wichita州立大学的Sire (Software Similarity Testor) 、悉尼大学的YAP[4] (Yet Another Plague) 系列等。近年来, 程序代码相似度的检测都是用各种方法综合属性计数和程序结构度量[5]。此外, 还有人提出用神经网络来检测程序的相似度。

由上述国内外的研究情况来看, 大多都采用了属性计数和程序结构度量等方法[6], 而结合了词法分析和语法分析的对源代码的处理的研究比较少见。本文提出一种词法分析与语法分析相结合的处理方法, 先对源代码进行规范化, 而后就是词法分析无类型化变量和函数, 再是对代码中的表达式进行语法分析层面上的基于语法抽象树的处理, 最后MD5算法对比分析得出两两抄袭的源代码。

2 相似度比较研究处理方法

本抄袭检测识别方法共分为4个阶段:代码规范化;词法分析;语法分析;MD5分析对比。如图1所示, 源代码程序经过前期的规范化和词法分析的预处理, 提取出源程序的token, 再经过表达式在语法分析层面上的处理, 最后通过MD5算法对字符序列的比对, 得出相应的结果值。1

2.1 代码的规范化

对源代码进行如下的规范化: (1) 将源代码从文件以字符串的形式读入, 进行第一个阶段的词法分析, 提取到一个称之为“单词”的字符串; (2) 对 (1) 中得到的单词进行第二个阶段的词法分析, 同时删除某些不影响程序正确运行的无意义或无效的单词或语句。如删除注释语句、输出语句等, 并设置没有被删除的单词的部分属性; (3) 删除只声明而没有使用的变量的声明语句。

2.2 词法分析的处理

在经过以上的规范化处理之后, 对其进行更深层次的词法分析处理。 (1) 从前一阶段处理完的结果中读入规范化的源代码, 提取出一个源程序的token字符串; (2) 对token进行第二个阶段的词法分析, 对一些变量的类型关键字进行合并; (3) 对数组进行规范化处理; (4) 对枚举类型名的定义、变量的声明、枚举成员即枚举符的名字进行统一命名替换, 整体规划识别; (5) 将各种类型的变量的声明放在一起, 只保留一个类型声明符“var”, 并将所有的变量名都按照它们各自在程序中使用的先后顺序对应地来进行逐一排序命名和替换, 同时, 也将区分结构体和共用体的成员变量名、函数名、函数参数名以及全局和局部变量名。另外, 宏定义的常量直接用该常量值替换。

具体的算法流程如下:

2.3 语法分析的处理

语法分析的处理主要分为两个过程。首先搜索出要规范化的表达式, 此过程要考虑一些特殊的情况, 在搜索的过程中先做一次处理, 例如函数参数和数组下标中的表达式, 这些属于嵌套于表达式中的表达式。然后针对表达式进行分析和处理;先进行语法分析, 在语法分析的代码中嵌套一些语义动作创建一棵抽象语法树, 然后对抽象语法树进行一系列的分析处理。

2.3.1 搜索表达式

在词法分析的基础上, 对每个词素进行分析并封装成一个结点, 结点类型表摘抄如下。

2.3.2 表达式的分析和处理

经过前面的搜索, 已经找出需要进行规范化处理的表达式, 接着进行表达式的规范化。可分为以下几个步骤:

⑴统一类型。语法分析器只有var, num和运算符三种结点, 同等级的var类型结点只需要规范化顺序, 同等级的num类型需要合并, 因此需要把所有类型统一为var类型。

⑵简单替换。++var、--var、var+=1、var=var+1、var-=1、var=var-1等转换为var++或var--。

⑶对表达式进行语法分析, 并根据语法分析过程构造抽象语法树。

⑷基于抽象语法树的处理。

a、如果抽象语法树中存在单目“+”则把单目“+”去掉;等

b、给每个结点赋一个等级, 赋值规则如下:

(1) 初始化一个全局变量count=0, 结点等级属性为level;

(2) 根节点level为“0”, 然后从左到右判断子结点, 如果该结点为叶子结点 (不是运算符结点) , 则level=parentNode.level, 如果当前结点为运算符并且与父节点相同, 则level=parentNode.level, 如果当前结点为运算符并且与父节点不相同, 则level=parentNode.level+count, count加1。

c、找到相同等级的操作数。

d、对同等级的操作数进行排序, 先用快速排序把操作数分成非数字var和数字num, 然后再根据var对应的hashCode按从小到大对var进行排序, 对后面的num进行合并。

e、用排序后的结点新建一棵树, 先把优先级属性level长度较长的结点建成一棵树, 然后将根结点插入到上一个等级的线性表中, 直到最后只剩下一个等级的根结点。

2.4 MD5算法比对分析

MD5的全称是Message-Digest Algorithm 5 (信息-摘要算法) 。MD5通常用于文件的数字签名, 它将整个文件当作一个文本信息, 通过其不可逆的字符串变换算法, 产生了一个唯一的MD5信息摘要值。如果文件的内容发生了任何形式的改变, 只要使用MD5重新计算这个文件的信息摘要值, 就会发现信息摘要和原来不相同, 由此可以确定文件被修改过。

将处理后的代码作为MD5的输入, 经过MD5处理后得到一个有32个十六进制表示的整数。再比较每份代码最终得出的MD5值, 若两份代码的MD5值相同, 则说明这两份代码是相似的。

3 实验与分析

3.1 抄袭检测实验

实验对test01.txt和test02.txt的C语言程序进行了测试, 测试源程序分别对应了10种抄袭手段, 包括:完整拷贝;修改注释;添加或改变输出语句;标识符重命名;变量排序;常量替换;改变表达式中的部分操作符或者操作数顺序;改变数据类型;增加冗余的语句或者变量;表达式拆分。代码检测结果与系统对比结果如图4所示:

由上述的实验结果可以看出本文介绍的抄袭识别检测方法对不同的抄袭行为可以一并检测出来, 尤其在对完全拷贝、修改注释、常量替换和添加无用变量等的抄袭手段, 可以快速、准确地检测出来。

3.2 MD5结果值分析

根据上面的实验结果计算得出test01和test02的MD5值都为BC7667EEF8F8D42B5663E6EB12DF2B0D。由此可以做出如下判断, 这两份源代码文件, 在经过本文的抄袭识别的检测方法处理之后, 是完全一致的, 即可知test01和test02有相互抄袭的嫌疑。

4 结束语

本文主要基于词法分析和语法分析对C语言源代码进行了规范化处理, 基本上能排除以下的抄袭手段: (1) 逐字原样拷贝原程序; (2) 更改注释语句; (3) 更改空行及程序的格式; (4) 重命名标识符; (5) 调整代码块中变量的声明位置; (6) 改变表达式语句中操作符和操作数的顺序; (7) 改变数据类型。此外, 本系统存在以下不足: (1) 未能全面考虑所有情况, 只能针对常见的情况进行处理, 系统可靠性不足; (2) 由于对于源程序只是进行了简单的词法和语法分析, 并没有进行语义分析, 所以对于某一些改动, 不能找出办法来检测和解决。下一步我们将继续完善本设计, 并且利用程序切片等技术对C语言代码进行语义层面的分析, 排除更多的抄袭手段, 提高系统的可靠性。

摘要:本文提出一种对C语言代码进行规范化的方法通过对程序代码中的变量和函数进行了无类型化处理, 对程序中的表达式进行规范化后再进行相似度的对比。实验结果表明, 经过上述处理后可以排除常见的不涉及语义层面的大部分抄袭手段。

关键词:抄袭检测,词法分析,类型替换,语法分析,抽象语法树

参考文献

[1]钟美, 张丽萍, 刘东升.基于XML的C代码检测算法[A]《计算机工程与应用》.2011

[2]Prechelt L, Malpohl G, Philippsen M.FindingPlagiarisms amonga Set of Programs with JPlag[J].Journal of Universal ComputerScience, 2002, 1016-1038

[3]熊浩, 晏海华, 郭涛, 等.代码相似性检测技术:研究综述[J].计算机科学, 2010, 37 (8) :9-14.

[4]Michael J.Wise.YAP3:IMPROVED DETECTION OFSIMILARITIES IN_COMPUTER PROGRAM AND OTHERTEXTS[Z].Department of Computer Science, University of Syd-ney, Australia

[5]何仲英.C语言源代码相似度比较的研究与实现 (.学士学位论文) .广东:广东金融学院, 2012

考拉兹猜想C语言代码-九院黄伟 篇3

考拉兹猜想,又称为3n+1猜想、角谷猜想、哈塞猜想、乌拉姆猜想或叙拉古猜想,是由日本数学家角谷静夫发现,是指对於每一个正整数,如果它是奇数,则对它乘3再加1,如果它是偶数,则对它除以2,如此循环,最终都能够得到1。

#include

main()

{

int n;//存储该自然数

int i;

printf(“请输入一个自然数:”);

scanf(“%d”,&n);

for(i=1;;i++){

if(n==1){

printf(“第%d步:n=%dn”,i,n);break;

}else if(n%2==0){

printf(“第%d步:n=%d÷2=%dn”,i,n,n/2);

n=n/2;

}else if(n%2==1){

printf(“第%d步:n=%d×3+1=%dn”,i,n,n*3+1);

n=n*3+1;

}

}

迷宫游戏代码c语言 篇4

设计购物卡管理系统,系统主要模块:(1 实现系统内制卡、发卡功能;(2 实现系统内账户及相关账户管理;(3 实现卡交易和合法性检查;(4 实现卡交易积分功能;(5 实现卡报表功能;(6 数据以文件形式存储。【提示】

制卡:指申请一张购物卡,但还没有使用。发卡:该购物卡已经启用。

实现卡交易:指从卡中消费掉一定的金额。

一、系统需求分析

根据题目要求, 由于数据要以文件形式存储, 所以应提供文件的输入、输出等操作;在程序中要实现银行卡的各项功能,应提供制卡、发卡、存 款、消费、查询账户相关信息、查询账户交易记录、查询全部信息、退出 程序等一系列操作;另外还应提供键盘式选择菜单实现功能选择。

二、系统总体设计

分析了整个系统之后,根据上面的系统需求分析,可以将这个系统的 设计分为如下七大模块:制卡、发卡、存款、消费、查询账户相关信息、查询账户交易记录、查询全部信息。

三、系统详细设计 1.主函数设计

主函数的设计比较简介,只包括一个菜单函数,主要实现菜单功能, 提供了菜单输入、模块选择、退出系统等模块的调用。其中各功能模块用 菜单方式选择。

【流程图】 1 N 2 【小结】

函数开头有“文件包含”的预处理命令,所谓“文件包含”处理是指 一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件 包含到本文件之中。C 语言提供了 #include命令用来实现“文件包含”的 操作。

在本程序中包含了一下头文件:“string.h”、“ctype.h”、“stdio.h” ,方便 调用库函数实现某些功能。

在程序设计中,只使用一些基本类型(或称简单类型的变量(如整 型、实型、字符型变量等和构造类型数据——数组,是远远不够的。有 时候需要将不同类型的数据组合成一个有机的整体,以便于引用。这些组 合在一个整体中的数据是相互联系的。

在这个程序中,定义了一个结构体数组来存放购物卡用户的各种信 息,包括账户卡号、户主姓名、账户余额、账户状态、账户积分,结构体 如下:

struct user { int num;/*账户号码 */ char name[20];/*户主名称 */ float surplus;/*账户余额 */ char state[2];/*账户状态, y :已启用, n :未启用 */ int point;/*账户积分 */ }u[100];同时在各分函数中,定义了 int、float、char 等一系列变量类型,用来 实现函数功能。

在主函数前面,要加上对各功能函数的声明,声明的作用是把函数的 4 名字、函数的类型以及形参的类型、个数和顺序通知编译系统,以便在调 用该函数时系统按此进行对照检查,例如函数名是否正确,实参与形参的 类型和个数是否一致等。

主函数比较简单,但是函数的调用很多,所以,在程序的开头就加上 了各函数的声明,如下: void c_c(;/*制卡函数模块 */ void s_u(;/*发卡函数模块 */ void in_m(;/*存款函数模块 */

void out_m(;/*取款函数模块 */ void c_i(;/*查询账户相关信息函数模块 */ void c_r(;/*查询账户交易记录函数模块 */ void check(;/*查询全部信息函数模块 */ void menu(;/*主菜单函数模块 */ void back(;/*返回函数模块 */ void check_b(;/*给用户提示已有信息 */ 实现菜单选择功能,使用的是 switch 语句,根据用户输入的菜单选项 a ,调用不同的函数实现各种功能: switch(a { case 1:c_c(;break;/*制卡模块 */ case 2:s_u(;break;/*发卡模块 */ case 3:in_m(;break;/*存款模块 */ case 4:out_m(;break;/*取款模块 */ case 5:c_i(;break;/*查询账户相关信息模块 */ case 6:c_r(;break;/*查询交易记录模块 */ case 7:check(;break;/*查看所有信息模块 */ case 8:exit(0;break;/*退出模块 */ } 2.各功能模块设计

2.1 制卡模块 【流程图】

2.2 发卡模块 【流程图】

N

2.3 存款模块 【流程图】

2.4 消费模块

【流程图】 11 12

2.5 查询账户相关信息模块

【流程图】 13 N 14

c语言:编写猜数字小游戏。 篇5

程序:

#include#includevoid menu{printf(“***欢迎来挑战猜数字游戏***n”);printf(“*****请选择开始或退出*****n”);printf(“******1.start 0.exit******n”);}void game(){int num = 0;srand((unsigned)time(NULL));//随着时间变化生成不同的随机数int ret = rand() % 100 + 1;//是从一个时间点到此时的秒数while (1){printf(“请猜数字:”);scanf(“%d”,&num);if (num == ret){printf(“你真聪明,猜对了!n”);break;}else if(num > ret){printf(“你好笨,猜大了!n”);}else if (num < ret){printf(“你真蠢,猜小了!n”);}}}int main(){int input = 1;while (input){menu();printf(“请选择:”);scanf(“%d”,&input);switch (input){case 0:break;case 1:game();break;default:break;}}return 0;}

结果:

***欢迎来挑战猜数字游戏***

*****请选择开始或退出*****

******1.start 0.exit******

请选择:1

请猜数字:50

你真蠢,猜小了!

请猜数字:75

你真蠢,猜小了!

请猜数字:100

你好笨,猜大了!

请猜数字:85

你真蠢,猜小了!

请猜数字:93

你好笨,猜大了!

请猜数字:90

你好笨,猜大了!

请猜数字:87

你真蠢,猜小了!

请猜数字:88

你真蠢,猜小了!

请猜数字:89

你真聪明,猜对了!

***欢迎来挑战猜数字游戏***

*****请选择开始或退出*****

******1.start 0.exit******

请选择:0

上一篇:人大现代管理学题库下一篇:普通员工工作个人总结