美文网首页
#数组(杀人游戏、数字游戏)、排序方法(冒泡排序、选择排序、插入

#数组(杀人游戏、数字游戏)、排序方法(冒泡排序、选择排序、插入

作者: 宁晓鸯 | 来源:发表于2019-08-03 00:10 被阅读0次

心得体会

今天编写了很有意思的demo^^,用自己编的demo玩游戏是一件很享受的事情,如果有一天,我真的能完全靠自己编出属于我自己的demo,那就好了,感觉自己对编程越来越感兴趣。虽然编程有时候真的是枯燥的无味的,有时候几个小时甚至一整天待在电脑前,看着那一长串的代码,会让人很疲惫,但若是自己能够编出很有意思的东西,也是很有成就感的。今天主要学了数组,我不是很擅长数组,但其实我更怕接下来的指针,因为比起指针,可能我数组已经算好了...

技术

  • 约瑟夫环游戏(用数组编写)
  • 数字游戏
  • 冒泡排序
  • 选择排序
  • 插入排序

操作以及操作详解

  • 约瑟夫死亡游戏(用数组编写)

终端输入参与的人数
依次从1开始编号
大家围成一圈
输入死亡编号
凡是报道3的人都死亡 后面的继续数数
输出最后一个活着的人编号

1.算法一:

#include "stdafx.h"
#include"iostream"
#include <stdio.h> 
#define KILED -1  //宏定义KILED为-1,死的人的编号改为为-1
int _tmain(int argc, _TCHAR* argv[])
{  int m=0,n=0;//m为参与人数 ,n为死亡编号
   int i=0;
   int num[10]={};
   int count=0;//计数器
   int killedNumber=0;//死亡人数
   printf("请输入参与人数:");
   scanf_s("%d",&m);
      //给数组编号
   for(i=0;i<m;i++){
       num[i]=i+1;
   }
   printf("请输入死亡编号:");
   scanf_s("%d",&n);
      //开始游戏
   for(i=0;i<m;i++){
   if(num[i]!=KILED){
       count++;
   }
   //判断当前编号是不是 **死亡编号**
   if(count==n){
       num[i]=-1;  
       count=0;
       killedNumber++;
       if(killedNumber==m-1){
           break;
       }
   }

   if(i==m-1){//让i回到起始点
       i=-1;
     }
   }
   printf("\n");
   for(i=0;i<m;i++){
       printf(" %d ",num[i]);
   }
   system("pause");    
   return 0;
}
20190802_232913.gif

2、算法二

#include <iostream>
#include <stdio.h> 
#define N  1000000
int flag[N]={0};
int main(int argc, char *argv[])
{   int m=0,n=0;//a为最开始参与游戏的人数,n为死亡编号 
    printf("请输入参与人数:");
    scanf("%d",&m);
    printf("请输入死亡编号:");
    scanf("%d",&n);
    int num=0;//计数器
    int count=0;//死亡人数 
    int i=0;
    for( i=1;i<=m;i++) { 
        flag[i]=1; 
    }
    while (count<m-1){
        for(i=1;i<=m;i++){
            if(1==flag[i]){
                num++;
                if(num==n){
                    printf("第%d个死亡的编号为%d\n",(count+1),i);
                    count++;
                    flag[i]=0;
                    num=0;
                }
                if(count==m-1){
                    break;
                }
            }
        }
    }

    for(i=1;i<=m;i++){
         if(1==flag[i]){
              printf("\nthe last alive  is  %d\n",i);
     }
 }
    system("pause");
    return 0;
}

算法二中使用了变量flag
flag=1;正在执行
flag=0;没有执行

20190802_231543.gif
  • 数字游戏

猜数字
随机从0-9中产生4个不相同的数字,从小到大排序
1 2 3 4
玩家开始输入
1 4 5 6
如果位置正确且数字正确用A输出
如果数字正确且数字不正确用B输出
1A1B

#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <stdbool.h>
int main(int argc, char *argv[])
{
  int originArray[4]={};//  保存原始数据
  int guessArray[4]={};
  int countA=0;
  int countB=0;
   
  //随机产生0-9中4个不重复的数字 
  srand((unsigned int )time(NULL));//产生随机种子
  for(int i=0;i<4;i++){ 
    bool isExist=false;
    int temp=0;//temp为随机产生的数 
    while(1){ 
     temp=rand()%10; //输入一个随机数 
     for(int j=0;j<i;j++){  
      if(originArray[j]==temp){             
         isExist=true;      
         break;
       }                    
     } 
     if(isExist==false){ 
     break;     
       }                            
    }
    
    //将随机产生的数字从大到小排序,用插入排序法
  int j=0;
  for(;j<i;j++){//j对应的数字和产生的数字进行比较                  
      if(temp<originArray[j]){ //如果j对应的数字大于i对应的数字 ,j的内容往后移动,腾出空间 
        for(int k=i;k>j;k--){           
          originArray[k]=originArray[k-1]; 
       }
       break;                               
    }
  }
    originArray[j]=temp;    
}
//输出
     for(int i=0;i<4;i++){ 
      printf(" %d ",originArray[i]) ;
       }        
    
//开始游戏
        while(1){
        printf("请输入猜测的数字:");
        for(int i=0;i<4;i++){
         scanf("%d",&guessArray[i]) ;                       
        }
    
     
     
     //判断用户的输入 
     for(int i=0;i<4;i++)//控制原始数字,用原始数字依次和输入的四个数字进行比较 
        { for( int j=0;j<4;j++)//控制输入 
           {if(guessArray[j]==originArray[i]){
               if(i==j) {                       
                countA++; //数字相同,位置相同                                       
               }else{
                countB++;//数字相同,位置不同                        
               }
            }
         }
      
    } 
    if(countA==4){//全对 
        printf("Congratulation!!!");
        break;
    }else{
      printf("%dA%dB \n",countA,countB) ;
      //还原数据 
      countA=0;     
      countB=0;
    }
}
    
    system("pause");
    return 0;
}

运行效果


20190802_230243.gif

通过一次排序 最大的沉底

#include "stdafx.h"
#include "iostream"

//1.冒泡排序:通过一次排序,最大的沉底
int _tmain(int argc, _TCHAR* argv[])
{   int a[]={2,4,8,1,6,9,3,5,7,0};
    for(int i=0;i<10;i++){
        for(int j=0;j<9-i;j++){
            if(a[j+1]<a[j]){
                int temp=a[j+1];
                a[j+1]=a[j];
                a[j]=temp;

            }
        }
    }

    for(int j=0;j<10;j++){
        printf("%d ",a[j]);
    }   
    
    system("pause");
    return 0;
}

一次取出一个值,默认他是最小的
如果发现比这个数小,就交换
遍历整个数组 ,找到一个最小的

#include "stdafx.h"
#include "iostream"


int _tmain(int argc, _TCHAR* argv[])
{     int num[10]={3,1,0,8,7,2,5,4,6,9};
    for (int i = 0; i < 9; 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;
    }
    for(int j=0;j<10;j++){
        printf("%d ",num[j]);
    }   

    system("pause");
    return 0;
}

每次从未排好的序列中选出第一个元素插入到已排好的序列中
1.从未排好的序列中拿出首元素,并把它赋值给temp变量;
2.从排好的序列中,依次与temp进行比较,如果元素比temp大,则将元
素后移(实际上放置temp的元素位置已经空出)
3.直到找到一个元素比temp小, 将temp放入该位置;

#include "stdafx.h"
#include "iostream"
int _tmain(int argc, _TCHAR* argv[])
{     int num[10]={3,1,0,8,7,2,5,4,6,9};
    //插入排序
    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");
    system("pause");
    return 0;
}

运行效果


QQ截图20190802234021.png
  • ps

数组优点:访问方便
数组缺点:插入和删除效率不高
^^所以使用数组时应尽量避免插入和删除

相关文章

网友评论

      本文标题:#数组(杀人游戏、数字游戏)、排序方法(冒泡排序、选择排序、插入

      本文链接:https://www.haomeiwen.com/subject/pigrdctx.html