C语言课程设计

来源:互联网转载 | 更新日期:2023-09-11 08:35:51

《C语言课程设计》任务书

课程设计名称:C语言课程设计(C Language Designing )
课程设计学分:1学分
课程设计时间:第一学年第1学期
课程设计学时(周数):28学时(1周)
课程设计年级:大一
适用专业:计算机大类专业
一、课程设计的性质与教学目标
课程性质:C语言是一种编程灵活,特色鲜明的程序设计语言。课程是理论与实践相结合的一门计算机专业基础课程。C语言在学习基本知识如概念,方法和语法规则的基础上,进行实践能力的训练,以提高学生的动手和编程能力。
课程目标:能够掌握一些较为常见的算法,并初步积累编程经验,解决一些典型实际工程问题;综合运用编程方法和问题分析方法,设计针对解决问题的算法步骤。初步培养数据采集、数据分析、数据处理及结果分析的能力。具体为:
 课程目标1:具备计算机软件基本理论和简单算法设计能力;掌握C语言程序设计的基本方法,运用结构化程序设计思想分析问题。
 课程目标2:初步培养学生对复杂问题的分析能力和解决问题的能力;学生能够针对实际应用问题,使用C语言完成代码的设计、实现、调试、测试和演示。
题目难度、深度、广度分析:
(1)给定8个基础课题和2个深化课题,学生必须完成8个基础题,同时任意选择1个深化课题,学生按照课题要求完成相应任务。
(2)发明、创新性课题:这类课题要求学生充分挖掘自己的创造性思维潜力。
四、课程设计内容
1、基础部分
①分屏处理数据系统:
随机产生1000个数,并分屏显示(每行显示10个数字,每页显示10行),而且在每一屏的下方显示本屏中数据的最大值、最小值和平均值。
提示:循环显示,在分屏点上输出press any key to continue…,通过getchar()函数让用户以按回车键的方式进入下一屏。
附加要求:能够前后循环翻页,且输入页码可以回显该页码数据,如果页码错误默认回到第一页。

②求积分:
小明最近在学高等数学,被数学里面的微积分难倒了。但小明编程能力很强,于是他就突发奇想,看能不能用编程的方法来帮助理解数学的学习。以下是他想求解的问题:

请编程求解 的值,并分析 的值与 的关系。(提示:如下图,按照积分的原理,将函数区间切分为非常小的长方形,其中长方形的宽度为切分的间距 ,长方形的高度为方格所在横坐标对应的函数值 ,则图中第 个小长方形(阴影部分)面积为 ,而最终函数的积分值为所有小方格的面积之和。)

③最佳分组
随机生成一组位于二维坐标系的点集(15<=点集元素个数N<=65),这些点不重合,每个点的位置由x,y值决定,x,y为整数且0<x<80,0<y<40。现在想知道这些点按距离远近该分成几个组合适,已知分组值K备选范围从1-10,输入K值,请你按以下方法画出分组结果:
1)从N个数据点中随机挑选K个不同点作为K个组的初始中心起点(组中心);
2)计算所有点到K个组中心的距离(欧式距离),并把它归到距离最近的组(如果有多个组距离一样,随便选一个归入);
3)更新K个组的中心值(求出该组所有点的x平均值和y平均值,作为新的组中心);
4)重复(2)~(3)步直至新的组中心和原来的组中心差值小于指定阈值(人为设置),或超出最大重复次数(人为设置),算法结束;
5)在控制台画出K组分组结果,每组用不同数字表示,使用0,1,2,3…9分别表示10个组。
示例如下:

④曲线2阶曲线绘制:
2阶曲线公式可描述为

其中, 为曲线的参数,由用户手动输入。

请编程绘制出该曲线的图形,坐标原点,y轴正方向,x轴正方向,如下图所示

提示:可利用二维数组预先计算并存储每个点(图中用“*”表示)的坐标,然后利用循环一次性输出图形。注意坐标线的显示。

⑤任意进制转换:
编程将任意n( )进制的正整数num1转换成m( )进制的num2表示形式。
要求:实现以下形式的进制转换函数 void transX2X(char num1[],int n, int m, char num2[])
其中,字符数组num1待转换数的数字序列,n是其对应的进制数,num2用于存储转换进制后的数字序列,m是其对应的进制数。用法如下:char num2[256]; transX2X(“5”,10, 2, num2);则经过函数调用后,num2中的值为“101”

⑥排序(冒泡排序、快速排序、直接插入排序、选择排序):
选择两种排序方法,理解其算法核心思想、实现和对比。

⑦小明上学
小明是汉东省政法大学附属中学的一名学生,他每天都要骑自行车往返于家和学校。为了能尽可能充足地睡眠,他希 望能够预计自己上学所需要的时间。他上学需要经过数段道路,相邻两段道路之间设有至多一盏红绿灯。
京州市的红绿灯是这样工作的:每盏红绿灯有红、黄、绿三盏灯和一个能够显示倒计时的显示牌。假设红绿灯被设定 为红灯 r 秒,黄灯 y 秒,绿灯 g 秒,那么从 0 时刻起,[0,r) 秒内亮红灯,车辆不许通过;[r, r+g) 秒内亮绿灯, 车辆允许通过;[r+g, r+g+y) 秒内亮黄灯,车辆不许通过,然后依次循环。倒计时的显示牌上显示的数字 l(l > 0)是 指距离下一次信号灯变化的秒数。

  • 问题描述
    一次上学的路上,小明记录下了经过每段路的时间,和各个红绿灯在小明到达路口时的颜色和倒计时秒数。希望你帮忙计算此次小明上学所用的时间。
  • 输入格式
    输入的第一行包含空格分隔的三个正整数 r、y、g,表示红绿灯的设置。这三个数均不超过 106。
    输入的第二行包含一个正整数 n(n ≤ 100),表示小明总共经过的道路段数和看到的红绿灯数目。
    接下来的 n 行,每行包含空格分隔的两个整数 k、t。k=0 表示经过了一段道路,耗时 t 秒,此处 t 不超过 106;k=1、2、3 时,分别表示看到了一个红灯、黄灯、绿灯,且倒计时显示牌上显示的数字是 t,此处 t 分别不会超过 r、y、g。
  • 输出格式
    输出一个数字,表示此次小明上学所用的时间。
  • 样例输入
    30 3 30
    8
    0 10
    1 5
    0 11
    2 2
    0 6
    0 3
    3 10
    0 3
  • 样例输出
    70
  • 样例说明
    小明先经过第一段道路,用时 10 秒,然后等待 5 秒的红灯,再经过第二段道路,用时 11 秒,然后等待 2 秒的黄 灯和 30 秒的红灯,再经过第三段、第四段道路,分别用时6、3秒,然后通过绿灯,再经过最后一段道路,用时 3 秒。 共计 10 + 5 + 11 + 2 + 30 + 6 + 3 + 3=70 秒。
  • 测试用例n、k、t、r、y、g的值可考虑随机产生,并在此基础上采用“案例集合”,即随机产生多组测试用例。
  • ⑧期末统计分数
    某班有最多不超过60人(具体人数n由键盘输入)参加期末考试,考试科目为程序设计、英语和数学,编程实现以下功能:

  • 输入学生的各科考试成绩。
  • 计算每个学生的平均分。
  • 输出每名学生的各科考试成绩和个人平均分。
  • 计算输出各科目的平均分、最高分、最低分、及格率。
  • 按学生总评成绩进行排名,并输出排名。
  • 2、 深化部分 (以下2题,任选1题 )
    题目1:推箱子游戏设计

    题目描述:简易小人推箱子游戏,游戏过程:(1)初始时,小人在窗口的左上角位置,箱子在小人的右侧;(2)在小人前方随机生成若干个阻碍物;(3)在窗口的右侧随机生成一个出口;(4)要求小人能够将箱子推到窗口右侧出口。(5)*实时给出推荐路径(6)*自动寻路推箱子。
    基本要求:

  • 用键盘上、下、左、右按键控制小人移动。小人必须推箱子,而不能拉箱子。
  • 在小人前方随机生成若干个阻碍物和一个箱子。
  • 小人必须穿过阻碍物之间的空隙,到达出口。
  • 小人进入出口时提示游戏成功。
    5 ) 小人无路可走时提示游戏失败。
  • 小人每移动一步在窗口的左下角显示当前已经移动的步数。
    7 ) 用户可自行放弃游戏。
  • 有难度晋级。
    9)能够给出一条推荐路径。
    10)自动寻路,1秒移动一次,直到目标。
    提示:小人可以用“ ”表示(ASCII码值为12),阻碍物可用“ ”表示(ASCII码值为5),推箱子可用“ ”表示(ASCII码值为30)。
    加分方向:尽量体现游戏的趣味性和智能性。
  • 题目2:小蜜蜂游戏
    题目描述:80年代产生了很多经典游戏,像《魂斗罗》、《街头霸王》、《赤色要塞》、《双截龙》、《沙罗曼蛇》…其中,作为红白机射击游戏鼻祖《小蜜蜂(Galaxian)》游戏更是让人怀旧。也学了一学期C语言了,亲爱的小伙伴们,(+o+)v,让我们一起动手做一个吧。

    基本要求:

  • 主角在屏幕最下方,通过键盘左右操控移动;
  • 敌方初始在屏幕上方,有一定的队形(可自定义);
  • 主角和敌方都可发射子弹,主角被击中,损失一条命(共3条);敌方被击中,直接消失;
  • 敌方移动控制,敌方小兵可以按一定轨迹(至少设计1种:直线飞往主角、弧线飞往主角、螺旋飞法…)撞向主角;
  • 至少设计3个基础关卡,难度依次递增,关卡1敌人只会发射子弹,关卡2敌人也会撞主角,关卡3敌人可以多只同时撞向主角;
  • 至少设计1个BOSS关卡,一只AI比较强的大蜜蜂(请使用多个图案拼凑它,让它看起来霸气些噢血条长点,别一下就挂了),它可以较大概率躲避主角子弹,并可以来回快速移动撞击主角(设计个漂亮招式吧,请至少设计2种:瞬移攻击?次元连斩?…),可以加个漂亮的拖尾效果哟(+o+)v,同时,它可以拥有各种华丽子弹效果(至少设计2种:火箭炮,光束弹,连环旋转弹,反弹弹…发挥你的想象吧);
  • 拉仇恨,BOSS血多的时候AI弱,血值越少,攻击和躲避能力越强。
  • 扩展要求:
    8) 设计可以双人玩,每人3条命,加入借命功能,挂掉后可借用别人剩余一条命;
    9) 设计一些奖励元素,从屏幕上方掉下来各种奖励,比如:不同的子弹、补血、绝招(使得主角也可以次元斩飞向敌方阵地撞击敌人。。。);
    10) 设计一个菜单选择单人、双人游戏,并设计剧情开头动画和结尾动画(失败and胜利)
    11) 给游戏添加音乐和特效。

    五、课程设计时间进程表(若有节假日,任课老师可合理调整进度)
    第一天:1、布置任务,讲解设计课题的基本设计思路和基本要求。
    2、讲解课程设计报告本要求、需要的提交电子资料和课程设计最总成绩评定标准。
    3、提供本次课程设计关键技术的基础练习(可根据所选课题选择相应的题进行练习):
    第二天:讲解设计深化部分的基本设计思路和基本要求,及其在成绩评定中的比例。
    第三天:学生自主设计,老师辅导,并进行抽查。
    第四天:再次讲解课程设计报告本要求,强调报告格式要求。需要的提交电子资料。
    学生自主设计,老师辅导,并进行抽查。
    第五天:学生自主设计,老师辅导,并进行抽查,部分同学可进行作业演示报告。
    递交课程设计电子资料和设计报告。
    六、设计过程和报告格式要求
    (1) 设计要求
    编写程序要求遵循如下基本要求:
     模块化程序设计
     锯齿型书写格式
     必须上机调试通过
    (2) 课程设计报告格式
     设计目的
     总体设计(程序设计流程图)
     详细设计(如函数功能、入口及出口参数说明,函数调用关系描述等)
     调试与测试:调试方法,测试结果的分析与讨论,测试过程到的主要问题及采取的解决措施
     源程序清单和执行结果:源程序中应有足够的注释

    七、考核及成绩评分
    1)总评成绩评分标准:
    考核方式 比例% 主要考核内容
    平时表现 10% 阶段目标实现情况,学习活跃度
    基础题
    +提高题 60% 基础题目的完成情况80%
    提高提的完成情况20%
    设计报告检查 15% 设计报告的规范性及内容完整性
    演示答辩 15% 课程设计报告、现场演示及讲解、问题回答情况。

    附本人做的代码如下:
    1.

    #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<time.h> #include<conio.h> void sj(long int b[1001]) //使用随机数函数以及time函数将系统时间转换成随机数并赋值给数组中元素 {int i;srand(time(NULL));for (i = 0; i <= 1000; i++){b[i] = rand();} } int zd(long int c[1001], int j) //进行循环求最大值 {int i;long int max = 0;for (i = 100 * j; i < 100 * (j + 1); i++){if (c[i] > max)max = c[i];}return max; } int zx(long int d[1001], int i) //进行循环求最小值 {int j;long int min = 100000;for (j = 100 * i; j < (i + 1) * 100; j++){if (d[j] < min)min = d[j];}return min; } double pj(long int e[1001], int i) //进行循环求平均值 {int j;double ave, add = 0;for (j = 100 * i; j < (i + 1) * 100; j++){add = add + e[j];}ave = add / 100;return ave; } int main() {int i, n = 1, j;long int max, min;double ave;char f, g;int ch1 = 0;long int a[1001] = { 0 }; //初始化int k; //用作回查sj(a); //赋值for (i = 0;; i++) //求最大值并输出{for (j = i * 100; j < (i + 1) * 100; j++) //输出数组{printf("%-6ld", a[j]);if (n++ % 10 == 0)printf("\n");}max = zd(a, i);min = zx(a, i);ave = pj(a, i);printf("当前页最大值为:%ld\n", max); //输出最大值printf("当前页最小值为:%ld\n", min); //输出最小值printf("当前页平均值为:%f\n", ave); //输出平均值printf("当前页码:%d\n", i + 1); //输出当前页码提示system("pause"); //实现分屏操作while (1){ch1 = _getch();switch (ch1){case 13:{system("cls");break;}case 87://如果是W{i = i - 2;if (i < -1)i = 8;system("cls");break;}case 83://如果是S{i = i;if (i > 8)i = -1;system("cls");break;}case 'O':{printf("您是否需要回查数据? (是:Y/否:N)\n");if ((f = getchar()) == 'Y'){printf("请输入页码:");scanf_s("%d", &k);if (k < 0 || k>10){k = 1;}n = 1;system("cls");printf("您正在回查第%d页!\n", k);for (i = 100 * (k - 1); i < 100 * k; i++){printf("%-6ld", a[i]);if (n++ % 10 == 0){printf("\n");}}printf("当前页最大值为:%ld\n", zd(a, k));printf("当前页最小值为:%ld\n", zx(a, k));printf("当前页平均值为:%f\n", pj(a, k));}if ((f = getchar()) == 'N'){return 0;}system("pause");return 0;break;}}break;}}return 0; }
  • #include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> double hs(double i) {double j;j = 1.0 / (pow(i, 2) + 4 * i);if (j < 0){j = -j;}j = j * 0.00001;return j; } int main() {int a, b;double x, y = 0;printf("请输入上限和下限:\n");scanf_s("%d %d", &a, &b);if (a == 0 && b == 0){printf("0");return 0;}for (x = a; x <= b; x = x + 0.00001){y = y + hs(x);}printf("%f", y);return 0; }
  • 暂时未完成
    4.

    #include<stdio.h> #include<time.h> #include<math.h> #include<stdlib.h> int main() {double x[65] = { 0 }, y[65] = { 0 }, K[10] = { 0 }, zx[10] = { 0 }, zy[10] = { 0 };double sp[65][10] = { 0 };int n, k, i, j, l, o;srand(time(NULL));do{n = rand() % 66;} while (n < 15 || n>65);printf("n=%d\n", n);for (i = 0; i < n; i++){do{l = rand() % 80;} while (l < 0);do{o = rand() % 40;} while (o < 0);x[i] = l;y[i] = o;}scanf_s("%d", &k);K[0] = rand() % n;K[k - 1] = rand() % n;for (i = 0; i < k; i++){for (j = 0; j < k; j++){if (K[i] == K[j]){K[j] = rand() % (n - 1);}}}//随机生成k个中心点for (i = 0; i < k; i++){l = K[i];zx[i] = x[l];zy[i] = y[l];printf("%d %f %f\n", l, zx[i], zy[i]);}//开始循环while (1){for (i = 0; i < n; i++){for (j = 0; j < k; j++){sp[i][j] = sqrt(pow(zx[j] - x[i], 2) + pow(zy[j] - y[i], 2));printf("%f\n", sp[i][j]);}}//求了距离//分组代码for (i = 0; i < k; i++){//添加更新中心点代码}}return 0; }
  • #include<stdio.h> #include<math.h> #include<string.h> char num1[1000] = { 0 }, num2[1000] = { 0 };void X3X( int o,int n, int m, char num6[]) {int i, j;long int k = 0;int l = 0;for (i = 0;i<=o; i++){if (num1[i] != '\0'){l++;num1[i] = num1[i] - 48;if (num1[i] > 10){num1[i] = num1[i] - 7;}}}for (i = 0; i < l; i++){k = k + num1[i] * pow(n, l - i - 1);}for (i = 0;; i++){num6[i] = k % m + 1;k = k / m;if (k == 0){break;}} } void X2X(char num3[1000], int n, int m, char num4[1000]) {int i, j;long int k=0;int l=0;for (i = 0;; i++){if (num3[i] != '\0'){l++;num3[i] = num3[i] - 48;}elsebreak;}for (i = 0; i < l; i++){k =k+num3[i] * pow(n, l - i - 1);}for (i = 0;; i++){num4[i] = k % m+1;k = k / m;if (k == 0){break;}} } void X4X(int n, int m, char num7[1000]) {int i, j;long int k = 0;int l = 0;for (i = 0;; i++){if (num1[i] != '\0'){l++;num1[i] = num1[i] - 48;}elsebreak;}for (i = 0; i < l; i++){k = k + num1[i] * pow(n, l - i - 1);}for (i = 0;; i++){num7[i] = k % m + 1;/*if (num7[i] > 10){num7[i] = num7[i] + 17;}*/k = k / m;if (k == 0){break;}} } int main() {int i,n, m;printf("请输入初始进制和要转换成的进制:\n");scanf_s("%d %d", &n, &m);for (i = 0; i < 1000; i++)//初始化为空{num1[i] = '\0';num2[i] = '\0';}printf("请输入数据:");getchar();gets_s(num1);for (i = 0;; i++){if (num1[i] == 0)break;}if (n <= 10 && m <= 10){X2X(num1, n, m, num2);}else if(n>10&&m<=10){X3X(i, n, m, num2);}else if (m > 10){X4X(n,m,num2);}for (i = 0;; i++){if (num2[i] == '\0')break;}i -= 1;for (; i >= 0; i--){if (num2[i] < 10){printf("%d", num2[i] - 1);}else{printf("%c", num2[i] + 54);}}return 0; }

    6.1.

    #include<stdio.h> int main() {int i, j, n, a[10];printf("输入10个数,以空格间隔");for (j = 0; j < 10; j++){scanf_s("%d", &a[j]);}for (i = 0; i < 9; i++){for (j = i + 1; j < 10; j++){if (a[i] > a[j]){n = a[i];a[i] = a[j];a[j] = n;}}}for (j = 0; j < 10; j++){printf("%d ", a[j]);}return 0; }

    6.2.

    #include<stdio.h> int main() {int i, j, n, a[10];printf("请输入十个数,以空格间隔:");for (j = 0; j < 10; j++){scanf_s("%d", &a[j]);}printf("\n");for (i = 0; i < 10; i++){for (j = 0; j < 10 - i - 1; j++){if (a[i] > a[j + 1]){n = a[j];a[j] = a[j + 1];a[j + 1] = n;}}}for (j = 0; j < 10; j++){printf("%d ", a[j]);}return 0; }
  • #include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<time.h> int main() {int r[100] = { 0 }, y[100] = { 0 }, g[100] = { 0 }, n, i, ti = 0, k[100] = { 0 }, t[100] = { 0 };int a0, a1, a2, a3, a4, a5, a6;srand(time(NULL));n = rand() % 101;for (i = 0; i < 100; i++){a0 = rand()%106;r[i] = a0;a1 = rand()%106;y[i] = a1;a2 = rand()%106;g[i] = a2;a3 = rand() % 4;k[i] = a3;}//随机给灯和K赋值for (i = 0; i < n; i++){if (k[i] == 0)//过街{do{a4 = rand() % 106;t[i] = a4;} while (t[i] <= 0);//保证t[i]不为0ti = ti + t[i];}else if (k[i] == 1)//红灯{do{a4 = rand() % r[i];//时间少于当前红灯时间t[i] = a4;}while (t[i] <= 0);ti = ti + t[i];}else if (k[i] == 2)//黄灯{do{a4 = rand() % y[i];//时间少于当前黄灯时间t[i] = a4;} while (t[i] <= 0);ti = ti + t[i] + r[i];}else if (k[i] == 3)//绿灯,不计数{do{a4 = rand() % y[i];t[i] = a4;} while (t[i] <= 0);}printf("k=%d r=%d y=%d g=%d t=%d \n",k[i], r[i], y[i], g[i], t[i]);}printf("%d %d", n, ti);return 0; }
  • #include<stdio.h> #include<math.h> #include<string.h> int n; double zd(double a[61])//求最大 {int i;double max=0;for (i = 0; i < n; i++){if (max < a[i]){max = a[i];}}return max; }//求最大值 double zx(double a[61]) {int i;double min = 100;for (i = 0; i < n; i++){if (a[i] < min){min = a[i];}}return min; }//求最小值 double pj(double a[61]) {int i;double b=0;for (i = 0; i < n; i++){b = b + a[i];}b = b / n;return b; }//求平均值 double jgl(double a[61]) {int i;double s, j = 0;for (i = 0; i < n; i++){if (a[i] >= 60){j++;}}s = j / n*100;return s; }//求及格率 int main() {double cx[61] = { 0 }, yy[61] = { 0 },sx[61] = { 0 };double ave[61] = { 0 }, cxa = 0, yya = 0, sxa = 0;int i,j;int rand[61] = { 0 };double q1, q2, q3;printf("请输入期末考试人数:");scanf_s("%d", &n);printf("请输入各科权重:");scanf_s("%lf %lf %lf", &q1, &q2, &q3);if ((q1 + q2 + q3) != 1){printf("请检查权重!");return 0;}printf("请依次输入C语言、英语、数学成绩\n");for (i = 0; i < n; i++)//循环输入{scanf_s("%lf %lf %lf", &cx[i], &yy[i], &sx[i]);}for (i = 0; i < n; i++)//求个人总分、平均{ave[i] = (cx[i]*q1 + yy[i]*q2 + sx[i]*q3);cxa = cxa + cx[i];yya = yya + yy[i];sxa = sxa + sx[i];}cxa = cxa / n;yya = yya / n;sxa = sxa / n;for (i = 0; i < n; i++){printf("第%d名学生的C语言成绩是:%.2f 英语成绩是:%.2f 数学成绩是:%.2f ", i + 1, cx[i], yy[i], sx[i]);printf("其个人加权平均分为:%.2f\n", ave[i]);}printf("C语言的平均分为:%.2f 最高分:%.2f 最低分:%.2f 及格率:%.2f%%\n", pj(cx), zd(cx), zx(cx), jgl(cx));printf("英语的平均分为:%.2f 最高分:%.2f 最低分:%.2f 及格率:%.2f%%\n", pj(yy), zd(yy), zx(yy), jgl(yy));printf("数学的平均分为:%.2f 最高分:%.2f 最低分:%.2f 及格率:%.2f%%\n", pj(sx), zd(sx), zx(sx), jgl(sx));for (i = 0; i < n; i++){rand[i] = n;for (j = 0; j < n; j++){if (ave[i] > ave[j]){rand[i]--;}}printf("第%d个人的排名是:%d\n",i+1,rand[i]);}return 0; }

    附加1.

    #include <stdio.h> #include <stdlib.h> #include <conio.h> #include<time.h> int i, j; void draw_map(int map[50][50]) {for (i = 0; i < 50; i++){for (j = 0; j < 50; j++){switch (map[i][j]){case 0:printf(" "); //数字代表道路break;case 1:printf("%c", 5); //数字代表墙壁break;case 2:printf(" "); //数字是游戏边框的空白部分break;case 3:printf("*"); //数字代表目的地break;case 4:printf("%c", 30); //数字代表箱子break;case 7:printf("$"); //数字代表箱子进入目的地break;case 6:printf("%c", 12); //数字代表人break;case 9:printf("@"); //数字代表人进入目的地break;}}printf("\n"); //分行输出} } int main() {char input;int count = 0, count2 = 0; //定义记分变量int num = 0;//定义计步器int ww;int diff;printf("请输入要去的关卡数:(1-48)");scanf_s("%d", &diff); loop: srand(time(NULL));num = 0;int map[50][50] = { 0 };int wall[50][50] = { 0 };for (i = 0; i < 50; i++){for (j = 0; j < 50; j++){wall[i][j] = rand() % 2;}}//随机生成墙for (i = 0; i < 50; i++){map[0][i] = 1;map[49][i] = 1;map[i][0] = 1;map[i][49] = 1;}//生成墙壁map[1][1] = 6;map[2][2] = 4;for (i = 0; i < 50; i++){ww = rand() % 50;map[i][3] = wall[ww][i];}//生成第一道墙for (i = 0; i < 48; i++){ww = rand() % 50;map[i][46] = wall[ww][i];}//生成终点处的墙for (i = 3; i < diff; i = i + 3){for (j = 0; j < 49; j++){map[i][j] = wall[rand() % 50][rand() % 50];}}//调用随机数函数,生成墙壁{ww = rand() % 49;map[ww][49] = 3;//生成目的地map[ww][48] = 0;map[ww - 1][48] = 0;map[ww + 1][48] = 0;//避免目的地附近无法进入}while (1){system("CLS");printf("\n");draw_map(map);printf("得分:%d\n", count2);if (count == 1){count2++;count = 0;diff++;if (diff > 48){return 0;}goto loop;//跳转至生成地图}//找初始位置for (i = 0; i < 50; i++){for (j = 0; j < 50; j++){if (map[i][j] == 6 || map[i][j] == 9)break;}if (map[i][j] == 6 || map[i][j] == 9)break;}printf("您的当前坐标(%d,%d)", i, j);printf("您的当前步数为:%d", num);input = _getch(); //用getch()函数无需回车确认地获取用户输入,用于控制行走方向。switch (input){case 'R':{goto loop;}case 'O':{return 0;}case 'W'://如果人前面是空地。 //0代表空地 6代表人 //3代表目的地num++;if (map[i - 1][j] == 0){map[i - 1][j] = 6 + 0; //人往前走一步,ID为人的ID()加上空地的ID()。if (map[i][j] == 9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。map[i][j] = 3; //将人往前走一步后原地的ID修改为空地ID()。elsemap[i][j] = 0; //否则原地ID修改为空地ID 。 }//如果人前面是目的地。else if ((map[i - 1][j] == 3) || (map[i - 1][j] == 9)){map[i - 1][j] = 6 + 3; //人往前走一步,ID为人ID+目的地ID=9。if (map[i][j] == 9) //如果原地也是目的地(ID为)。map[i][j] = 3; //人走后把原地ID修改回目的地ID。elsemap[i][j] = 0; //否则原地ID修改为为空地ID}//如果人前面是箱子。//4代表箱子 //7箱子进入目的地else if (map[i - 1][j] == 4){//如果人前面是箱子,而箱子前面是空地。if (map[i - 2][j] == 0){map[i - 2][j] = 4; //人推箱子往前走一步,把空地ID修改为箱子ID()//下面是对箱子原地进行判断if (map[i - 1][j] == 7) //如果箱子原地为目的地。map[i - 1][j] = 9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。elsemap[i - 1][j] = 6; //否则,人站在了原来的空地上,ID应该为+0=6。//下面是对人原地进行判断if (map[i][j] == 9) //如果之前是目的地。map[i][j] = 3; //人走了之后修改回目的地ID。elsemap[i][j] = 0; //否则就是空地。}//如果人的前面是箱子,而箱子前面是目的地。else if (map[i - 2][j] == 3){map[i - 2][j] = 7; //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。count++;//下面是对箱子原先位置的判断,同上。if (map[i - 1][j] == 7)map[i - 1][j] = 9;elsemap[i - 1][j] = 6;//下面是对人原先位置进行判断,同上。if (map[i][j] == 9)map[i][j] = 3;elsemap[i][j] = 0;}}break;case 'S'://如果人前面是空地。num++;if (map[i + 1][j] == 0){map[i + 1][j] = 6 + 0; //人往前走一步,ID为人的ID()加上空地的ID()。if (map[i][j] == 9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。map[i][j] = 3; //将人往前走一步后原地的ID修改为空地ID()。elsemap[i][j] = 0; //否则原地ID修改为空地ID 。 }//如果人前面是目的地。else if (map[i + 1][j] == 3){map[i + 1][j] = 6 + 3; //人往前走一步,ID为人ID+目的地ID=9。if (map[i][j] == 9) //如果原地也是目的地(ID为)。map[i][j] = 3; //人走后把原地ID修改回目的地ID。elsemap[i][j] = 0; //否则原地ID修改为为空地ID}//如果人前面是箱子。else if (map[i + 1][j] == 4){//如果人前面是箱子,而箱子前面是空地。if (map[i + 2][j] == 0){map[i + 2][j] = 4; //人推箱子往前走一步,把空地ID修改为箱子ID()//下面是对箱子原地进行判断if (map[i + 1][j] == 7) //如果箱子原地为目的地。map[i + 1][j] = 9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。elsemap[i + 1][j] = 6; //否则,人站在了原来的空地上,ID应该为+0=6。//下面是对人原地进行判断if (map[i][j] == 9) //如果之前是目的地。map[i][j] = 3; //人走了之后修改回目的地ID。elsemap[i][j] = 0; //否则就是空地。}//如果人的前面是箱子,而箱子前面是目的地。else if (map[i + 2][j] == 3){map[i - 2][j] = 7; //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。count++;//下面是对箱子原先位置的判断,同上。if (map[i + 1][j] == 7)map[i + 1][j] = 9;elsemap[i + 1][j] = 6;//下面是对人原先位置进行判断,同上。if (map[i][j] == 9)map[i][j] = 3;elsemap[i][j] = 0;}}break;case 'A'://如果人前面是空地。num++;if (map[i][j - 1] == 0){map[i][j - 1] = 6 + 0; //人往前走一步,ID为人的ID()加上空地的ID()。if (map[i][j] == 9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。map[i][j] = 3; //将人往前走一步后原地的ID修改为空地ID()。elsemap[i][j] = 0; //否则原地ID修改为空地ID 。 }//如果人前面是目的地。else if (map[i][j - 1] == 3){map[i][j - 1] = 6 + 3; //人往前走一步,ID为人ID+目的地ID=9。if (map[i][j] == 9) //如果原地也是目的地(ID为)。map[i][j] = 3; //人走后把原地ID修改回目的地ID。elsemap[i][j] = 0; //否则原地ID修改为为空地ID}//如果人前面是箱子。else if (map[i][j - 1] == 4){//如果人前面是箱子,而箱子前面是空地。if (map[i][j - 2] == 0){map[i][j - 2] = 4; //人推箱子往前走一步,把空地ID修改为箱子ID()//下面是对箱子原地进行判断if (map[i][j - 1] == 7) //如果箱子原地为目的地。map[i][j - 1] = 9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。elsemap[i][j - 1] = 6; //否则,人站在了原来的空地上,ID应该为+0=6。//下面是对人原地进行判断if (map[i][j] == 9) //如果之前是目的地。map[i][j] = 3; //人走了之后修改回目的地ID。elsemap[i][j] = 0; //否则就是空地。}//如果人的前面是箱子,而箱子前面是目的地。else if (map[i][j - 2] == 3){count++;map[i][j - 2] = 7; //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。//下面是对箱子原先位置的判断,同上。if (map[i][j - 1] == 7)map[i][j - 1] = 9;elsemap[i][j - 1] = 6;//下面是对人原先位置进行判断,同上。if (map[i][j] == 9)map[i][j] = 3;elsemap[i][j] = 0;}}break;case 'D'://如果人前面是空地。num++;if (map[i][j + 1] == 0){map[i][j + 1] = 6 + 0; //人往前走一步,ID为人的ID()加上空地的ID()。if (map[i][j] == 9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。map[i][j] = 3; //将人往前走一步后原地的ID修改为空地ID()。elsemap[i][j] = 0; //否则原地ID修改为空地ID 。 }//如果人前面是目的地。else if (map[i][j + 1] == 3){map[i][j + 1] = 6 + 3; //人往前走一步,ID为人ID+目的地ID=9。if (map[i][j] == 9) //如果原地也是目的地(ID为)。map[i][j] = 3; //人走后把原地ID修改回目的地ID。elsemap[i][j] = 0; //否则原地ID修改为为空地ID}//如果人前面是箱子。else if (map[i][j + 1] == 4){//如果人前面是箱子,而箱子前面是空地。if (map[i][j + 2] == 0){map[i][j + 2] = 4; //人推箱子往前走一步,把空地ID修改为箱子ID()//下面是对箱子原地进行判断if (map[i][j + 1] == 7) //如果箱子原地为目的地。map[i][j + 1] = 9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。elsemap[i][j + 1] = 6; //否则,人站在了原来的空地上,ID应该为+0=6。//下面是对人原地进行判断if (map[i][j] == 9) //如果之前是目的地。map[i][j] = 3; //人走了之后修改回目的地ID。elsemap[i][j] = 0; //否则就是空地。}//如果人的前面是箱子,而箱子前面是目的地。else if (map[i][j + 2] == 3){count++;map[i][j + 2] = 7; //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。map[i][j] = 0;//下面是对箱子原先位置的判断,同上。if (map[i][j + 1] == 7)map[i][j + 1] = 9;elsemap[i][j + 1] = 6;//下面是对人原先位置进行判断,同上。if (map[i][j] == 9)map[i][j] = 3;elsemap[i][j] = 0;}}break;}} }

    部分程序有些冗余,有待完善、修正。

    上一篇:基于python的transbigdata实现出租车轨迹数据分析与可视化

    下一篇:Windows 打开和关闭默认共享方法汇总

    相关文章

    Copyright © 网站出售-网站交易平台 版权信息

    网站备案号:黔ICP备2023004141号