目的
学习排序方式, 编写代码实现两个小游戏,熟练数组的应用,了解随机数的产生
数字游戏
终端输入游戏参与的人数:7 输入死亡编号:3
凡是报道3的人都“死亡” 后面的人继续数数
直至输出最后一个活着的人的编号
猜数字
随机产生4个不相同的数字 从小到大排序
1 2 3 4
玩家开始输入: 1 4 5 6
如果位置正确且数字正确用A输出
如果数字正确位置不正确用B输出B
玩家根据输出推测出这4个数
技术
数组:(详情请查看上一篇内容)数组
随机数的产生:
//放种子
srand((unsigned int)time(NULL));
//产生随机数 num%10 ->0~9
return rand(0=)%(max+1);
排序方式:具体理解可访问址https://so.youku.com/search_video/q_%E8%88%9E%E5%8A%A8%E7%9A%84%E6%8E%92%E5%BA%8F?spm=a2ha1.12675304.0.i1查看优酷视频
int main(int argc, const char * argv[]) {
int num[] = {3,0,1,8,7,2,5,4,6,9};
1.冒泡
//冒泡排序 通过一次排序 最大的沉底
/*
for (int i = 0; i < 10; i++){//比较的次数
for (int j = 0; j < 10-i-1; j++){
if (num[j] > num[j+1]) {
//交换j和j+1的值
int temp = num[j+1];
num[j+1] = num[j];
num[j] = temp;
}
}
}
*/
2.选择
//选择排序 一次取出一个值 默认他是最小的
//如果发现比这个数小 就交换
//遍历整个数组 找到一个最小的
//3,0,1,2,5,4,6
/*
for (int i = 0; i < 10-1; i++){
//默认这是最小的
//int min = num[i];//3
for (int j = i+1; j < 10; j++){
//控制用min和后面的每一个进行比较
if (num[i] > num[j]){
//j对应的数字比min还小 交换
int temp = num[i];
num[i] = num[j];
num[j] = temp;
}
}
//一次遍历之后找到最小的值min
//num[i] = min;
}
*/
3.插入(推荐使用第二个)
//插入排序1
for (int i = 0; i < 10; i++) {
//让i和i+1比较大小
if (num[i] > num[i+1]) {
//交换值
int temp = num[i];
num[i] = num[i+1];
num[i+1] = temp;
//让num[i]和前面的所有进行比较
for (int j = i; j > 0; j--){
if (num[j] < num[j-1]) {
temp = num[j];
num[j] = num[j-1];
num[j-1] = temp;
}
}
}
}
for (int i = 0; i < 10; i++) {
printf("%d ", num[i]);
}
printf("\n");
return 0;
}
//插入排序2
int tent;
for(int i=0;i<10;i++){
for(int j=0;j<i;j++){
if(num[i]<num[j])
{tent=num[i];
num[i]=num[j];
num[j]=tent;
}
}
}
实际应用(两个小游戏)
#define KILLED -1
int main(int argc, const char * argv[]) {
int total = 0;
int number[10] = {};
int killNumber = 0;
int count = 0;
int totalKilledNumber = 0;
printf("请输入参与人数:");
scanf("%d", &total);
//给数组赋值 编号
for (int i = 0; i < total; i++) {
number[i] = i+1;
}
printf("请输入死亡号码:");
scanf("%d", &killNumber);
//开始游戏了
for (int i = 0; i < total; i++) {
//判断指向的这个人有没有被杀掉
if (number[i] != KILLED){
//报数
count = count + 1;
}
//判断当前编号是不是到了死亡号码
if (count == killNumber){
//杀掉这个人
number[i] = KILLED;
//还原编号
count = 0;
//死亡人数+1
totalKilledNumber ++;
//是不是该结束了
if (totalKilledNumber == total-1){
break;
}
}
//判断这一次循环是不是到末尾了
if (i == total-1){
//让i回到起始点
i = -1; //防止++ 导致回到第二个
}
}
printf("\n");
//测试一次之后的结果
for (int i = 0; i < total; i++){
printf("%d ", number[i]);
}
return 0;
}
感悟
今天已经是学习编程第五天了,仍然很吃力,对于实现某一个功能的代码的编写只要时稍难一点的就毫无头绪,学到这个时候就让人很沮丧,这就让人很难积极的学习,效率就更低了,在理解了编写思路后自己动手写仍然是问题丛生,一点点的写代码,然后运行去判断有没有达到预期效果,有问题的解决问题。可以尝试这这样去做:接到一个项目,分析项目:(模拟项目运行,进而得出用什么方法实现,值得注意的是:多个循环嵌套时,最好模拟一下在控制变量的变化下程序是怎样进行的,然后把对应的代码写出来),在完成了一个具体的模块后一定要运行以便改正,然后在进入下一模块的编写。