天天看点

黄金点小游戏(Qt实现)

黄金点游戏简介

黄金点游戏是一个数字小游戏,其游戏规则是:

N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。玩了几天以后,大家发现了一些很有意思的现象,比如黄金点在逐渐地往下移动。

技术关键点:

界面设计就直接拖入控件就行,关键是控件stackedwidget的使用,该游戏界面之间切换就是利用该控件。每个页面会有一个页面号,下面代码就是切换到页面号为0的页面代码。

黄金点小游戏(Qt实现)
ui->stackedWidget->setCurrentIndex(0);
           

游戏运行截图:

实现了多轮游戏机制,以下为游戏运行界面展示,因为游戏开发处于初步阶段,界面还不是很好看:

黄金点小游戏(Qt实现)
黄金点小游戏(Qt实现)

游戏输入界面可以支持多位玩家输入数字,不同玩家输入数字需要以空格隔开。输入数字对玩家不可见,可以避免上次玩家输入对下个玩家输入数字的影响。界面显示上一轮黄金点值与玩家现有得分。

黄金点小游戏(Qt实现)

游戏轮数结束,展示所有玩家得分情况,支持重新开始游戏与退出游戏功能。

附代码:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();


private:
    Ui::Widget *ui;
    int Pnum;//游戏人数
    int Snum;//游戏轮数
    QString strRank;//显示玩家得分
    double num[100];//记录玩家输入数字与黄金点差值绝对值
    int indexGamer[100];//记录玩家id
    int score[100];//记录玩家得分
private slots:
    void on_btn_startclicked();//游戏开始
    bool on_btn_okclicked();//确认输入
    void on_regameclicked();//重新开始游戏
};

#endif // WIDGET_H

           

widget.cpp构造函数:

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->stackedWidget->setCurrentIndex(2);
    memset(score,0,sizeof(score));
}
           

widget.cpp的on_regameclicked()函数:

void Widget::on_regameclicked()
{
    ui->numgameEdit->clear();
    ui->numpeoEdit->clear();
    ui->stackedWidget->setCurrentIndex(2);
    ui->textBrowser_2->clear();
    memset(score,0,sizeof(score));
}
           

widget.cpp的on_btn_startclicked()函数:

void Widget::on_btn_startclicked()
{
    Snum=ui->numgameEdit->text().toInt();
    Pnum=ui->numpeoEdit->text().toInt();
    ui->numgameLable->setText("1");
    ui->stackedWidget->setCurrentIndex(0);
}
           

widget.cpp的on_btn_okclicked()函数:

bool Widget::on_btn_okclicked()
{
    QStringList strinput=ui->inputEdit->text().split(" ");//获取输入
    QString a=strinput[0];
    
    for(int j=0;j<Pnum;j++)
    {
        a=strinput[j];
        if(a.toDouble()>100 || a.toDouble()<0)
        {
            ui->inputEdit->clear();
            QMessageBox::critical(0 ,
            "输入错误" , "请输入0-100的数字!",
            QMessageBox::Ok | QMessageBox::Default ,
            QMessageBox::Cancel | QMessageBox::Escape ,  0 );
            return false;
        }
    }
    int temp=ui->numgameLable->text().toInt()+1;
    ui->numgameLable->setText(QString::number(temp,10));//设置游戏轮数
    ui->inputEdit->clear();
    int i=0,m;
    double t,goldenpoint=0;
    while (i<Pnum)
    {
           a=strinput[i];
           num[i]=a.toDouble();
           goldenpoint=goldenpoint+num[i];
           qDebug()<<num[i];
           i=i+1;

    }
    goldenpoint=goldenpoint*0.618/Pnum;//计算黄金点
    qDebug()<<goldenpoint;
    ui->goldenpoint->setText(QString::number(goldenpoint,'g',5));//显示黄金点值
    for(int j=1;j<=Pnum;j++)
    {
        num[j-1]=qAbs(num[j-1]-goldenpoint);
        indexGamer[j-1]=j;
        qDebug()<<num[j-1];
        qDebug()<<indexGamer[j-1];
    }
    for(int j=1;j<=Pnum;j++)
    {
        
        qDebug()<<num[j-1];
        
    }
    //冒泡排序
    for(int j=0;j<Pnum-1;j++)
     {
      for(int k=0;k<Pnum-j-1;k++)
       {
        if(num[k]>num[k+1])         //小到大排序。
        {
         t=num[k];
         num[k]=num[k+1];
         num[k+1]=t;
         m=indexGamer[k];
         indexGamer[k]=indexGamer[k+1];
         indexGamer[k+1]=m;
        }
       }
     }

    //赋分
    qDebug()<<"------------";
    for(int j=1;j<=Pnum;j++)
    {
        qDebug()<<num[j-1];
        qDebug()<<indexGamer[j-1];
    }
    qDebug()<<indexGamer[0]-1;
    qDebug()<<indexGamer[Pnum-1]-1;
     score[indexGamer[0]-1]=score[indexGamer[0]-1]+Pnum;
     score[indexGamer[Pnum-1]-1]=score[indexGamer[Pnum-1]-1]-2;
     ui->textBrowser->clear();
    //显示排行榜
     //indexGamer[j]-1;
     strRank="";
     for(int j=0;j<Pnum;j++)
     {
         strRank=strRank+"第"+QString::number(j+1,10)+"位玩家得分:"+QString::number(score[j],10);
         strRank=strRank+"\n";
     }
     ui->textBrowser->setText(strRank);//显示排行榜
     if(temp>Snum)//游戏所有轮数完成,跳入结果页面
     {
         ui->numgameLable->clear();
         ui->inputEdit->clear();
         ui->textBrowser->clear();
         ui->goldenpoint->clear();
         ui->stackedWidget->setCurrentIndex(1);
         ui->textBrowser_2->setText(strRank);
     }
}

           

总结:

用Qt实现黄金点游戏,支持多位玩家多轮游戏机制,并显示玩家得分情况,但本项目仍存在一些问题与不足:

  1. 不能显示玩家输入数字,玩家也不能输入姓名。
  2. 界面需要进一步美化,下一阶段加入背景图和标题,并且可以利用颜色渐变美化按钮。