黄金点游戏简介
黄金点游戏是一个数字小游戏,其游戏规则是:
N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。玩了几天以后,大家发现了一些很有意思的现象,比如黄金点在逐渐地往下移动。
技术关键点:
界面设计就直接拖入控件就行,关键是控件stackedwidget的使用,该游戏界面之间切换就是利用该控件。每个页面会有一个页面号,下面代码就是切换到页面号为0的页面代码。
ui->stackedWidget->setCurrentIndex(0);
游戏运行截图:
实现了多轮游戏机制,以下为游戏运行界面展示,因为游戏开发处于初步阶段,界面还不是很好看:
游戏输入界面可以支持多位玩家输入数字,不同玩家输入数字需要以空格隔开。输入数字对玩家不可见,可以避免上次玩家输入对下个玩家输入数字的影响。界面显示上一轮黄金点值与玩家现有得分。
游戏轮数结束,展示所有玩家得分情况,支持重新开始游戏与退出游戏功能。
附代码:
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实现黄金点游戏,支持多位玩家多轮游戏机制,并显示玩家得分情况,但本项目仍存在一些问题与不足:
- 不能显示玩家输入数字,玩家也不能输入姓名。
- 界面需要进一步美化,下一阶段加入背景图和标题,并且可以利用颜色渐变美化按钮。