day12 coding Qt作业:猜拳(改bug,优化代码)

This commit is contained in:
flykhan 2023-06-29 10:12:24 +08:00
parent de36ac8b3c
commit 6f894cb9b1
2 changed files with 52 additions and 38 deletions

View File

@ -7,24 +7,31 @@ MainWidget::MainWidget(QWidget *parent)
{ {
ui->setupUi(this); ui->setupUi(this);
rockImg = new QPixmap(":/imgs/rock"); // 随机数为 0 时, 加载拳头
paperImg = new QPixmap(":/imgs/paper"); // 随机数为 1 时, 加载布
scissorsImg = new QPixmap(":/imgs/scissors"); // 随机数为 2 时, 加载剪刀
// 电脑初始化时加载的图片 // 电脑初始化时加载的图片
QPixmap firstImg; QPixmap firstImg;
firstImg.load(":/imgs/scissors"); firstImg.load(":/imgs/scissors");
ui->randImgsLable->setPixmap(firstImg); ui->randImgsLable->setPixmap(firstImg);
// 初始化计分板数据
numsOfGame = 0;
currentScore = 0;
// 随机函数定义 // 随机函数定义
srand(time(NULL)); // 随时间变化的随机种子 srand(time(NULL)); // 随时间变化的随机种子
// randNum = rand() % 3; // 在 0-2 之间随机取值
timer = new QTimer(); timer = new QTimer();
connect(timer,&QTimer::timeout,[&](){
randNum = rand() % 3; // 在 0-2 之间随机取值
QPixmap nowImg = switchImgs(randNum); // 根据当前的随机值加载图片
ui->randImgsLable->setPixmap(nowImg); // 将当前随机值对应的图片设置到主界面
// 调试信息
qDebug() << "numsOfGame: " << numsOfGame <<", randNum: "<<randNum
<<", playerInputNum: "<<playerInputNum<<endl;
});
} }
MainWidget::~MainWidget() MainWidget::~MainWidget()
@ -36,15 +43,7 @@ MainWidget::~MainWidget()
void MainWidget::on_startGameBtn_clicked() void MainWidget::on_startGameBtn_clicked()
{ {
numsOfGame++; numsOfGame++;
connect(timer,&QTimer::timeout,[&](){
randNum = rand() % 3; // 在 0-2 之间随机取值
QPixmap nowImg = switchImgs(randNum); // 根据当前的随机值加载图片
ui->randImgsLable->setPixmap(nowImg); // 将当前随机值对应的图片设置到主界面
// 调试信息
qDebug() << "numsOfGame: " << numsOfGame <<", randNum: "<<randNum
<<", playerInputNum: "<<playerInputNum<<endl;
});
timer->start(0.05*1000); // 50ms timer->start(0.05*1000); // 50ms
// 更新游戏次数 // 更新游戏次数
@ -55,30 +54,33 @@ QPixmap MainWidget::switchImgs(int randNum)
{ {
switch (randNum) { switch (randNum) {
case rock: case rock:
randImg = new QPixmap(":/imgs/rock"); // 随机数为 0 时, 加载拳头 return *rockImg; // 随机数为 0 时, 加载拳头
break; break;
case paper: case paper:
randImg = new QPixmap(":/imgs/paper"); // 随机数为 1 时, 加载布 return *paperImg; // 随机数为 1 时, 加载布
break; break;
case scissors: case scissors:
randImg = new QPixmap(":/imgs/scissors"); // 随机数为 2 时, 加载剪刀 return *scissorsImg; // 随机数为 2 时, 加载剪刀
break; break;
default: default:
randImg = new QPixmap(":/imgs/paper"); // 默认加载布 return *paperImg; // 默认加载布
break; break;
} }
return *randImg;
} }
void MainWidget::on_rockBtn_clicked() void MainWidget::on_rockBtn_clicked()
{ {
// 当计数器状态为 false, 即计时器当前已经是 stop 状态时, 点击当前按钮时, 直接返回, 不进行其他逻辑操作
if(timer->isActive() == false){
return;
}
timer->stop(); // 随机数生成的计数器停止 timer->stop(); // 随机数生成的计数器停止
playerInputNum = rock; // 玩家出拳 playerInputNum = rock; // 玩家出拳
// 电脑不出“布”, 则玩家加 10 分, 否则减 3 分 // 则玩家赢加 10 分, 输减 3 分, 平局不得
if(randNum != paper){ if(randNum == scissors){
currentScore+=10; currentScore+=10;
} else { } else if(randNum == paper) {
currentScore-=3; currentScore-=3;
} }
@ -92,12 +94,17 @@ void MainWidget::on_rockBtn_clicked()
void MainWidget::on_paperBtn_clicked() void MainWidget::on_paperBtn_clicked()
{ {
// 当计数器状态为 false, 即计时器当前已经是 stop 状态时, 点击当前按钮时, 直接返回, 不进行其他逻辑操作
if(timer->isActive() == false){
return;
}
timer->stop(); // 随机数生成的计数器停止 timer->stop(); // 随机数生成的计数器停止
playerInputNum = paper; // 玩家出布 playerInputNum = paper; // 玩家出布
// 电脑不出“剪刀”, 则玩家加 10 分, 否则减 3 分 // 则玩家赢加 10 分, 输减 3 分, 平局不得
if(randNum != scissors){ if(randNum == rock){
currentScore+=10; currentScore+=10;
} else { } else if(randNum == scissors) {
currentScore-=3; currentScore-=3;
} }
@ -111,12 +118,17 @@ void MainWidget::on_paperBtn_clicked()
void MainWidget::on_scissorsBtn_clicked() void MainWidget::on_scissorsBtn_clicked()
{ {
// 当计数器状态为 false, 即计时器当前已经是 stop 状态时, 点击当前按钮时, 直接返回, 不进行其他逻辑操作
if(timer->isActive() == false){
return;
}
timer->stop(); // 随机数生成的计数器停止 timer->stop(); // 随机数生成的计数器停止
playerInputNum = scissors; // 玩家出剪刀 playerInputNum = scissors; // 玩家出剪刀
// 电脑不出“拳”, 则玩家加 10 分, 否则减 3 分 // 则玩家赢加 10 分, 输减 3 分, 平局不得
if(randNum != rock){ if(randNum == paper){
currentScore+=10; currentScore+=10;
} else { } else if(randNum == rock) {
currentScore-=3; currentScore-=3;
} }
@ -130,16 +142,16 @@ void MainWidget::on_scissorsBtn_clicked()
void MainWidget::on_clearBtn_clicked() void MainWidget::on_clearBtn_clicked()
{ {
timer->stop(); // 随机数生成的计数器停止
// 统计数据重置为 0 // 统计数据重置为 0
currentScore = 0; currentScore = 0;
numsOfGame = 0; numsOfGame = 0;
timer->stop(); // 随机数生成的计数器停止
// 更新游戏次数 // 更新游戏次数
ui->numsOfGameLable->setText("游戏次数: " + QString::number(numsOfGame)); ui->numsOfGameLable->setText("游戏次数: ");
// 更新计分板 // 更新计分板
ui->currentScoreLable->setText("当前得分: " + QString::number(currentScore)); ui->currentScoreLable->setText("当前得分: ");
// 调试信息 // 调试信息
qDebug() << "numsOfGame: " << numsOfGame <<", randNum: "<<randNum qDebug() << "numsOfGame: " << numsOfGame <<", randNum: "<<randNum

View File

@ -28,10 +28,12 @@ private:
int randNum; // 电脑出招映射的随机数 0, 1, 2 int randNum; // 电脑出招映射的随机数 0, 1, 2
int playerInputNum; // 玩家点击的按钮映射的数值 0, 1, 2 int playerInputNum; // 玩家点击的按钮映射的数值 0, 1, 2
QTimer *timer; // 计时器 QTimer *timer; // 计时器
QPixmap *randImg; // 随机的电脑出招图片 // QPixmap *randImg; // 随机的电脑出招图片
int numsOfGame; // 游戏次数 int numsOfGame; // 游戏次数
int currentScore; // 当前得分 int currentScore; // 当前得分
QPixmap *rockImg; // 拳头
QPixmap *paperImg; // 布
QPixmap *scissorsImg; // 剪刀
public: public:
// 定义枚举: 0-拳、1-布、2-剪刀 // 定义枚举: 0-拳、1-布、2-剪刀