数组 排序 死亡数字&猜数字小游戏

目的

学习排序方式, 编写代码实现两个小游戏,熟练数组的应用,了解随机数的产生

数字游戏

终端输入游戏参与的人数: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;
}

感悟

今天已经是学习编程第五天了,仍然很吃力,对于实现某一个功能的代码的编写只要时稍难一点的就毫无头绪,学到这个时候就让人很沮丧,这就让人很难积极的学习,效率就更低了,在理解了编写思路后自己动手写仍然是问题丛生,一点点的写代码,然后运行去判断有没有达到预期效果,有问题的解决问题。可以尝试这这样去做:接到一个项目,分析项目:(模拟项目运行,进而得出用什么方法实现,值得注意的是:多个循环嵌套时,最好模拟一下在控制变量的变化下程序是怎样进行的,然后把对应的代码写出来),在完成了一个具体的模块后一定要运行以便改正,然后在进入下一模块的编写。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。