C语言课程设计

article/2025/10/8 5:59:57

《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)是 指距离下一次信号灯变化的秒数。

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

⑧期末统计分数
某班有最多不超过60人(具体人数n由键盘输入)参加期末考试,考试科目为程序设计、英语和数学,编程实现以下功能:

  1. 输入学生的各科考试成绩。
  2. 计算每个学生的平均分。
  3. 输出每名学生的各科考试成绩和个人平均分。
  4. 计算输出各科目的平均分、最高分、最低分、及格率。
  5. 按学生总评成绩进行排名,并输出排名。

2、 深化部分 (以下2题,任选1题 )
题目1:推箱子游戏设计

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

  1. 用键盘上、下、左、右按键控制小人移动。小人必须推箱子,而不能拉箱子。
  2. 在小人前方随机生成若干个阻碍物和一个箱子。
  3. 小人必须穿过阻碍物之间的空隙,到达出口。
  4. 小人进入出口时提示游戏成功。
    5 ) 小人无路可走时提示游戏失败。
  5. 小人每移动一步在窗口的左下角显示当前已经移动的步数。
    7 ) 用户可自行放弃游戏。
  6. 有难度晋级。
    9)能够给出一条推荐路径。
    10)自动寻路,1秒移动一次,直到目标。
    提示:小人可以用“ ”表示(ASCII码值为12),阻碍物可用“ ”表示(ASCII码值为5),推箱子可用“ ”表示(ASCII码值为30)。
    加分方向:尽量体现游戏的趣味性和智能性。

题目2:小蜜蜂游戏
题目描述:80年代产生了很多经典游戏,像《魂斗罗》、《街头霸王》、《赤色要塞》、《双截龙》、《沙罗曼蛇》…其中,作为红白机射击游戏鼻祖《小蜜蜂(Galaxian)》游戏更是让人怀旧。也学了一学期C语言了,亲爱的小伙伴们,(+o+)v,让我们一起动手做一个吧。

基本要求:

  1. 主角在屏幕最下方,通过键盘左右操控移动;
  2. 敌方初始在屏幕上方,有一定的队形(可自定义);
  3. 主角和敌方都可发射子弹,主角被击中,损失一条命(共3条);敌方被击中,直接消失;
  4. 敌方移动控制,敌方小兵可以按一定轨迹(至少设计1种:直线飞往主角、弧线飞往主角、螺旋飞法…)撞向主角;
  5. 至少设计3个基础关卡,难度依次递增,关卡1敌人只会发射子弹,关卡2敌人也会撞主角,关卡3敌人可以多只同时撞向主角;
  6. 至少设计1个BOSS关卡,一只AI比较强的大蜜蜂(请使用多个图案拼凑它,让它看起来霸气些噢血条长点,别一下就挂了),它可以较大概率躲避主角子弹,并可以来回快速移动撞击主角(设计个漂亮招式吧,请至少设计2种:瞬移攻击?次元连斩?…),可以加个漂亮的拖尾效果哟(+o+)v,同时,它可以拥有各种华丽子弹效果(至少设计2种:火箭炮,光束弹,连环旋转弹,反弹弹…发挥你的想象吧);
  7. 拉仇恨,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;}}
}

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


http://chatgpt.dhexx.cn/article/G0Hf0Rti.shtml

相关文章

C语言课程设计报告-菜单设计

源代码&#xff1a;https://blog.csdn.net/queen00000/article/details/94468911 xxx大学 C语言课程设计报告 题 目 菜单设计 专业班级 组 别 学生姓名…

连续邮资问题

1、实验环境 Visual C 6.0 2、实验目的和要求 利用回溯法解决连续邮资问题。假设某国家发行了n种不同面值的邮票并且规定每张信封上最多只允许贴m张。对于给定的n和m的值&#xff0c;给出邮票面值的最佳设计&#xff0c;使得可在1张信封上贴出从邮资1开始&#xff0c;增量为…

寄信收信问题

问题 在一个村庄里有i个人&#xff0c;他们每个人只能寄出一封信&#xff0c;接收一封信&#xff0c;并且不能给自己寄信。那么请问一共有多少种寄信收信方式。 思路 遇到此类问题&#xff0c;应该从简单的情况考虑。比如&#xff0c;当村里只有两个人的时候&#xff0c;只有…

【图论】中国邮递员问题、平面图上最大割问题的多项式时间算法

文章目录 一、中国邮递员问题1. 与欧拉回路的关系2. Edmonds-Johnson算法3. 一个例子 二、平面图上的最大割问题1. 割2. 最大割及其 N P \bold{NP} NP完全性3. 平面图上的最大割问题4. 奇回路覆盖5. 转化为一般图最大匹配6. 一个例子 三、顶点图上最大割问题的 N P \bold{NP} N…

AMPL实现中国邮递员问题,你get到了吗

本文所有代码全部使用AMPL语言实现 中国邮递员问题和旅行商问题不太相同&#xff0c;旅行商问题是不能回头的&#xff0c;而邮递员问题要求是访问所有街道&#xff0c;也就是说每个街道必须访问到。 1、哥尼斯堡七桥问题 要解出中国邮递员问题&#xff0c;首先我们一起来了解…

关于中国邮递员问题和欧拉图应用

关于中国邮递员问题和欧拉图应用 中国邮递员问题&#xff1a; 1962年有管梅谷先生提出中国邮递员问题&#xff08;简称CPP&#xff09;。一个邮递员从邮局出发&#xff0c;要走完他所管辖的每一条街道&#xff0c;可重复走一条街道&#xff0c;然后返回邮局。任何选择一条尽可…

欧拉环游和中国邮递员问题

文章目录 前言欧拉环游Fleury算法中国邮递员问题 前言 这篇文章介绍了欧拉环游的定义判定&#xff0c;Fleury算法求欧拉图中的欧拉环游&#xff0c;最后给出了中国邮递员问题的解决步骤。 欧拉环游 所谓欧拉环游就是指在一个无向图中&#xff0c;从一个点出发&#xff0c;每…

中国邮递员问题最短路径(代码+实现)

奇点需要配合LINGO进行去除&#xff0c;有需要请联系1822285076qq.com&#xff0c;需要一定费用。 总程序&#xff1a; 奇点消除lingo代码&#xff1a;

一笔画问题(中国邮递员问题)

一笔画与中国邮递员问题 一、引述 一笔画问题&#xff1a; 节点可以重复走边不可以重复走要求把所有边都走一次 欧拉图(Euler graph)&#xff1a; 从任何节点开始&#xff0c;都可以一笔画 每一个节点都是偶数价&#xff08;价数指的是从该节点能够伸出去的边的数目&#x…

用遗传算法解决中国邮递员问题

中国邮递员问题 所谓中国邮递员问题&#xff0c;见下面无向图 &#xff0c;假设邮递员初始位置在A点&#xff0c;现在他要访问所有其他4个结点以便投递邮件&#xff0c;结点与结点之间的距离已经标注在边上。问&#xff1a;邮递员应该依次访问哪些结点才能以最短路径遍历所有结…

中国邮路问题邮递员问题欧拉路径图论C++

下载链接&#xff1a;https://download.csdn.net/download/RONNIE_Zz/13094843 通路&#xff1a;在无向图中由点边交替组成的序列就是通路&#xff08;如果这个图是简单的&#xff0c;那么也可以使用点的序列来表示&#xff09;&#xff0c;如果首尾的点相同&#xff0c;则称为…

邮局问题

原题&#xff1a;POJ 1160 题意&#xff1a; 一些村庄被建立在一条笔直的高速公路边上,我们用一条坐标轴来描述这条高速公路&#xff0c;每一个村庄的坐标都是整数&#xff0c;没有两个村庄坐标相同。两个村庄间的距离&#xff0c;定义为它们的坐标值差的绝对值。我们需要在一…

c语言邮递员问题算法,中国邮递员问题的求解实例

中国邮递员问题的求解实例 前面已经讲过&#xff0c;对于欧拉图&#xff0c;可以直接用Fleury算法找出一条欧拉巡回路线&#xff1b;对于半欧拉图&#xff0c;可以先求出奇点u和v之间的最短路径P,令G G P&#xff0c;贝U G *为欧拉图&#xff0c;然后用Fleury算法来确定一个G *…

ACM图论算法—邮递员投递问题

题目描述 著名图论问题之一。邮递员从邮局出发送信&#xff0c;要求对辖区内每条街&#xff0c;都至少通过一次&#xff0c;再回邮局。在此条件下&#xff0c;怎样选择一条最短路线&#xff1f;此问题由中国数学家管梅谷于1960年首先研究并给出算法&#xff0c;故名。 中国邮…

百子作业 —— 中国邮递员问题

题目 严老师和宋老板去勘测武威市区的道路网&#xff0c;每一条路都需要勘测&#xff0c;且需要两人合作.武威市区可以近似地看成六横六纵组成的道路网&#xff0c;自西向东依次为学府路、民勤路、西关路、中关路、富民路、滨河路&#xff1b;自北向南依次为雷海路、宣武路、祁…

邮递员算法问题之c++实现

目录 前言演示问题介绍思路代码复现尾言 前言 大家好&#xff0c;我是Ericam_。 近些时间&#xff0c;通过一个项目接触到了邮递员算法问题&#xff0c;还是挺有意思的&#xff08;虽然做起来经历了不少的困难&#xff09;。最后勉强复现了吧&#xff0c;写个文章就当记录一下。…

中国邮递员问题+代码实现(cpp)

中国邮递员问题是一个和旅行商问题比较相关但又不太相同的一个问题&#xff0c;而且个人感觉理解的难度更大一点&#xff0c;当然&#xff0c;这就是仁者见仁&#xff0c;智者见智了&#xff0c;旅行商问题是不能回头的&#xff0c;一个节点访问过了不能回来了&#xff0c;并不…

离散数学实验----中国邮递员问题

实验目的和要求 实验目的&#xff1a; 理解什么是欧拉图&#xff0c;熟悉欧拉路和欧拉回路的概念。掌握Dijkstra算法&#xff0c;求解最短路径掌握Fleury算法&#xff0c;求解欧拉回路。了解Edmonds-Johnson算法解决中国邮递员问题的基本思路。通过程序实现中国邮递员问题&…

数据结构——中国邮递员问题

问题描述 代码 #include <stdio.h> #include <stdlib.h> #include <string.h>#define min(a,b) ( (a) < (b) ? (a) : (b) ) #define MAX_NODE 100 #define MAX_EDGE 100 #define INF 0x7fffffff // 表示两点不连通typedef struct {int number; …

[算法导论] 邮递员问题

邮递员问题 旅行商问题&#xff1a;给定一系列城市和每对城市之间的距离&#xff0c;求解访问每一座城市一次并回到起始城市的最短回路。&#xff08;遍历点&#xff0c;回到起点&#xff09; 哈密顿路径 哈密顿图 中国邮递员问题&#xff1a;邮差要设法找到一条最短路径&…