C#上机题的OO

前段时间看到某人《关于某道C#上机题的OO》 ,后来又有人用了装饰模式做这题,我这里来个策略模式,不习惯废话直接上代码,不知道算不算策略模式,请高人指点。

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 namespace ConsoleApp
5 {
6     public class Program
7     {
8         static void Main(string[] args)
9         {
10             Game game = new Game(17);
11             //设定策略
12             game.Strategy = new StrategyA();
13             game.GameOver += new EventHandler(game_GameOver);
14             game.Start();
15             Console.Read();
16         }
17         static void game_GameOver(object sender, EventArgs e)
18         {
19             Console.WriteLine("Last Person:" + sender);
20         }
21     }
22     /// <summary>
23     /// 策略接口
24     /// </summary>
25     public interface IStrategy
26     {
27         /// <summary>
28         /// 运行策略
29         /// </summary>
30         /// <param name="g"></param>
31         void Work(Game g);
32     }
33     /// <summary>
34     /// 策略A
35     /// 从第一个人开始报数,报到3的倍数退出,一直到剩下最后一个人,用面向对象的思想去做这道题。
36     /// </summary>
37     public class StrategyA : IStrategy
38     {
39         private List<Person> over = new List<Person>();
40         private int k = 0;
41         public void Work(Game game)
42         {
43             foreach (Person p in game.Players)
44             {
45                 p.Say(++k);
46                 if (k % 3 == 0)
47                     over.Add(p);
48             }
49             game.Players.RemoveAll(o => over.Contains(o));
50         }
51     }
52     public delegate void EventHandler(object sender , EventArgs e);
53     /// <summary>
54     /// 游戏
55     /// </summary>
56     public class Game
57     {
58         public Game(int num)
59         {
60             Players = new List<Person>();
61             for (int i = 0; i < num; i++) {
62                 Players.Add(new Person(i + 1));
63             }
64         }
65         /// <summary>
66         /// 游戏策略
67         /// </summary>
68         public IStrategy Strategy { get; set; }
69         /// <summary>
70         /// 游戏玩家
71         /// </summary>
72         public List<Person> Players { get; set; }
73         /// <summary>
74         /// 游戏结束事件
75         /// </summary>
76         public event EventHandler GameOver;
77         /// <summary>
78         /// 开始游戏
79         /// </summary>
80         public void Start()
81         {
82             if (Strategy != null)
83             {
84                 while (Players.Count > 1)
85                 {
86                     Strategy.Work(this);
87                 }
88                 GameOver(this.Players.First().Id, new EventArgs());
89             }
90         }
91     }
92     /// <summary>
93     /// 玩家
94     /// </summary>
95     public class Person
96     {
97         public Person(int id)
98         {
99             this.Id = id;
100         }
101         /// <summary>
102         /// 玩家ID
103         /// </summary>
104         public int Id { get; set; }
105         /// <summary>
106         /// 玩家报数
107         /// </summary>
108         /// <param name="num"></param>
109         public void Say(int num)
110         {
111             Console.WriteLine(string.Format("{0}:{1}", Id, num));
112         }
113     }
114 }
115 

StrategyA 实现接口 IStrategy 遵循开闭原则,如果我们要换一个规则只要添加一个类实现IStrategy即可。

之前还有用 循环链表 来完成这道题,晚上再发上来。

时间: 2024-07-31 04:20:32

C#上机题的OO的相关文章

关于某道C#上机题的OO

前两天在园子里,有人出了一道<关于一道C#上机题的一点想法>,大概的意思呢是利用OO的思想来进行编程,接着又有一位朋友,也写了自己的答案,此朋友非常厉害,从类图,接口,封装,多态,都一一实现,实在让我佩服,不过真有点过度设计的味道,接着又有一大虾,完成了自己的OO答案,把泛型,可变,不可变都一一列举,实在令人佩服啊,可我觉得,或许是我理解错了,但我觉得三位,你们都偏离了题目,偏离了OO,你们只是利用了OO的特性. 题目 17个人围成一圈,从第一个人开始报数,报到3的退出,一直到剩下最后一个人,

C#上机题

本文继续<C#上机题的OO - 策略模式>中的题目,但这是使用的是双向循环链表.当第一次看到这题我首先想到的是循环链表,但题目要求面向对象的方法,汗~ 首先是双向链表的节点类 1 /// <summary> 2 /// 双向链表节点 3 /// </summary> 4 /// <typeparam name="T"></typeparam> 5 public class DoubleLinkNode<T> 6 {

刷华为上机题库时遇到的一道编程题

问题描述 刷华为上机题库时遇到的一道编程题 题目的要求是输入一个字符串,对字符串做如下变化1:按照A-Z的顺序条换顺序,不管字母的大小写.如Type变换为epTy2:同一个英文字母的大小写同时存在时,按照输入顺序排列.如输入:BabA?输出:aABb3:非英文字母的其它字符保持原来的位置.输入:By?e?输出:Be?y #include ""iostream""#include ""string""using namespac

自适应滤波-谁会这道离散随机信号处理的上机题啊?

问题描述 谁会这道离散随机信号处理的上机题啊? 就是要用MATLAB编程,希望附上完整程序,不是那种调不出来的-毕竟不是程序猿,也不太用MATLAB,只能献上我的膝盖了,大神! 解决方案 题目如图,希望是完整的代码,也可以发邮箱992239684@qq.com,不胜感激!

c c++ acm-浙江大学PAT上机题,求解析. 表达式转换

问题描述 浙江大学PAT上机题,求解析. 表达式转换 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间.请设计程序将中缀表达式转换为后缀表达式. 输入格式说明: 输入在一行中给出不含空格的中缀表达式,可包含+.-.*.以及左右括号(),表达式不超过20个字符. 输出格式说明: 在一行中输出转换后的后缀表达式,要求不同对象(运算数.运算符号)之间以空格分隔,但结尾不得有多余空格. 样例输入与输出: 序号 输入 输出 1 2+

有道难题第一题非OO解,极端记录160ms

测试平台: P8600 4G 目前看见最高效率的是夜咖啡的,我这里的数据是稳定在195-200ms上下. 然后是eaglet,基本是400ms 我这个代码稳定在170ms左右 我的这个代码主要思路 1.在原有数组外围增加一圈0,这样就降低了统计时候的复杂度 2.将一维字符串数组转换为一个字符串,其实这也是增加0的副产品,如果有朋友能维持一维字符串 数组并增加0请告知一下 3.在最后的一维数组中直接用坐标计算方式算出当前位置的相关8个下标并直接计算 4.累加后统一减384,而不是每次减'0'字符

算法设计与分析 上机题Mergesort

#include <iostream> using namespace std; #define N 100 int g_array[N];     //存放输入的数字 static int count;   //存放元素的个数 // 初始化函数 void Initial() {     cout << "请输入元素的个数:";     cin >> count;     cout << "请输入" <<

[Unity3D]面试题集锦

最先执行的方法是: 1.(激活时的初始化代码)Awake,2.Start.3.Update[FixUpdate.LateUpdate].4.(渲染模块)OnGUI.5.再向后,就是卸载模块(TearDown),这里主要有两个方法OnDisable与OnDestroy   高频问答的问题: 1.什么是渲染管道? 是指在显示器上为了显示出图像而经过的一系列必要操作. 渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去. 主要步骤有: 本地坐标->视图坐标->背面裁剪->

Huffman编码 构造函数问题

问题描述 Huffman编码 构造函数问题 大二数据结构上机题,做的事Huffman树编码,压缩和解压的问题 代码如下: #pragma once #include "HuffmanNode.h" #include "MinHeap.h" using namespace std; template < typename T, typename E > class HuffmanTree { private: HuffmanNode* root; publ