C语言-猜拳游戏二次开发

引言

当探究猜拳游戏的魅力时,人们往往会陶醉于其古老的历史和简单的规则之中。作为一种源远流长的竞技娱乐活动,猜拳游戏早已深入人们的生活,成为一种普遍且愉快的社交互动方式。然而,这看似简单的游戏背后却蕴含了深刻的智慧。在短暂的选择过程中,参与者不仅在思考自己的选择,更需要推测对手可能的动作,从而展现出战略思维和心理策略的较量。
而借助编程实现猜拳游戏的过程更是一种别样的乐趣。从规则设计到算法实现,每一个环节都是对逻辑思维和程序设计能力的考验。通过编程,我们能够深入探究猜拳游戏背后的数学逻辑和算法原理,体会游戏规则背后隐藏的程序化思维方式。
笔者选择了一个开源的猜拳游戏项目进行二次开发,以提升游戏的可玩性和趣味性,增加新的游戏元素,以期打造出更加吸引人的游戏版本。

原始代码

点击查看代码
#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;
}

优化后游戏运行界面

结语
通过对比原程序与二次开发后的程序,我对如何改进代码结构、增强功能、提升用户体验有了更深入的理解,从而提升了自己的代码优化能力。
同时,我也体验了模块化设计与功能划分的好处,这对于管理复杂代码、方便维护和扩展具有重要意义,在以后的编程实践中我会更加注重模块化设计。
优化后的代码应该更加注重用户体验,如友好的交互方式、清晰的提示信息等,这也是现代软件开发中至关重要的一环。
代码优化是一个持续不断的过程,我会保持对代码优化和改进的热情,不断提升自己的编程水平。
感谢这次作业给我带来的成长与启示!

posted @ 2024-03-06 13:50  净汉净汉净汉  Views(49)  Comments(0Edit  收藏  举报