斗地主思想也可以说是框架:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define ROW 5
#define COLUMN 13
#define PLAYER_NUM 3
int visited[ROW][COLUMN] = { 0 };
//用户
char players[PLAYER_NUM][17][288];
一副扑克牌有54张牌,三个人玩每个人是17张牌,留三张是底牌
那么首先用一个数组来存放54张牌
ROW是5,COLUMN是13,T是10会在整体代码里介绍
char cards[ROW][COLUMN] = { {'A','2','3','4','5','6','7','8','9','T','J','Q','K'},
{'A','2','3','4','5','6','7','8','9','T','J','Q','K'} ,
{'A','2','3','4','5','6','7','8','9','T','J','Q','K'} ,
{'A','2','3','4','5','6','7','8','9','T','J','Q','K'} ,{'B','L'} };//B是大王,L是小王
接下来就是一个获取花色的问题:
梅花,红桃,黑桃,方块,在这里我们要想到大小王没有花色的问题
这里我们就用到一个strcpy函数,简单来说就是字符串的复制,可以自己下来去搜索一下。
//获取花色
void getcolor(int color, int *pointnum, char* cardcolor) //pointnum是牌数
{
switch (color) {
case 0:
strcpy(cardcolor, "梅花");
break;
case 1:
strcpy(cardcolor, "红桃");
break;
case 2:
strcpy(cardcolor, "黑桃");
break;
case 3:
strcpy(cardcolor, "方块");
break;
case 4:
*pointnum = (*pointnum) % 2;//解决大小王随机问题
strcpy(cardcolor, "");//大小王没有花色
break;
}
}
接下来就是一个发牌的过程
这里我们会用到一个srand函数,srand函数是C语言中的一个随机数种子生成函数。它用于设置rand函数生成随机数的起始值,以保证每次程序运行时生成的随机数序列是不同的。
void sendcards(char(*cards)[COLUMN]) {
void getcolor(int color, int* pointnum, char* cardcolor);//获取花色声明
//播种
srand((unsigned int)time(NULL));
int i = 0;
for (; i < 51;) {
//随即发牌
int color = rand() % 5;
int pointnum = rand() % 13;
char cardcolor[200] = { 0 };
getcolor(color, &pointnum, cardcolor);//花色的获取
if (visited[color][pointnum] == 0) {
char ch[2] = { *(*(cards + color) + pointnum),'\0' };
//花色和点数拼接
strcat(cardcolor, ch);
//将牌发给玩家
strcpy(players[i / 17][i % 17], cardcolor);
visited[color][pointnum] = 1;
i++;
}
}
}
接下来打印玩家底牌
void showPlayerCards()
{
for (int i = 0; i < PLAYER_NUM; i++) {
printf("player%d ", i + 1);
for (int j = 0; j < 17; j++) {
printf("%-8s", *(players + i) + j);
}
printf("\n");
}
}
最后显示底牌
void showBottomCards(char(*cards)[COLUMN]) {
void getcolor(int color, int* pointnum, char* cardcolor);//获取花色
int count = 1;
int cpunt = 1;
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COLUMN; j++) {
if (count > 3) {
return;
}
//判断是否重复牌
if (visited[i][j] == 0) {
char card[200] = { 0 };
int pointnum = j;
getcolor(i, &pointnum, card);//获取花色
char num[2] = { cards[i][pointnum],'\0' };
strcat(card, num);//花色和点数合并
printf("%-8s", card);
count++;
}
}
}
}
以下是整体代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define ROW 5
#define COLUMN 13
#define PLAYER_NUM 3
int visited[ROW][COLUMN] = { 0 };
//用户
char players[PLAYER_NUM][17][288];
int main() {
void sendcards(char(*cards)[COLUMN]);//发牌声明
void showPlayerCards();//打印玩家牌声明
void showBottomCards(char(*cards)[COLUMN]);//显示底牌声明
//梅花,红桃,黑桃,方块,大小王
char cards[ROW][COLUMN] = { {'A','2','3','4','5','6','7','8','9','T','J','Q','K'},
{'A','2','3','4','5','6','7','8','9','T','J','Q','K'} ,
{'A','2','3','4','5','6','7','8','9','T','J','Q','K'} ,
{'A','2','3','4','5','6','7','8','9','T','J','Q','K'} ,{'B','L'} };
//发牌
sendcards(cards);
//打印玩家的牌
showPlayerCards();
//显示底牌
printf("底牌:");
showBottomCards(cards);
return 1;
}
//发牌
void sendcards(char(*cards)[COLUMN]) {
void getcolor(int color, int* pointnum, char* cardcolor);//获取花色声明
//播种
srand((unsigned int)time(NULL));
int i = 0;
for (; i < 51;) {
//随即发牌
int color = rand() % 5;
int pointnum = rand() % 13;
char cardcolor[200] = { 0 };
getcolor(color, &pointnum, cardcolor);
if (visited[color][pointnum] == 0) {
char ch[2] = { *(*(cards + color) + pointnum),'\0' };
//花色和点数拼接
strcat(cardcolor, ch);
//将牌发给玩家
strcpy(players[i / 17][i % 17], cardcolor);
visited[color][pointnum] = 1;
i++;
}
}
}
//获取花色
void getcolor(int color, int *pointnum, char* cardcolor) {
switch (color) {
case 0:
strcpy(cardcolor, "梅花");
break;
case 1:
strcpy(cardcolor, "红桃");
break;
case 2:
strcpy(cardcolor, "黑桃");
break;
case 3:
strcpy(cardcolor, "方块");
break;
case 4:
*pointnum = (*pointnum) % 2;//解决大小王随机问题
strcpy(cardcolor, "");
break;
}
}
//打印玩家牌
void showPlayerCards()
{
for (int i = 0; i < PLAYER_NUM; i++) {
printf("player%d ", i + 1);
for (int j = 0; j < 17; j++) {
printf("%-8s", *(players + i) + j);
}
printf("\n");
}
}
//显示底牌
void showBottomCards(char(*cards)[COLUMN]) {
void getcolor(int color, int* pointnum, char* cardcolor);
int count = 1;
int cpunt = 1;
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COLUMN; j++) {
if (count > 3) {
return;
}
//判断是否重复牌
if (visited[i][j] == 0) {
char card[200] = { 0 };
int pointnum = j;
getcolor(i, &pointnum, card);//获取花色
char num[2] = { cards[i][pointnum],'\0' };
strcat(card, num);//花色和点数合并
printf("%-8s", card);
count++;
}
}
}
}