石头剪刀布小游戏(C语言)

简介: 1.游戏规则2.游戏思路3.代码实现1.分别创建头文件game.h、源文件game.c和test.c2.创建菜单并对输入的选择进行处理3.实现石头剪刀布小游戏3.1 打印菜单帮助玩家出拳,并对玩家选择进行处理3.2电脑随机出拳3.3判断输赢 3.4 打印游戏结果3.5将结果写入文件 4.查看游戏记录5.删除游戏记录4.完整代码

1.游戏规则

石头赢剪刀,剪刀赢布,布赢石头

以1代表剪刀,2代表布,3代表石头。玩家通过选择模拟出拳。

 

2.游戏思路

1.创建菜单帮助玩家进行选择

2.实现石头剪刀布游戏

 (1)玩家通过选择模拟出拳

 (2)电脑随机出拳

 (3)判断胜负

 (4)将结果写入文件

3.查看游戏记录

4.删除历史记录

3.代码实现

1.分别创建头文件game.h、源文件game.c和test.c

game.h:存放自定义函数的声明、引用的标准库头文件等

game.c:存放函数的定义

test.c:用于程序测试

2.创建菜单并对输入的选择进行处理

voidmenu()
{
printf("******************************\n");
printf("******  1.进入游戏     *******\n");
printf("******  2.查看游戏记录 *******\n");
printf("******  3.删除游戏记录 *******\n");
printf("******  0.游戏退出     *******\n");
printf("******************************\n");
}
intmain()
{
//选择选项intinput=0;
do//循环至少执行一次    {
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
  {
case1:
//玩游戏break;
case2:
//查看比赛记录break;
case3:
//删除比赛记录break;
case0:
printf("游戏已退出\n");
break;
default:
printf("选择错误,请重新选择!\n");
break;
  }
    } while (input);
return0;
}

3.实现石头剪刀布小游戏

3.1 打印菜单帮助玩家出拳,并对玩家选择进行处理

//游戏菜单voidRPSmenu()
{
printf("******************************\n");
printf("******  0.回到主界面   *******\n");
printf("******  1.剪刀   2.布  *******\n");
printf("******      3.石头     *******\n");
printf("******************************\n");
}
//玩游戏voidRPS()
{
//玩家出拳intchoose=0;
do    {
//打印游戏菜单RPSmenu();
printf("请选择:>");
scanf("%d", &choose);
switch (choose)
        {
case0:
printf("已退回主界面!\n");
break;
case1:
case2:
case3:
//电脑出拳break;
default:
printf("选择错误,请重新选择!\n");
break;
        }
    } while (choose);
}

 

3.2电脑随机出拳

通过生成随机数,实现电脑的随机出拳

使用rand函数可以生成伪随机数,但在使用rand函数前,应使用srand函数设置随机数种子,否则每次程序运行得到的随机数序列都相同

//电脑出拳intComputerRPS()
{
//产生随机数//在使用rand()函数时,要引用对应头文件//要使用srand((unsigned int)time(NULL)来进行初始化intnum=0;
num=rand() %3+1;
returnnum;
}

3.3判断输赢

//判断输赢//平局返回0//玩家赢返回1//电脑赢返回-1intIsWin(intUserChoose, intComputerChoose)
{
//平局if (UserChoose==ComputerChoose)
    {
return0;
    }
//玩家赢elseif (UserChoose==1&&ComputerChoose==2||UserChoose==2&&ComputerChoose==3||UserChoose==3&&ComputerChoose==1)
    {
return1;
    }
//电脑赢else    {
return-1;
    }
}

3.4 打印游戏结果

将数字转换为对应出拳

//数字对应的出拳char*Outcome(intnumber)
{
switch (number)
    {
case1:
return"剪刀";
case2:
return"布";
case3:
return"石头";
    }
}

打印游戏结果

//打印结果voidPrint(char*user, char*computer, intret)
{
printf("这一局,你选择出%s,电脑选择出%s\n", user, computer);
if (ret==0)
    {
printf("平局!\n");
    }
elseif (ret==1)
    {
printf("恭喜你,你赢了!\n");
    }
else    {
printf("很遗憾,你输了!\n");
    }
}


3.5将结果写入文件

在game.h中定义变量

staticintwin=0;
staticintlose=0;
staticintdraw=0;
staticintcount=0;


//保存数据voidSaveRPS(intret)
{
FILE*pf=fopen("test.txt", "w");
if (pf==NULL)//判断文件是否打开成功    {
perror("SaveRPS");//打印错误信息return;
    }
//分别统计胜利、输、平局次数if (ret==0)
    {
draw++;
    }
elseif (ret>0)
    {
win++;
    }
else    {
lose++;
    }
count++;
//写文件fprintf(pf, "%d %d %d %d", count, win, lose, draw);
//关闭文件fclose(pf);
pf=NULL;
}

4.查看游戏记录

历史记录保存在文件中,每次程序运行时,应先读取文件中的数据

//加载上次记录voidLoadRPS()
{
//打开文件FILE*pf=fopen("test.txt", "r");
//文件未创建if (pf==NULL)
    {
return;
    }
//读文件fscanf(pf, "%d %d %d %d",&count, &win, &lose, &draw);
//关闭文件fclose(pf);
pf=NULL;
}

查看游戏记录

//查看记录voidViewRPS()
{
//统计胜利、输、平局次数if (count==0)
    {
printf("无历史记录!\n");
return;
    }
//打开文件FILE*pf=fopen("test.txt", "r");
if (pf==NULL)
    {
perror("ViewRPS");
    }
//读文件fscanf(pf, "%d %d %d %d",&count, &win, &lose, &draw);;
//关闭文件fclose(pf);
pf=NULL;
//打印printf("******************************\n");
printf("*****     游戏局数:%d   *****\n",count);
printf("*******    胜利:%d   ********\n", win);
printf("*******    输: %d    ********\n", lose);
printf("*******    平局:%d   ********\n", draw);
printf("******************************\n");
printf("\n");
}

5.删除游戏记录

//删除所有记录voidDeleteRPS()
{
//查看是否有历史记录if (count==0)
    {
printf("无历史记录,无需删除!\n");
return;
    }
//确认是否删除所有记录intflag=0;
while (1)
    {
printf("是否确认删除所有记录?(是:1/否:0)");
scanf("%d", &flag);
if (flag==0)
        {
return;
        }
elseif (flag==1)
        {
//打开文件FILE*pf=fopen("test.txt", "w");
if (pf==NULL)
            {
perror("Delete");
            }
//写文件win=0;
lose=0;
draw=0;
count=0;
fprintf(pf, "%d %d %d %d",count, win, lose, count);
//关闭文件fclose(pf);
pf=NULL;
//打印提示printf("历史记录删除成功\n");
return;
        }
else        {
printf("选择错误,请重新选择!\n");
continue;
        }
    }
}

4.完整代码

game.h

#pragma once#include <stdio.h>#include <stdlib.h>#include <time.h>voidRPS();//石头剪刀布游戏intComputerRPS();//电脑出拳intIsWin(intUserChoose, intComputerChoose);//判断输赢voidPrint(char*user, char*computer, intret);//打印结果char*Outcome(intnumber);//出拳结果voidSaveRPS(intret);//保存记录voidLoadRPS();//加载记录voidViewRPS();//查看记录voidDeleteRPS();//删除记录staticintwin=0;
staticintlose=0;
staticintdraw=0;
staticintcount=0;

game.c

#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"//游戏菜单voidRPSmenu()
{
printf("******************************\n");
printf("******  0.回到主界面   *******\n");
printf("******  1.剪刀   2.布  *******\n");
printf("******      3.石头     *******\n");
printf("******************************\n");
}
//玩游戏voidRPS()
{
//玩家出拳intchoose=0;
//电脑随机出拳intret=0;
do    {
//打印游戏菜单RPSmenu();
printf("请选择:>");
scanf("%d", &choose);
switch (choose)
        {
case0:
printf("已退回主界面!\n");
break;
case1:
case2:
case3:
//电脑出拳ret=ComputerRPS();
//判断输赢//平局返回0//用户赢返回1//电脑赢返回-1intresult=IsWin(choose, ret);
//打印游戏结果char*user=Outcome(choose);
char*computer=Outcome(ret);
Print(user, computer, result);
//将结果写入文件SaveRPS(result);
break;
default:
printf("选择错误,请重新选择!\n");
break;
        }
    } while (choose);
}
//电脑出拳intComputerRPS()
{
//产生随机数//在使用rand()函数时,要引用对应头文件//要使用srand((unsigned int)time(NULL)来进行初始化intnum=0;
num=rand() %3+1;
returnnum;
}
//判断输赢intIsWin(intUserChoose, intComputerChoose)
{
//平局if (UserChoose==ComputerChoose)
    {
return0;
    }
//玩家赢elseif (UserChoose==1&&ComputerChoose==2||UserChoose==2&&ComputerChoose==3||UserChoose==3&&ComputerChoose==1)
    {
return1;
    }
//电脑赢else    {
return-1;
    }
}
//打印结果voidPrint(char*user, char*computer, intret)
{
printf("这一局,你选择出%s,电脑选择出%s\n", user, computer);
if (ret==0)
    {
printf("平局!\n");
    }
elseif (ret==1)
    {
printf("恭喜你,你赢了!\n");
    }
else    {
printf("很遗憾,你输了!\n");
    }
}
//数字对应的出拳char*Outcome(intnumber)
{
switch (number)
    {
case1:
return"剪刀";
case2:
return"布";
case3:
return"石头";
    }
}
//保存数据voidSaveRPS(intret)
{
FILE*pf=fopen("test.txt", "w");
if (pf==NULL)//判断文件是否打开成功    {
perror("SaveRPS");//打印错误信息return;
    }
//分别统计胜利、输、平局次数if (ret==0)
    {
draw++;
    }
elseif (ret>0)
    {
win++;
    }
else    {
lose++;
    }
count++;
//写文件fprintf(pf, "%d %d %d %d", count, win, lose, draw);
//关闭文件fclose(pf);
pf=NULL;
}
//加载上次记录voidLoadRPS()
{
//打开文件FILE*pf=fopen("test.txt", "r");
//文件未创建if (pf==NULL)
    {
return;
    }
//读文件fscanf(pf, "%d %d %d %d",&count, &win, &lose, &draw);
//关闭文件fclose(pf);
pf=NULL;
}
//查看记录voidViewRPS()
{
//统计胜利、输、平局次数if (count==0)
    {
printf("无历史记录!\n");
return;
    }
//打开文件FILE*pf=fopen("test.txt", "r");
if (pf==NULL)
    {
perror("ViewRPS");
    }
//读文件fscanf(pf, "%d %d %d %d",&count, &win, &lose, &draw);;
//关闭文件fclose(pf);
pf=NULL;
//打印printf("******************************\n");
printf("*****     游戏局数:%d   *****\n",count);
printf("*******    胜利:%d   ********\n", win);
printf("*******    输: %d    ********\n", lose);
printf("*******    平局:%d   ********\n", draw);
printf("******************************\n");
printf("\n");
}
//删除所有记录voidDeleteRPS()
{
//查看是否有历史记录if (count==0)
    {
printf("无历史记录,无需删除!\n");
return;
    }
//确认是否删除所有记录intflag=0;
while (1)
    {
printf("是否确认删除所有记录?(是:1/否:0)");
scanf("%d", &flag);
if (flag==0)
        {
return;
        }
elseif (flag==1)
        {
//打开文件FILE*pf=fopen("test.txt", "w");
if (pf==NULL)
            {
perror("Delete");
            }
//写文件win=0;
lose=0;
draw=0;
count=0;
fprintf(pf, "%d %d %d %d",count, win, lose, count);
//关闭文件fclose(pf);
pf=NULL;
//打印提示printf("历史记录删除成功\n");
return;
        }
else        {
printf("选择错误,请重新选择!\n");
continue;
        }
    }
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"//主界面菜单voidmenu()
{
printf("******************************\n");
printf("******  1.进入游戏     *******\n");
printf("******  2.查看游戏记录 *******\n");
printf("******  3.删除游戏记录 *******\n");
printf("******  0.游戏退出     *******\n");
printf("******************************\n");
}
intmain()
{
srand((unsignedint)time(NULL));
//加载上次数据LoadRPS();
//选择选项intinput=0;
do//循环至少执行一次    {
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
        {
case1:
//玩游戏RPS();
break;
case2:
//查看比赛记录ViewRPS();
break;
case3:
//删除比赛记录DeleteRPS();
break;
case0:
printf("游戏已退出\n");
break;
default:
printf("选择错误,请重新选择!\n");
break;
        }
    } while (input);
return0;
}


目录
相关文章
|
2月前
|
C语言 C++
【C语言】编写“猜数字“小游戏
【C语言】编写“猜数字“小游戏
107 1
|
3月前
|
定位技术 API C语言
C语言——实现贪吃蛇小游戏
本文介绍了一个基于Windows控制台的贪吃蛇游戏的实现方法。首先,需调整控制台界面以便更好地显示游戏。接着,文章详细描述了如何使用Win32 API函数如`COORD`、`GetStdHandle`、`GetConsoleCursorInfo`等来控制控制台的光标和窗口属性。此外,还介绍了如何利用`GetAsyncKeyState`函数实现键盘监听功能。文中还涉及了`&lt;locale.h&gt;`库的使用,以支持本地化字符显示。
78 1
C语言——实现贪吃蛇小游戏
|
3月前
|
存储 安全 算法
C 语言——实现扫雷小游戏
本文介绍了使用二维数组创建棋盘并实现扫雷游戏的方法。首先,通过初始化数组创建一个9x9的棋盘,并添加行列标识以便操作。接着,利用随机数在棋盘上布置雷。最后,通过判断玩家输入的坐标来实现扫雷功能,包括显示雷的数量和处理游戏胜利或失败的情况。文中提供了完整的代码实现。
57 1
C 语言——实现扫雷小游戏
|
2月前
|
存储 API C语言
【C语言】实践:贪吃蛇小游戏(附源码)(一)
【C语言】实践:贪吃蛇小游戏(附源码)
|
6月前
|
C语言
C语言实现2048小游戏---粤嵌GE6818嵌入式系统实训
C语言实现2048小游戏---粤嵌GE6818嵌入式系统实训
|
2月前
|
C语言 定位技术 API
【C语言】实践:贪吃蛇小游戏(附源码)(二)
【C语言】实践:贪吃蛇小游戏(附源码)
【C语言】实践:贪吃蛇小游戏(附源码)(二)
|
2月前
|
C语言 开发者
C语言实现猜数字小游戏(详细教程)
C语言实现猜数字小游戏(详细教程)
|
2月前
|
C语言
【C语言】实践:贪吃蛇小游戏(附源码)(三)
【C语言】实践:贪吃蛇小游戏(附源码)
|
2月前
|
C语言
C语言贪吃蛇小游戏来啦!
C语言贪吃蛇小游戏来啦!
36 0
|
5月前
|
存储 编译器 C语言

相关实验场景

更多