课程设计记录(一)

1 我们做了什么?

1.1 明确了课程设计目标

即采用结对编程的形式完成一个游戏项目——黄金点游戏N个同学(N通常大于10),每人写一个0\sim100之间的有理数 (不包括0100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。

黄金分割点

基础要求:

  • 采用单机方式实现,需要为用户提供便利的输入界面。
  • 该游戏每次至少可以运行10轮以上,并能够保留各轮比赛结果。

后续,软件功能可以不断地扩展迭代,例如:

  • 在课堂上玩,用Excel 纪录成绩
  • 做成简单的 client/server,用户从手机上输入数字。研讨 client/server 的API 应该怎么设计,如何认证用户?如何开发client App?如何在服务器/客户端做时钟同步?如果获得第一名的多个用户的数字相同,如何排定次序?(可以考虑提交时间,历史成绩)
  • 如何设计测试用例, 保证server 的正确性, 效率, 压力测试 (如何模拟上千个客户端,从不同的端口,提交不同的数字?)
  • 让client 从人输入数字,进化到client程序 利用 AI 算法提交数据。原来是每个人通过client App,手动提交一个数字, 然后看谁赢, 再继续玩下一轮。client 程序能访问所有以前的历史记录, 它再推测下一个数字是多少, 然后提交。 相当于自动下棋外挂。
  • 如果数字很小 0.00000000000000000001, 下溢了, 怎么办?应该提交的是 double, float, 还是 string 类型?
  • 全班同学每人写一个程序, 玩一万轮, 服务器要能快速处理。如何在服务器和客户端都做到高效, 能多少秒钟就比完一轮, 并把数据传给所有客户端? 客户端是通过什么接口来接受比赛数据,或者从某个公共来源去读取数据?
  • 修改规则, 每个用户每次可以提交两个数字, 其他规则一样,再玩一万轮。这个时候,有程序会不会提交一个大的数字,来保证自己的另一个数字比较接近 golden number?
  • 让互联网的用户可以通过网站注册, 然后用某种 domain specified language 写这个AI 的规则, 然后他们也可以通过网站玩这个游戏。设计这种 DSL,并解释执行。例如, DSL 可以支持:① 我每一轮都提交上一轮所有数字的平均值 * 0.618 * 0.618;② 如果我上一轮的提交的数值小于当轮的 golden number,那我的下一个数字要是上个数字的两倍。
  • 扩展到全球,服务器能 24/7 不断主持游戏,并记录成绩。

1.2 在GitHub上创建了repo

该项目Github链接:https://github.com/SleepSupreme/Golden-Point-Game
后续项目的版本控制将通过github进行管理,项目有关代码统一提交到该repo下。该repo拥有者以外的成员通过pull request的方式提交代码。

1.3 完成了项目的第一次迭代

本次迭代实现了黄金点游戏的最基础的功能,如1.1节所述。整局游戏在命令行进行输入、输出。

import re
import numpy as np


def isSatisfiedNum(x) -> bool:
    value = re.compile(r'[0-9]+(\.)?[0-9]*')
    isnumber = value.match(x)
    
    if isnumber:
        x = float(x)
        return 0 <= x <= 100
    else:
        return False


if __name__ == '__main__':

    G, GOLDEN = 0, 0.618
    print("请输入参与游戏的人数:", end='')
    N = int(input())
    print("请输入游戏的轮数:", end='')
    M = int(input())
    grades = np.zeros((M, N))
    for x in range(M):

        print("--------------------------------------------------")
        print("第%3d轮:" % (x+1))
        print("请玩家依次输入一个0~100的有理数")

        i, inputs = 1, []
        while (i <= N):
            print("玩家%3d:" % i, end='')
            number = input()

            if not isSatisfiedNum(number):
                print("请重新输入0~100的有理数!")
            else:
                number = float(number)
                i += 1
                inputs.append(number)

        G = sum(inputs) / N * GOLDEN
        bias = np.abs(np.array(inputs) - G)

        grades[x][bias == np.max(bias)] = -2
        grades[x][bias == np.min(bias)] = N

        print("本轮各位玩家的得分如下:")
        for i in range(N):
            print("玩家%3d:" % (i+1), end='')
            print("【%3d】分" % grades[x][i])


    all_grades = np.sum(grades, axis=0)
    print("--------------------------------------------------")
    print("各位玩家的最终得分如下:")
    for i in range(N):
        print("玩家%3d:" % (i+1), end='')
        print("【%3d】分" % all_grades[i])

其中,最重要的函数是判断输入数字是否为0\sim 100的有理数,我们使用正则表达式[0-9]+(\.)?[0-9]*完美的完成了这一判断。

2 我们将要做什么?

  • 每周固定开展两次讨论,分享各自的进展与新的想法
  • 明确该软件项目使用的语言以及整体框架;进一步的,确定除了基础功能外,将要实现哪些扩展功能。
  • 开始进行黄金眼游戏 Version2.0的开发,该版本在实现该游戏最基础的功能基础上,加入图形用户界面,但并不做过多扩展。

3 软件工程小知识

结对编程

在软件的开发中,代码复审能发现很多问题,那么,如果我们每时每刻都处在代码复审的状态,那不是更好吗?事实上,极限编程(Extreme Programming - XP)正是这一思想的体现——为什么不把一些卓有成效的开发方法用到极致(Extreme)? 结对编程就是一个例子。
在结对编程模式下,一对程序员肩并肩地、平等地、互补地进行开发工作。两个程序员并排坐在一台电脑前,面对同一个显示器,使用同一个键盘,同一个鼠标一起工作。他们一起分析,一起设计,一起写测试用例,一起编码,一起单元测试,一起集成测试,一起写文档等。
结对编程让两个人所写的代码不断地处于“复审”的过程,复审是不断地审核,提高设计和编码质量的过程,结对编程让复审随时随地发生,这样才能及时地发现问题和解决问题,避免把问题拖到后面的阶段。
在结对编程中,任何一段代码都至少被两双眼睛看过,两个脑袋思考过。代码被不断地复审,这样可以避免牛仔式的编程。同时,结对编程避免了“我的代码”还是“他的代码”的问题,使得代码的责任不属于某个人,而是属于两个人,进而属于整个团队,这样能够帮助建立集体拥有代码的意识,在一定程度上避免了个人英雄主义。
结对编程的过程也是一个互相督促的过程,每个人的一举一动都在别人的视线之内,所有的想法都要受到对方的评价。由于这种督促的压力,使得程序员更认真地工作。结对编程“迫使”程序员必须频繁地交流,而且要提高自己的技术能力以免被别人小看。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,869评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,716评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,223评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,047评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,089评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,839评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,516评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,410评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,920评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,052评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,179评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,868评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,522评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,070评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,186评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,487评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,162评论 2 356