当前位置: 代码迷 >> 综合 >> C语言大作业(随机洗牌Shuffle Cards) ---- 含注释和思路
  详细解决方案

C语言大作业(随机洗牌Shuffle Cards) ---- 含注释和思路

热度:27   发布时间:2023-11-17 19:08:53.0

文章目录

    • 前引
    • 思路解析
    • 代码实现
    • 效果图


本篇博客仅作学习参考 禁止直接复制粘贴代码以及任何形式的抄袭行为


前引

因为博主 C语言已经差不多都快3个月左右没用过了
平时刷力扣和做其他的东西都是用的cpp
今天布置了两个C语言 叫做大作业其实都很简单
这个我就只花了20-30分钟左右就做出来了 很简单

但还是打算把代码贴出来吧 做都做了hhh
在这里插入图片描述


思路解析

首先是如何保存卡组呢
如果是C++的话 我会用
vector<vector<string>> 很方便很方便的就弄了
但是我刚刚去百度了一下 好像C++库函数里面也没有Shuffle函数
不像Python里面是有的 那好吧

C语言的话 就用三维的字符数组就行了 然后最后一层的数组储存牌
char card[4][13][4] 最后一层4的话 是因为有一个花色 + 最大两个数组 + '\0’空间

之后就往里面填卡组就完了 挺简单的
我用了一个 temp数组重当暂时的字符串 还用了一个sprintf函数
直接向字符数组赋值
之后就用strcpy或者memcpy 就向最底层的字符数组copy就完成了

之后就到了洗牌环节了
我也没想很多 一想就是 随机的交换 三维数组中的
管理字符数组那一层的字符串即可
然后每一次交换用四次random函数
之后就交换即可 我对指针的操作烦了
就直接memcpy对底层字符串进行交换了

思路就是这么个思路 然后具体实现就看下面代码实现就行了


代码实现

#include <stdio.h>
#include <stdlib.h>
#include <time.h>void shufflecard(char card[4][13][4]);void shufflecard(char card[4][13][4])
{
    int i,j,times = 100;char temp[4];srand(time(NULL));while(times--){
    int row1 = rand()%4,row2 = rand()%4;int line1 = rand()%13,line2 = rand()%13;memcpy(temp,card[row1][line1],sizeof(temp));memcpy(card[row1][line1],card[row2][line2],sizeof(temp));memcpy(card[row2][line2],temp,sizeof(temp));}for(i=0;i<4;++i){
    for(j=0;j<13;++j)printf("%4s",card[i][j]);printf("\n");}return;
}int main()
{
    int i,j;char ch;char card[4][13][4];//52组牌的三维数组 c语言字符串只能是const char*char temp[4];//为后面的memcpy做准备char alpha[4] = {
    "JQKA"};memset(temp,'\0',sizeof(temp));//格式化temp字符串//为52组牌进行赋值 并进行输出for(i=0;i<4;++i){
    temp[0] = i+3;for(j=0;j<13;++j){
    if(j<9) sprintf(temp+1,"%d",j+2);else sprintf(temp+1,"%c",alpha[j-9]);memcpy(card[i][j],temp,sizeof(temp));//赋值printf("%4s",card[i][j]);//输出}printf("\n");//换行}printf("\nShuffle input 'Y' quit input 'N'\n");while((ch = getchar()) == 'Y' || ch == 'y'){
    shufflecard(card);fflush(stdin);printf("\nGoing On input 'Y' quit input 'N'\n");}printf("\nThanks for using this small Shuffle_Card program \nSee u!\n");return 0;
}

效果图

在这里插入图片描述

  相关解决方案