C# 第一次实验:装箱拆箱练习、百钱百鸡、扑克牌游戏

1、 装箱、拆箱练习。

using System;                        // 主命名空间,包含所有.net基础类型和通用类型。如Object,比如string等
using System.Collections.Generic;    /* using System.Collections是集合命名空间,包含定义各种对象集合的接口和类。加了Generic说明是泛型集合。*/
using System.Linq;                   // 引入的linq语法需要提供的支持类
using System.Security.Cryptography;  // 安全方面的类,主要是加密方面的类。
using System.Text;                   // 包含常用字符串操作的类(我猜想和字符串型变量的定义或者输出操作有关)
namespace homework1                  // 导入命名空间,类似于C语言中的#include <stdio.h>
{
    class Program                    // 类:Program类
    {
        static void Main(string[] args){    /* static:声明main是静态的;void:不会返回内容;String[] args:命令行参数,声明args是可以存储字符串数组。*/


            double d1 = 3.14;               // 定义双精度浮点数d1(值类型),赋值3.14
            double d2 = d1;                 // 定义双精度浮点数d2(值类型),将d1的值赋给d2
            Console.WriteLine("d1与d2内存地址是否相同:"+((object) d1==(object) d2));         /* 输出,对于值类型来说,值相同,地址也不相同*/
            object o1 = d1;                 // 装箱操作
            object o2 = o1;
            Console.WriteLine("o1和o2是否指向同一个内存地址:"+((object)o1==(object) o2));    /* 输出o1和o2是否指向同一个内存地址的判断。值相同,引用变量的地址也相同。*/
            double y1 = (double)o1;         // 拆箱操作
            double y2 = (double)o2;
            Console.WriteLine("y1和y2是否指向同一个内存地址:" + ((object)y1 == (object)y2));/*对于值类型来说,值相同,地址也不相同*/
            d1 =3.1416;                         
            Console.WriteLine((double)o1);  /* 装箱之后,改变值类型的数值,引用类型的值不改变,o1不指向d1的地址*/
            string s1 = "Visual C#";        // 将Visual C#赋给字符串变量s1(字符串是引用类型)。
            string s2 = s1;                 // 将s1的值赋给s2
            Console.WriteLine("s1和s2是否指向同一个内存地址:"+((object)s1==(object) s2));    // 输出.
            s1 ="C#";                       // 创建了一个新的s1实例,在内存中存放的地址不同
            Console.WriteLine("改变s1后,s1和s2是否指向同一个内存地址:"+((object) s1==(object) s2));
            s2="C#";                        // 对于引用类型来说,内容相同地址就相同
            Console.WriteLine("改变s2使s1和s2的值相同后,它们的地址是否一样呢"+((object) s1==(object) s2));     /* 输出.    */
            Console.WriteLine("s1与s2是否相等呢:"+(s1==s2));                                  // 输出

        }
    }
}

运行结果:
在这里插入图片描述

2、 百鸡百钱问题(two methods)
(1)第一种做法:

using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.CompilerServices;
    using System.Security.Cryptography;
    using System.Text;
namespace ahundredchickenandmoney
{
    class Program{
        static void Main(string[] args){
           int hen, cock, chick;
           for (cock = 0; cock <= 13; cock++){
                for(hen = 0; hen <= 22 ; hen++){
                chick = (100 - 5 * cock - 3 * hen) * 3;
                if ((cock > 0) &&(cock + chick + hen == 100))
                    Console.WriteLine("公鸡:{0},母鸡:{1},小鸡:{2}\n", cock, hen, chick);
                 }

            }
        }
    }
}

运行结果:
在这里插入图片描述

(2)第二种做法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Security.Cryptography;
using System.Text;
namespace ahundredchickenandmoney{

    class Program {                      //Program类
    
        static void Main(string[] args){
            int hen, cock, chick,b,c;
            /* cock<15的原因:设极端情况下,只有cock和chick,
             * 则可列出二元一次方程:5cock+(1/3)chick=100;chick+cock=100.可解出cock∈(14,15).*/
            for (cock=1;cock<15;cock++){
                /* 原因:根据三种鸡数量与铜钱的关系,可列出二元一次方程: 5cock+3hen+(1/3)chick=100;cock+hen+chick=100;
                 * 则可以利用cock的数量表示另外两种鸡的数量: hen = (100 - 7 * cock) / 4;chick = (300 + 3 * cock) / 4;
                 * 又hen、chick的数量应为整数,是故分母对分子求余需得0,这是一个重要条件(见下文if判断语句)*/
                b = (100 - 7 * cock) % 4;

                c = (300 + 3 * cock) % 4;
                if(b==0&&c==0){
                    hen = (100 - 7 * cock) / 4;
                    chick = (300 + 3 * cock) / 4;
                Console.WriteLine("公鸡:{0},母鸡:{1},小鸡:{2}\n", cock, hen, chick);
                    
                }
            }
            // 两个功能:1,等待键盘输入 2,终止一个程序的执行 。此处应该是第二个功能
            Console.Read();

        }
    }
}

运行结果:
在这里插入图片描述

3、 扑克牌游戏(two methods)
第一种方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Security.Cryptography;
using System.Text;
namespace pokerquestion{
    class TestCard 										//值类型TestCard
{
        static void Main(string[] args) {

            int i, j, temp;
            Random Rnd = new Random();
            int k;
            int[] Card = new int[52];                           // 一维数组。52张牌
            int[,] Player = new int[4, 13];                     // 二维数组,四个玩家每人13张牌
            for (i = 0; i < 4; i++)                        		// 52张牌初始化
                for (j = 0; j < 13; j++)
                    Card[i * 13 + j] = (i + 1) * 100 + j + 1;
            Console.Write("How many times for card: ");          // 写进
            string s = Console.ReadLine();
            int times = Convert.ToInt32(s);
            for (j = 1; j <= times; j++)
                for (i = 0; i < 52; i++){
                    k = Rnd.Next(51 - i + 1) + i;           		// 产生i到52之间的随机数
                    temp = Card[i];
                    Card[i] = Card[k];
                    Card[k] = temp;
                }
            k = 0;
            for (j = 0; j < 13; j++)                       			// 52张牌分发给4个玩家
                for (i = 0; i < 4; i++)
                    Player[i, j] = Card[k++];
            for (i = 0; i < 4; i++)
{
                Console.WriteLine("玩家{0}的牌:", i + 1);
                for (j = 0; j < 13; j++){
                    k = (int)Player[i, j] / 100; // 分离出牌的花色,k由于是整型,所以只有四种可能:1/2/3/4.
                    switch (k) {
                        case 1:                         		// 返回红桃
                            s = Convert.ToString('\x0003');
                            break;
                        case 2:                         		// 返回方块
                            s = Convert.ToString('\x0004');
                            break;
                        case 3:                         		// 返回梅花
                            s = Convert.ToString('\x0005');
                            break;
                        case 4:                         		// 返回黑桃
                            s = Convert.ToString('\x0006');
                            break;
                    }
                    k = Player[i, j] % 100;       // 分离出牌号。牌号有13种可能,正好对应每人的13张牌。

                    switch (k) {
                        case 1:                                 // 扑克牌中没有1、11、12、13,用字母代替。
                            s = s + "A";
                            break;
                        case 11:
                            s = s + "J";
                            break;
                        case 12:
                            s = s + "Q";
                            break;
                        case 13:
                            s = s + "K";
                            break;
                        default:
                            s = s + Convert.ToString(k);        // 如果不是以上几种字母,就输出数字,并返回到 Convert.ToString(k)
                            break;
                    }
                    Console.Write(s);                           // 写出数字
                    if (j < 12)                     // 每写13个牌,换一次行。重新从“玩家某的牌”开始写
                        Console.Write(", ");                   
                    else
                        Console.WriteLine(" ");
                }
            }
            Console.Read();             //结束程序
        }
    }
}

运行结果:
在这里插入图片描述

第二种方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Security.Cryptography;
using System.Text;
namespace pokerquestion
{
    class TestCard
    {
        static void Main(string[] args)
        {

            int i, j, temp;
            Random Rnd = new Random();
            int k;
            int[] Card = new int[52];                           // 一维数组。52张牌
            int[,] Player = new int[4, 13];                     // 二维数组,四个玩家每人13张牌
            for (i = 0; i < 4; i++)                        		// 52张牌初始化
                for (j = 0; j < 13; j++)
                    Card[i * 13 + j] = (i + 1) * 100 + j + 1;
            Console.Write("How many times for card: ");         // 写进
            string s = Console.ReadLine();
            int times = Convert.ToInt32(s);
            for (j = 1; j <= times; j++)
                for (i = 0; i < 52; i++){
                    k = Rnd.Next(51 - i + 1) + i;           		// 产生i到52之间的随机数
                    temp = Card[i];
                    Card[i] = Card[k];
                    Card[k] = temp;
                }
            k = 0;
            for (j = 0; j < 13; j++)                       			// 52张牌分发给4个玩家
                for (i = 0; i < 4; i++){
                    Player[i, j] = Card[k++];
                    /*此处,将位于101~113之间的数字变为1~13,201~213之间的数字变为14~26,以此类推,直到52*/
                    if (Player[i, j] <= 113) Player[i, j] -= 100;
                    else if (Player[i, j] <= 213) Player[i, j] -= 187;
                    else if (Player[i, j] <= 313) Player[i, j] -= 274;
                    else if (Player[i, j] <= 413) Player[i, j] -= 361;
                }

            for (i = 0; i < 4; i++){
                Console.WriteLine("玩家{0}的牌:", i + 1);
                for (j = 0; j < 13; j++){
                    k = (int)Player[i, j] / 13; // 分离出牌的花色,k由于是整型,所以只有四种可能:1/2/3/4.
                    switch (k){
                        case 1:                         		// 返回红桃
                            s = Convert.ToString('\x0003');
                            break;
                        case 2:                         		// 返回方块
                            s = Convert.ToString('\x0004');
                            break;
                        case 3:                         		// 返回梅花
                            s = Convert.ToString('\x0005');
                            break;
                        case 4:                         		// 返回黑桃
                            s = Convert.ToString('\x0006');
                            break;
                    }
                    k = Player[i, j] % 13;       // 分离出牌号。牌号有13种可能,正好对应每人的13张牌。

                    switch (k) {
                        case 1:                                 // 扑克牌中没有1、11、12、13,用字母代替。
                            s = s + "A";
                            break;
                        case 11:
                            s = s + "J";
                            break;
                        case 12:
                            s = s + "Q";
                            break;
                        case 13:
                            s = s + "K";
                            break;
                        default:
                            s = s + Convert.ToString(k); ;       // 如果不是以上几种字母,就输出数字,并返回到 Convert.ToString(k)
                            break;
                    }
                    Console.Write(s);                           // 写出数字
                    if (j < 12)                     // 每写13个牌,换一次行。重新从“玩家某的牌”开始写
                        Console.Write(", ");
                    else
                        Console.WriteLine(" ");
                }
            }
            Console.Read();             //结束程序
        }
    }
}

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值