C语言实战之纸牌游戏

目录
  • 1. 基本要求
  • 2. 运行界面
  • 3. 代码解释 

1. 基本要求

  • 一副没有花牌(J、Q、K、A、大小王)的扑克牌,两个人进行纸牌游戏,其中一个人为用户,另一个人为计算机;
  • 每轮每人各发5张牌,各自以这5张牌建立二叉排序树;
  • 由用户先出,轮流出牌,每次只能出一张并且要比别人出的大,如:用户出3,计算机则要出比3大的牌,没有则选择不出;
  • 最先出完的人获胜。

2. 运行界面

1. 首页面

2. 游戏说明

3. 开始游戏

4. 开始出牌

5. 游戏结束

3. 代码解释 

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>

int card[5][2];	 // 分别标记玩家和用户已经出过的牌
int playercard[5];	 // 玩家的手牌
int computercard[5]; // 电脑的手牌 

char bhuase[5];
char chuase[5];

typedef struct node
{
	int data;
	struct node *LChild;
	struct node *RChild;
}node;

typedef struct tree
{
	int data;
	struct node *LChild;
	struct node *RChild;
}tree;

// 游戏说明
void PlayingCardsyxsm()
{
	printf(" 每轮每人各发5张牌,各自以五张牌建立二叉树,由用户先出,轮流出牌,\n");
	printf(" 每次只能出一张并且要比别人出的大,\n");
	printf(" 如:用户出3,计算机则要算出比3大的牌,没有则选择不出;\n");
	printf(" 最先出完的人获胜。\n");
}

// 发牌
void PlayingCardsfp()
{
	int player;
	int computer;
	// 玩家和电脑各发五张牌
	for(int i = 0; i < 5; i ++ ){
		player = rand() % 9 + 2;
		printf("玩家发到的牌:%d \n", player);
		playercard[i] = player;
		computer = rand() % 9 + 2;
		printf("电脑发到的牌:%d \n", computer);
		computercard[i] = computer;
	}
}

// 出牌
void PlayingCardscp()
{
	int player = 0;	// 玩家当前回合出的牌
	int computer = 0;	// 电脑当前回合出的牌
	int playercount = 0;	// 玩家的出牌数
	int computercount = 0;	// 电脑的出牌数
	bool flag = false;
	// 当每次都出现最大值时,游戏同样最多进行5回合
	for(int m = 0; m < 5; m ++ )
	{
		// 在双方都有牌出的时候,一共最多进行5回合出牌
		for(int k = 0; k < 5; k ++ )
		{
			for(int j = 0; j < 5; j ++ )
			{
				// 确定当前牌可以出,大于对方的出牌,且自己没有出过这张牌
				if(playercard[j] > computer && card[j][0] == 0)
				{
					printf("玩家出牌%c%d\n", bhuase[j],playercard[j]);
					playercount ++ ;	 // 玩家出牌数+1
					// 标记玩家已经出过这张牌了
					card[j][0] = 1;
					player = playercard[j];
					Sleep(800);		// 在头函数#include <windows.h>中,起到休眠程序的作用
					break;
				}
			}

			// 若果玩家已经出完5张牌,则玩家获胜,退出循环
			if(playercount == 5)
			{
				printf("玩家赢了!");
				flag = true;
				break;
			}

			for(int j = 0; j < 5; j ++ )
			{
				// 确定当前牌可以出,大于对方的出牌,且自己没有出过这张牌
				if(computercard[j] > player && card[j][1] == 0)
				{
					printf("电脑出牌%c%d\n", chuase[j],computercard[j]);
					computercount ++ ;  // 电脑出牌数+1
					// 标记电脑已经出过这张牌了
					card[j][1] = 1;
					computer = computercard[j];
					Sleep(800);
					break;
				}
			}

			// 若果电脑已经出完5张牌,则电脑获胜,退出循环
			if(computercount == 5)
			{
				printf("电脑赢了!");
				flag = true;
				break;
			}
		}

		// 如果玩家的牌大于电脑的最大牌后,将电脑当前回合的牌值重置为0,继续进行下一回合
		if(player > computer) computer = 0;
		// 如果电脑的牌大于玩家的最大牌后,将玩家当前回合的牌值重置为0,继续进行下一回合
		if(computer > player) player = 0;

		if(flag) break;

	}
}

// 发完牌后玩家的手牌
void PlayingCardsxswj()
{
	printf("玩家\n");
	printf("   %d   %d   %d   %d   %d\n", playercard[0], playercard[1], playercard[2], playercard[3], playercard[4], playercard[5]);
}

// 发完牌后电脑的手牌
void PlayingCardsxsdn()
{
	printf("电脑\n");
	printf("   %d   %d   %d   %d   %d\n", computercard[0], computercard[1], computercard[2], computercard[3], computercard[4], computercard[5]);
}

// 初始化树的头结点为空
void treechushihua(node *t)
{
	t = NULL;
} 

// 建立平衡二叉树
node *treecharu(node *t, int key)
{
	// 如果头结点为空,就将当前节点设置为根节点
	if(t == NULL)
	{
		node *p;
		p = (node*)malloc(sizeof(node));
		p->data = key;
		p->LChild = NULL;
		p->RChild = NULL;
		t = p;
	}
	// 如果头结点不为空,则进行平衡二叉树的插入操作
	else
	{
		// 插入结点的值小于根节点,则插入左子树
		if(key < t->data)
			t->LChild = treecharu(t->LChild, key);
		// 插入结点的值大于等于根节点,则插入右子树
		else
			t->RChild = treecharu(t->RChild, key);
	}
	return t;
}

// 将玩家手牌存储到平衡二叉树中
node *jianlib(node *t)
{
	int i, key;
	for(i = 0; i < 5; i ++ )
	{
		key = playercard[i];
		t = treecharu(t, key);
	}
	return t;
} 

// 将电脑手牌存储到平衡二叉树中
node *jianlic(node *t)
{
	int i, key;
	for(i = 0; i < 5; i ++ )
	{
		key = computercard[i];
		t = treecharu(t, key);
	}
	return t;
} 

// 顺序输出玩家或电脑手牌
void treepaixu1(node *t)
{
	if(t != NULL)
	{
		treepaixu1(t->LChild);
		printf("%d ", t->data);
		treepaixu1(t->RChild);
	}
} 

// 先序遍历玩家平衡二叉树
void treepaixu2(node *t, int *p)
{
	if(t == NULL) return;
	else
	{
		// 先序遍历,将玩家手牌有序化
		treepaixu2(t->LChild,  p);
		playercard[(*p) ++ ] = t->data;
		treepaixu2(t->RChild, p);
	}
}

// 先序遍历电脑平衡二叉树
void treepaixu3(node *t, int *p)
{
	if(t == NULL) return;
	else
	{
		// 先序遍历,将电脑手牌有序化
		treepaixu3(t->LChild, p);
		computercard[(*p) ++ ] = t->data;
		treepaixu3(t->RChild, p);
	}
}  

// 主函数
int main()
{
	int k = 0;
	// 随机函数,通过时间种子来获取随机数种子,获得随机数
	srand((unsigned)time(NULL));
	int n = 0;
	// 选择菜单
	while(k != -1)
	{
		puts("");
		puts("");
		puts("");
		printf("\t\t\t ****纸牌游戏****\n");
		printf("\t\t\t****1.游戏说明****\n");
		printf("\t\t\t****2.开始游戏****\n");
		printf("\t\t\t****3.开始出牌****\n");
		printf("\t\t\t****4.游戏结束****\n");
		printf("\t\t\t******************\n");
		puts("");
		printf("\t\t**********************************\n");
		printf("\t\t**********************************\n");
		puts("");
		printf("\t\t\t请输入(1、2、3、4):\n");
		scanf("%d", &k);
		switch(k){
			// 游戏说明
			case 1: PlayingCardsyxsm(); break;
			// 发牌阶段
			case 2:{
				// 发牌
		  		PlayingCardsfp();

		  		// 建立玩家二叉树
		  		node *t1 = NULL;
				t1 = jianlib(t1);
				printf("玩家手牌为:");
		  		treepaixu1(t1);

		  		// 建立电脑二叉树
		  		node *t2 = NULL;
				t2 = jianlic(t2);
				puts("");
				printf("电脑手牌为:");
				treepaixu1(t2);

				// 玩家手牌有序化
		  		n = 0;
		  		treepaixu2(t1, &n);

		  		// 电脑手牌有序化
				n = 0;
		  		treepaixu3(t2, &n);

		  		puts("");
		  		// 输出玩家和电脑的手牌
		  		PlayingCardsxswj();
		  		PlayingCardsxsdn();
		 		break;
	  		}
	  		// 出牌阶段
			case 3:{
				PlayingCardscp();
				break;
	 		}
	 		// 退出游戏
			case 4:k=-1; break;
		}
	}
	return 0;
}          

以上就是C语言实战之纸牌游戏的详细内容,更多关于C语言纸牌游戏的资料请关注我们其它相关文章!

(0)

相关推荐

  • C语言实现纸牌计算24点小游戏

    利用系统时间设定随机种子生成4个随机数,并对4个数字之间的运算次序以及运算符号进行枚举,从而计算判断是否能得出24,以达到程序目的.程序主要功能已完成,目前还有部分细节未处理,待完成ing...对于代码中的错误,恳请批评指正. 游戏描述: A-10:分别代表数字 1-10. J,Q,K:均代表数字1. 考虑到部分地方的规则,J,Q,K 也可以当成10 ,或者直接代表本身所代表的数字,即11.12.13来运算. 使用加减乘除,能得出24者为赢,存在无解情况. 游戏开始得分为1000分,每一秒钟减少

  • C语言实现纸牌游戏之小猫钓鱼算法

    本文实例为大家分享了C语言实现小猫钓鱼算法的具体代码,供大家参考,具体内容如下 星期天小哼和小哈约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏--"小猫钓鱼".游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份.小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌.出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾.当任意一人手中的牌全部出

  • C语言实现纸牌24点小游戏

    本文实例为大家分享了C语言纸牌24点小游戏的具体实现代码,供大家参考,具体内容如下 此程序参考C语言实现经典24点纸牌益智游戏,并做出一些改进. 一.题目要求: 24点游戏规则: 从扑克中每次取出4张牌.使用加减乘除,第一个能得出24者为赢.(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏. 基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题. 1.程序风格良好(

  • C语言实现经典24点纸牌益智游戏

    一.常见游戏规则 从扑克中每次取出4张牌.使用加减乘除,第一个能得出24者为赢.(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏. 基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题. 1.程序风格良好(使用自定义注释模板) 2.列出表达式无重复. 二.具体代码 #include<iostream> #include<stdlib.h> #inclu

  • C语言实现纸牌游戏(小猫钓鱼)

    C语言使用队列和栈实现纸牌游戏–小猫钓鱼,供大家参考,具体内容如下 C语言: //纸牌游戏--小猫钓鱼--队列 栈--(所谓的拉火车) #include <stdio.h> struct queue //队列 { int data[1000]; int head; int tail; }; struct stack //栈 { int data[10]; int top; }; int main(void) { struct queue q1, q2; //小哼 q1 和小哈 q2 的队列 s

  • C语言实战之纸牌游戏

    目录 1. 基本要求 2. 运行界面 3. 代码解释  1. 基本要求 一副没有花牌(J.Q.K.A.大小王)的扑克牌,两个人进行纸牌游戏,其中一个人为用户,另一个人为计算机; 每轮每人各发5张牌,各自以这5张牌建立二叉排序树: 由用户先出,轮流出牌,每次只能出一张并且要比别人出的大,如:用户出3,计算机则要出比3大的牌,没有则选择不出: 最先出完的人获胜. 2. 运行界面 1. 首页面 2. 游戏说明 3. 开始游戏 4. 开始出牌 5. 游戏结束 3. 代码解释  #include<stdi

  • java实现24点纸牌游戏

    本文题目为大家分享了java实现24点纸牌游戏的具体代码,供大家参考,具体内容如下 题目 24点游戏是经典的纸牌益智游戏. 常见游戏规则: 从扑克中每次取出4张牌.使用加减乘除,第一个能得出24者为赢.(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏. 基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题. 分析 用穷举法列出四个数加上三个运算符号所构成的表达式所有

  • C语言实现五子棋小游戏

    首先我们先来看一个稍微简单些的实现方式: #include <stdio.h> #include <stdlib.h> #define N 15 int chessboard[N + 1][N + 1] = { 0 }; int whoseTurn = 0; void initGame(void); void printChessboard(void); void playChess(void); int judge(int, int); int main(void) { init

  • Android实战打飞机游戏之子弹生成与碰撞以及爆炸效果(5)

    Android实战打飞机游戏子弹生成,新建子弹类 public class Bullet { // 子弹图片资源 public Bitmap bmpBullet; // 子弹的坐标 public int bulletX, bulletY; // 子弹的速度 public int speed; // 子弹的种类以及常量 public int bulletType; // 主角的 public static final int BULLET_PLAYER = -1; // 鸭子的 public st

  • 基于C语言实现的扫雷游戏代码

    本文详细讲述了基于C语言实现的扫雷游戏代码,代码中备有比较详细的注释,便于读者阅读和理解.希望对学习游戏开发的朋友能有一点借鉴价值. 完整的实例代码如下: /* 模拟扫雷游戏 */ #include <graphics.h> #include <math.h> #include <stdio.h> #include <dos.h> #include <stdlib.h> #include <conio.h> #include <

  • C语言实现2048小游戏

    本文实例为大家分享了C语言实现2048小游戏的具体代码,供大家参考,具体内容如下 具有以下特点: 1.linux下完成 2.非堵塞键盘读取 3.随机生成2和4 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define TTY_PATH "/dev/tty" #define STTY_ON "stty raw -echo -F" #define STTY_O

  • C语言实现俄罗斯方块小游戏

    C语言实现俄罗斯方块小游戏的制作代码,具体内容如下 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define TTY_PATH "/dev/tty" #define STTY_ON "stty raw -echo -F" #define STTY_OFF "stty -raw echo -F" int map[21][14]; char

  • C语言实现三子棋游戏

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<stdlib.h> #include<time.h> void chess_board(char arr[3][3]) //打印棋盘 { int i = 0; int j = 0; for (i = 0; i < 3; i++) { printf( " %c | %c | %c \n", arr [i][0], a

  • C#编写控制台程序纸牌游戏

    本文实例为大家分享了C#编写纸牌游戏的具体代码,供大家参考,具体内容如下 using System; using System.Collections.Generic; using System.Text; using System.Threading; namespace ConsoleApplication2 { class Game { string[] str = new string[52]; int[] number = new int[52]; int i = 0; int[] a

随机推荐