结对编程作业

https://github.com/YahAHaCH/pigtail

姓名 分工 博客链接
洪磊 原型设计、游戏逻辑、AI算法 https://www.cnblogs.com/YahAHaCH/p/15456220.html
张伟鹏 前端设计 https://www.cnblogs.com/zhangweipeng/p/15456224.html

一、原型设计

原型开发工具:Axure Rp8

设计说明

  • 游戏分为三个界面,开始界面,大厅界面和游戏界面
    (1)开始界面
    开始界面由一个游戏标题和三个游戏模式按键组成,分为人机对战、本地人人对战、联网对战三种模式

    若在开始界面选择人机对战或者本地人人对战,则直接进入游戏界面;若选择联网对战,则弹出登录窗口,登陆成功后进入大厅界面

(2)游戏界面

对游戏逻辑进行分析,游戏界面分为一下区域:牌库、放置区、双方手牌、用户个人信息、托管按钮和设置按钮。将游戏的每张扑克牌设置为四种状态,位于牌库、放置区或双方手牌,当满足手牌移动到另一区域的条件时,切换卡牌的状态,置入其对应的区域。左下方设有托管按钮,点击后切换为人机操作,右上角为设置按钮,点击后弹出设置窗口,可以返回大厅或结束游戏。

遇到的困难和解决办法

(1)一开始不熟悉软件的使用,导致很多功能很难实现,页面内弹出窗口的设计较为麻烦,直接使用弹出窗口会弹出一个奇怪的页面
(2)熟悉软件后,使用动态面板代替弹出窗口,避免页面内弹出窗口信息不完全的问题,解决需求。
(3)通过此次原型设计,学会了需求分析、构想页面、开发原型设计出页面。熟悉了软工开发的流程,对Axure Rp等原型开发工具的使用更为熟练

二、原型设计实现

代码实现思路

从模式拆分为三个不同的模块

  • 联网对战

  • 人机对战

  • 本地人人对战
    游戏抽象出五个类,分别为牌堆、放置区、用户、卡牌、对局,以下代码展示游戏的核心逻辑
    class Game
    {
    public:
    int op;//表示游戏类型是人人还是人机
    Pile pile;
    Deck deck;
    Player player1,player2;
    Game(int x){op=x;}
    bool Check_end()
    {
    if(deck.Empty())return true;
    return false;
    }
    void One_turn(int who)//who表示执行这一回合的玩家编号
    {
    int op;//标识进行何种操作,0~3表示打出对应花色的牌,4表示抽取牌堆的牌
    Player now;

      	if(who==1)now=player1;
      	else if(who==2)now=player2;
      	else puts("fuck!!!!");
      	
      	//请求now这一回合进行的操作
      	
      	Card top//这一轮将要发到放置区牌堆顶的卡牌
      	if(op==4) top=deck.Draw();
      	else top=now.Play(op);
      	
      	//检测即将发到放置区的卡牌和放置区顶部的卡牌花色是否相同
      	if(pile.Check_top(top))
      	{
      		who.Eat(top);
      		while(!pile.Empty())who.Eat(pile.Pop_top());
      	}
      	else
      	{
      		pile.Push_top(top);
      	}
      }
      void Run_a_game()
      {
      	int turn_count=0,now=1;//计算已经操作的回合数和现在操作的玩家编号
      	while(true)
      	{
      		++turn_count;
      		One_turn(now);
      		if(Check_end())
      		{
      			if(player1.cnt==player2.cnt)printf("Tie %d %d\n",player1.cnt,player2.cnt);
      			else if(player1.cnt>player2.cnt)printf("Player1 win! %d %d\n",player1.cnt,player2.cnt);
      			else if(player1.cnt<player2.cnt)printf("Player2 win! %d %d\n",player1.cnt,player2.cnt);
      			else printf("fuck!!!!!!!!");
      		}
      		now^=3;
      	}
      }
    

};
由于游戏中除了牌堆顺序的其余所有信息在游戏过程中是公开的,故也不隐藏玩家手牌,人机对战则将人人对战中其中一个玩家替换成AI,请求AI进行的操作

遇到的代码模块异常

游戏逻辑开发时碰到一些游戏逻辑错误,导致后续测试AI等多个步骤收到了错误的结果,经过了长时间的查错终于发现是牌堆类Pile中的函数编写有误

评价你的队友

z_w_p:一个认真负责的队友,有很强的的代码能力,自己把后端的所有算法给包揽下来,对我也提供了很大的帮助。很高兴能与他组队一起完成这个作业。
YahAHa:队友很愿意学习新东西,其实我们两个都不熟悉前端开发,他主动去学习了前端的技术

三、心得

难度方面:这一次的作业其实从游戏到实现都没有什么特别的难度,没有特别困难或需要算法的地方,但是有许多需要学习的技术和知识,收获了不少
感想:终于在作业中体验了一次完整的软工开发流程,感觉自己对软工也有更全面的理解,但是明白以后决不能在ddl之前赶工了
对之后的启发:之后想要尝试前端更进阶一些的东西,把前端做的更好,通过和队友的合作也感到了和别人合作开发的感觉,这次也学到了很多前端和接口的基础知识,希望之后也能自己做些自己想做的项目,把功能做的更完善,把UI做的更好

posted @ 2021-10-24 22:59  YahAHaCH  阅读(80)  评论(0)    收藏  举报