简单取石子游戏~博弈

很坑爹的小游戏,至于怎么坑爹,嘎嘎~自己研究去吧~!
#include<stdio.h>
#include<windows.h>
#include<iostream>
#include<string.h>
#include<time.h>
using namespace std;
void Loc(int x,int y);/*定位光标*/
void Welcome(); /*创建欢迎界面*/
void BuildMap();/*创建界面*/
void GetNumber();/*获得测试的值n,m,s*/
void Choice();   /*玩家选择是否先手*/
void GameStart();/*开始游戏!*/
void ShowScore();
void End();
int n1,n2,m,s,r,n;/*n1为玩家先手的石子个数,n2为电脑先手的石子个数*/
int YesNo;/*1为玩家先手,2为电脑先手*/
void Loc(int x,int y)
{
    COORD pos={x,y};
    HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hout,pos);
}
void Welcome()
{
    char YesOrNo[10];
    Loc(13,3);
    printf("如果你已经熟悉游戏规则请输入'Y'跳过规则介绍,否则输入'N':");
    scanf("%s",&YesOrNo);
    if(YesOrNo[0]=='Y') return;
    Loc(13,5);
    printf("欢迎测试<博弈的智慧>~下面简述游戏规则:\n");
    Sleep(1000);/*延迟*/
    Loc(13,7);
    Sleep(2000);/*延迟*/
    printf("程序给出n个石子以及每次最多能拿走的石子个数m\n");
    Loc(13,9);
    Sleep(3000);/*延迟*/
    printf("玩家可以选择先手或者后手,每次最少拿走1个\n");
    Loc(13,11);
    Sleep(3000);/*延迟*/
    printf("谁拿最后一个石子就获得比赛的胜利!~");
    Loc(13,13);
    Sleep(2000);
    printf("如果赢得了比赛之后会有神秘的奖励哦~");
    Sleep(3000);
    system("cls");
}
void GetNumber()
{
    srand((unsigned int)time(NULL));
    m=rand()%8+3;/*获得一个在3~10的随机数*/
    r=rand()%5+2;/*生成一个2~6的随机数*/
    s=m-2;       /*s在1~8内*/
    n1=(m+1)*r;  /*玩家先手*/
    n2=(m+1)*r+s;/*电脑先手*/
}
void Choice()
{
    char YesOrNo[10];
    Loc(13,7);
    printf("你是否选择先手取石子?(输入Y/N):");
    scanf("%s",YesOrNo);
    if(YesOrNo[0]=='Y') YesNo=1;/*如果选择了先手*/
    else YesNo=0;/*选择了后手*/
    Loc(15,10);
    if(YesNo==1)
    printf("你选择了先手取石子!");
    else
    printf("你选择了后手取石子!");
    Sleep(2000);
    system("cls");
}
void BuildMap()
{
    for(int i=0;i<=50;i+=2)
    {
        Loc(i,0);
        printf("■");
        Loc(i,50);
        printf("■");
    }
    for(int i=0;i<=50;i++)
    {
        Loc(0,i);
        printf("■");
        Loc(50,i);
        printf("■");
    }
    for(int i=52;i<=70;i+=2)
    {
        Loc(i,0);
        printf("■");
        Loc(i,10);
        printf("■");
    }
    for(int i=0;i<=10;i++)
    {
        Loc(52,i);
        printf("■");
        Loc(70,i);
        printf("■");
    }
    for(int i=52;i<=70;i+=2)
    {
        Loc(i,12);
        printf("■");
        Loc(i,20);
        printf("■");
    }
    for(int i=12;i<=20;i++)
    {
        Loc(52,i);
        printf("■");
        Loc(70,i);
        printf("■");
    }
    Loc(55,14);
    printf("<博弈的智慧>");
    Loc(55,16);
    printf("作者:Hsk");
    Loc(55,19);
    printf("感谢您的使用!");
}
void ShowScore()/*状态栏*/
{
    Loc(54,2);
    printf("剩余石子个数:%d",n);
    Loc(54,4);
    printf("最多可拿个数:%d",m);
}
void GameStart()
{
    int y1=2,x;/*定位左/右画面的移动*/
    if(YesNo==1)
    {
        n=n1;
    }
    else
        n=n2;
    ShowScore();
    Sleep(4000);
    if(YesNo==0)/*如果电脑先取石子*/
    {
        n=n-s;
        ShowScore();
        Loc(2,y1);
        printf("电脑取走了%d个石子,还剩余%d个",s,n);
        y1+=2;
    }
    while(n>0)
    {
        Loc(54,6);
        printf("输入取石数:");
        scanf("%d",&x);/*玩家取走了x个*/
        if(x>m||x<1) /*如果取多了*/
        {
            Loc(2,y1);
            printf("输入错误!请重新输入!");
            Loc(65,6);
            printf("   ");
            continue;
        }
        n=n-x;
        Loc(2,y1);
        y1+=2;
        printf("玩家取走了%d个石子,还剩余%d个",x,n);
        /*下面该电脑取走石子了*/
        Sleep(2000);
        x=(m+1)-x;
        n=n-x;
        /*电脑每次只要拿走m+1-x个就是必胜态*/
        Loc(2,y1);
        y1+=2;
        printf("电脑取走了%d个石子,还剩余%d个",x,n);
        Loc(65,6);
        printf("   ");
    }
    Loc(2,y1);
    printf("你输啦!再来一次吧?赢了会有大礼哦~");
    y1+=2;
    Loc(2,y1);
    printf("是否再来一把?(Y/N):");
}
void End()
{
    Loc(13,8);
    printf("感觉您的支持~!Thank you!~");
    Loc(13,12);
    printf("Made by 2013-3-19");
    Sleep(3000);
}
int main()
{
    char x[10]={'Y'};
    do{
    Welcome();
    GetNumber();
    Choice();
    BuildMap();
    GameStart();
    scanf("%s",x);
    system("cls");
    }while(x[0]=='Y');
    Loc(0,50);
    End();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值