引言
当探究猜拳游戏的魅力时,人们往往会陶醉于其古老的历史和简单的规则之中。作为一种源远流长的竞技娱乐活动,猜拳游戏早已深入人们的生活,成为一种普遍且愉快的社交互动方式。然而,这看似简单的游戏背后却蕴含了深刻的智慧。在短暂的选择过程中,参与者不仅在思考自己的选择,更需要推测对手可能的动作,从而展现出战略思维和心理策略的较量。
而借助编程实现猜拳游戏的过程更是一种别样的乐趣。从规则设计到算法实现,每一个环节都是对逻辑思维和程序设计能力的考验。通过编程,我们能够深入探究猜拳游戏背后的数学逻辑和算法原理,体会游戏规则背后隐藏的程序化思维方式。
笔者选择了一个开源的猜拳游戏项目进行二次开发,以提升游戏的可玩性和趣味性,增加新的游戏元素,以期打造出更加吸引人的游戏版本。
原始代码
点击查看代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
int human;//玩家手势
int comp;//电脑手势
int judge;//判断输赢
int retry;//是否继续游戏
srand((unsigned int)time(NULL));//随机生成电脑的手势
printf("游戏开始!\n");
do
{
comp = rand() % 3;
do
{
printf("\n石头剪刀布 (0)石头(1)剪刀(2)布:");
scanf("%d", &human);//读取玩家的手势
} while (human < 0 || human>2);
printf("电脑出");
switch (comp)//显示电脑的手势
{
case 0:printf("石头"); break;
case 1:printf("剪刀"); break;
case 2:printf("布"); break;
}
printf("玩家出");
switch (human)//显示玩家的手势
{
case 0:printf("石头"); break;
case 1:printf("剪刀"); break;
case 2:printf("布"); break;
}
printf(".\n");
judge = (human - comp + 3) % 3;判断胜负
switch(judge)
{
case 0:printf("平局\n"); break;
case 1:printf("你输了\n"); break;
case 2:printf("你赢了\n"); break;
}
printf("再来一次吗(0)否(1)是:");
scanf("%d", &retry);
} while (retry==1);
return 0;
}
游戏运行界面
原程序存在的缺点
1.单一函数设计:原程序中所有的代码逻辑都写在一个main函数中,使得代码比较臃肿,不利于代码的维护和扩展。
2.缺乏模块化:原程序缺乏模块化划分,导致代码结构不清晰,难以理清各个部分的功能和逻辑。
3.输出信息不够友好:原程序中输出的信息比较简单,用户体验相对较差,缺乏足够的交互和提示,影响了用户对游戏的参与度。
4.错误处理不完善:原程序在读取玩家手势时,只简单判断了输入是否在范围内,缺乏对输入错误的处理,可能导致程序在用户输入错误时出现异常情况。
5.缺乏统计功能:原程序没有提供统计游戏胜负次数的功能,无法直观地展示玩家和计算机的对战情况,缺乏完整性。
优化方案
1.模块化设计:优化后的代码将功能模块化,将不同功能的代码分开编写在不同的函数中,提高了代码的可读性和可维护性。
2.友好的交互:优化后的代码增加了更加用户友好的交互方式,包括更清晰的提示信息和更生动的游戏过程展现,提升了用户体验。
3.更清晰的输出信息:优化后的代码通过修改输出方式,让信息呈现更加清晰明了,使用户更易理解游戏的规则和结果。
4.拓展性强:优化后的代码通过函数抽象,方便扩展游戏的规则和功能,具有更高的灵活性和可定制性。
5.错误处理完善:优化后的代码在读取玩家手势时增加了对输入的合法性判断,加强了错误处理,提高了程序的稳定性和健壮性。
6.提供统计功能:优化后的代码增加了统计胜负次数的功能,可以直观展示玩家和计算机的对战情况,增加了游戏的完整性和趣味性。
优化后代码
点击查看代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int human; // 玩家出的手势
int comp; // 计算机出的手势
int win_no; // 胜利次数
int lose_no; // 失败次数
int draw_no; // 平局次数
char* hd[] = { "石头","剪刀","布" }; // 定义手势字符串数组
void initialize() // 初始化函数
{
win_no = 0;
lose_no = 0;
draw_no = 0;
srand((unsigned int)time(NULL)); // 使用当前时间作为随机种子
printf("猜拳游戏开始了!"); // 输出游戏开始信息
}
void jyanken() // 运行猜拳游戏函数(读取/生成手势)
{
int i;
comp = rand() % 3; // 生成计算机的手势
do
{
printf("\n\a石头剪刀布"); // 输出提示信息
for (int i = 0; i < 3; i++)
{
printf("(%d)%s", i, hd[i]); // 输出可选择的手势
}
printf(":");
scanf("%d", &human); // 读取玩家选择的手势
} while (human < 0 || human > 2); // 确保玩家输入合法
}
void count_no(int result) // 更新游戏次数(胜利、失败、平局)
{
switch (result)
{
case 0:
draw_no++;
break;
case 1:
lose_no++;
break;
case 2:
win_no++;
break;
}
}
void disp_result(int result) // 显示游戏结果
{
switch (result)
{
case 0:
puts("平局。");
break;
case 1:
puts("你输了。");
break;
case 2:
puts("你赢了。");
break;
}
}
int main()
{
int judge;
initialize(); // 初始化游戏
do {
jyanken(); // 运行猜拳游戏
printf("计算机出%s,你出%s。", hd[comp], hd[human]); // 显示计算机和玩家的手势
judge = (human - comp + 3) % 3; // 判断输赢
count_no(judge); // 更新游戏次数
disp_result(judge); // 显示游戏结果
} while (win_no < 3 && lose_no < 3); // 判断游戏是否结束
printf(win_no == 3 ? "\n你赢了.\n" : "\n计算机赢了\n"); // 最终胜负结果
printf("%d胜%d负%d平。\n", win_no, lose_no, draw_no); // 输出胜负平局次数
return 0;
}
优化后游戏运行界面
结语
通过对比原程序与二次开发后的程序,我对如何改进代码结构、增强功能、提升用户体验有了更深入的理解,从而提升了自己的代码优化能力。
同时,我也体验了模块化设计与功能划分的好处,这对于管理复杂代码、方便维护和扩展具有重要意义,在以后的编程实践中我会更加注重模块化设计。
优化后的代码应该更加注重用户体验,如友好的交互方式、清晰的提示信息等,这也是现代软件开发中至关重要的一环。
代码优化是一个持续不断的过程,我会保持对代码优化和改进的热情,不断提升自己的编程水平。
感谢这次作业给我带来的成长与启示!