首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java实现简易21点比大小游戏。(玩家VS电脑)

Java实现简易21点比大小游戏。(玩家VS电脑)

作者头像
百思不得小赵
发布于 2022-12-01 06:09:47
发布于 2022-12-01 06:09:47
83100
代码可运行
举报
文章被收录于专栏:小赵Java总结小赵Java总结
运行总次数:0
代码可运行

一、游戏背景

参赛人数:2人 准备用具:一副扑克 规则: 扑克牌A,2,3,4,5,6,7,8,9,10,J,Q,K分别代表数字1,2,3,4,5,6,7,8,9,10,11,12,13. 每人轮流取扑克牌,目的是凑成“和”为21点,谁先凑成21谁就胜利。如果没有人凑到21点,就规定最接近21点且小于21点的一方为胜者,每人均可要数次牌,需要注意的是,如果点数和超出21点,就是爆掉了(输了)

二、功能实现

本次游戏的实现一共分为三各类。 分别为:Play(玩家类) 、Poker:(扑克类) 以及RunGame(主游戏界面类)。

Play(玩家类) :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.Arrays;

public class Play {

	private String name;
	private Poker[] pokers;
	
	public Play() {}
	
	public Play(String name) {
		super();
		this.name=name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Poker[] getPokers() {
		return pokers;
	}
	public void setPoker(Poker[] pokers) {
		this.pokers=pokers;
	}
	
	
	
	@Override
	public String toString() {
		String info="[暗牌,";
		for (int i = 0; i < pokers.length; i++) {
			info+=pokers[i].toString();
			if(i!=pokers.length-1) {
				info+=",";
			}
		}
		return this.name+"\n"+
			info+"]";
	}

	public String getInfo() {
		return this.name+":\n"+
				Arrays.toString(this.pokers);
	}
	/**
	 * 计算点数
	 */
	public int getPointers() {
		int pointers=0;
		int countA=0;
		for(Poker poker:pokers) {
			//判断是否为A
			if(poker.getNumber()==1) {
				pointers+=11;
				countA++;
			}else if(poker.getNumber()>10) {
				pointers+=10;
			}else {
				pointers+=poker.getNumber();
			}
		}
		//判断总点数是否大于21,如果是则减去含有A个数的10
		if(pointers>21) {
			pointers-=countA*10;
		}
		return pointers;
	}
	
	/**
	 * 收牌
	 */
	void getPoker(Poker poker) {
		if(this.pokers==null) {
			this.pokers=new Poker[1];
		}else {
			//新建数组
			Poker[] newArray=new Poker[pokers.length+1];
			//将原有牌赋予新数组
			for (int i = 0; i < pokers.length; i++) {
				newArray[i]=pokers[i];
			}
			//让扑克数组,指向新数组
			pokers=newArray;
		}
		//将新牌赋予最后一个数组位置
		pokers[pokers.length-1]=poker;
	}
}

Poker:(扑克类)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Poker implements Comparable {
	    //花色四种:0-3
	    private int type;
	    //点数:1-13
	    private int number;

	    public Poker() {}

	    public Poker(int type, int number) {
	        this.type = 0;
	        this.number = 1;
	        if (type < 0 || type > 3 || this.number < 1 || this.number > 13) {
	            return;
	        }
	        this.type = type;
	        this.number = number;
	    }

	    public int getType() {
			return type;
		}

		public void setType(int type) {
			this.type = type;
		}

		public int getNumber() {
			return number;
		}

		public void setNumber(int number) {
			this.number = number;
		}

		@Override
	    public String toString() {
	        String[] types = {"♠", "♥", "♣", "♦"};
	        String[] pointers = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
	        return types[this.type] + pointers[this.number-1];
	    }

		@Override
		public int compareTo(Object o) {
			if(o==null) {
				return -1;
			}
			if(!(o instanceof Poker)) {
				return -1;
			}
			if(Math.random()>=0.5) {
				return 1;
			}
			return -1;
		}
		
	}

RunGame(主游戏界面类)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.Arrays;
import javax.swing.JOptionPane;


public class RunGame {
	//玩家
	private static Play mine;
	//电脑
	private static Play computer;
	//扑克
	private static Poker[] pokers;
	// 当前可以发牌的位置
	private static int pokersIndex = 0;
	// 计算机要牌的上限
	private static int LIMIT_POINTER = 10;

	public static void main(String[] args) {
		// 初始化游戏
		initGame();
		// 显示界面
		viewGame();
	}

	/**
	 * 显示界面
	 */
	private static void viewGame() {
		boolean flage=true;
		while(flage) {
			   String info="---------------21点游戏-----------------\n"+
						computer+"\n"+mine.getInfo()+"\n"+"1\t要牌\t2.停牌";
				
				String input=JOptionPane.showInputDialog(info);
				if(input==null||input.trim().isEmpty()) {
					JOptionPane.showMessageDialog(null, "请正确输入");
					continue;
				}
				switch(input.trim().charAt(0)){
				case '1':
					//自己要牌
					mine.getPoker(pokers[pokersIndex++]);
					//电脑要牌
					if(computer.getPointers()<LIMIT_POINTER) {
						computer.getPoker(pokers[pokersIndex++]);
					}
					break;
				case '2':
					//电脑判断是否需要牌
					while(computer.getPointers()<LIMIT_POINTER) {
						computer.getPoker(pokers[pokersIndex++]);
					}
					//判断输赢
					boolean isWin=true;
					if(computer.getPointers()==21) {
						//判断谁是 black jack 谁赢,如果都是 black jack 则电脑赢。
						isWin=false;
					}else if(mine.getPointers()>21) {
						isWin=false;
					}else if(computer.getPointers() < 21) {
						isWin=mine.getPointers()>computer.getPointers();
					}
					//比较点数,提示结果
					info="---------你"+(isWin?"赢了":"输了")+"--------------------\n"+
							computer.getInfo()+" :"+computer.getPointers()+"\n"+
							mine.getInfo()+" :"+mine.getPointers()+"点";
					JOptionPane.showMessageDialog(null, info);
					//结束游戏
					flage=false;
					break;
				default:
					JOptionPane.showMessageDialog(null, "请正确输入");
					continue;
				}
			}	
	}

	/**
	 * 初始化游戏
	 */
	private static void initGame() {
		// 构建一副扑克并且洗牌
		initPokers();
		// 输入玩家姓名
		String playerName = JOptionPane.showInputDialog("请输入你的名字");
		if (playerName == null || playerName.trim().isEmpty()) {
			playerName = "匿名";
		}
		mine = new Play(playerName);
		// 建立电脑玩家
		computer = new Play("高进");

		// 初始化,每人发两张牌
		computer.getPoker(pokers[pokersIndex++]);
		mine.getPoker(pokers[pokersIndex++]);
		computer.getPoker(pokers[pokersIndex++]);
		mine.getPoker(pokers[pokersIndex++]);
	}

	/**
	 * 构建一副扑克并且洗牌
	 */
	private static void initPokers() {
		 pokers = new Poker[52];
		// 循环花色
		for (int i = 0; i < 4; i++) {
			// 循环点数
			for (int j = 1; j < 14; j++) {
				int index = i * 13 + j - 1;
				pokers[index] = new Poker(i, j);
			}
		}
		// 洗牌
		/*for (int i = 0; i < 36; i++) {
			int posi1 = (int) (Math.random() * 52);
			int posi2 = (int) (Math.random() * 52);
			swap(pokers, posi1, posi2);
		}*/	
		//利用Comparable接口实现洗牌
		Arrays.sort(pokers);
	}

	private static void swap(Poker[] pokers, int posi1, int posi2) {
		Poker temp = pokers[posi1];
		pokers[posi1] = pokers[posi2];
		pokers[posi2] = temp;
	}

}

三、效果展示

1.首先需要输入玩家的名字,如果不输入就会以“匿名”的身份进行游戏。

2.玩家选择是否继续要牌,如果要则输入1,如果停牌则输入2。这里如果玩家选择停牌的话,电脑会进行判断是否继续要牌

四、总结

本次实现的21点小游戏,主要使用Swing组件以及面向对象的思想,游戏本身涉及的技术点不是很多,但是通过这一点一滴小的练习,可以提高自己对以后更深层次学习的兴趣,也是对动手能力的锻炼,继续加油,然后秃见成效!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java实现扫雷小游戏二
分析当前方格(x,y)周围方格的坐标:设 x 和 y的最大值分别为 X 和 Y :
XG.孤梦
2022/05/27
4.3K0
Java实现扫雷小游戏二
斗地主小游戏
一,斗地主代码 一,今天来分享一个斗地主的的代码。老样子我们先上运行结果,或者大家可以去这个演示效果。 二,是不是看到颜色效果就感觉很不错啊,大家也不要急,斗地主的代码块在下面,请大家自行观看!!! <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>海拥 | 开心斗地主</title> <link rel="shortc
海曈
2022/11/14
5K0
斗地主小游戏
通过与C++程序对比,彻底搞清楚JAVA的对象拷贝
JAVA编程中的对象一般都是通过new进行创建的,新创建的对象通常是初始化的状态,但当这个对象某些属性产生变更,且要求用一个对象副本来保存当前对象的“状态”,这时候就需要用到对象拷贝的功能,以便封装对象之间的快速克隆。
智慧zhuhuix
2020/08/14
3940
通过与C++程序对比,彻底搞清楚JAVA的对象拷贝
判断四张扑克牌能否凑成24点游戏算法
一道编程题大概意思是:有一副扑克牌,去掉大小王,还剩52张牌,J Q K代表11,12,13。现在随机抽取四张牌,每张牌必须得用到并且每张牌只能用一次,用+ - * / () 看能否实现最后结果可以等于24,例如:输入4 5 6 7 ,输出yes,输入 1 1 2 6 输出yes,输入 1 1 1 1,输出no 现在我的想法是: 1、随机抽取两个数 2、将这两个数进行+ - * / 运算,然后把这个数放到新的数组,将以前的去掉,现在数组就是3个数 3、将然后再回到1,进行递归运算,直到n=1 4、当n=1时,判断结果是否为24,是返回true,否返回false
红目香薰
2022/11/29
2700
扑克牌例题与Collections工具类
我们需要创建四个类,一个封装对象的属性,一个封装牌的花色和大小也就是牌的类型,一个实现发牌,排序,洗牌功能,也就是封装对象的行为,最后一个实现图形化界面。
端碗吹水
2020/09/23
3290
用斗地主的实例学会使用java Collections工具类
最近在学习数据结构和算法的过程中频繁用到了Collections工具类,这是开发中的一把利器,简化了许多涉及集合的编码,该文将通过实例对此工具类进入深入剖析。
智慧zhuhuix
2020/08/14
7371
用斗地主的实例学会使用java Collections工具类
Java---俄罗斯方块小游戏
去年就已经学了这个技术了,一直没去写,现在抽个时间写了个俄罗斯方块游戏。 只有简单的新游戏,暂停,继续,积分功能。简单的实现了俄罗斯的经典功能。 不介绍了,有兴趣的自己运行一下,后面贴出了图片。
谙忆
2021/01/21
8860
Java---俄罗斯方块小游戏
小游戏——金庸奇侠传(JAVA,对面向对象的进一步了解)
金庸群侠传 游戏运行界面: 游戏实现源码: 1 package game.logic; 2 //人类 3 public class Person { 4 public String name;
泰斗贤若如
2019/06/18
6950
《Java从入门到失业》第四章:类和对象(4.3):一个完整的例子带你深入类和对象
       到此为止,我们基本掌握了类和对象的基础知识,并且还学会了String类的基本使用,下面我想用一个实际的小例子,逐步来讨论类和对象的一些其他知识点。
用户7801119
2020/09/27
1.1K0
用Java实现天天酷跑(附源码),这个真的有点强了!
闯关类游戏,玩家登录后,选择进入游戏,通过键盘控制玩家的上下左右移动,来躲避 障碍物和吃金币,玩家躲避的障碍物越多跑酷距离越远,玩家吃的金币越多,得分越高。
JAVA葵花宝典
2021/01/04
2.3K0
用Java实现天天酷跑(附源码),这个真的有点强了!
使用python轻松实现21点小游戏
先来了解一下21点游戏,其实21点是一种流行的纸牌游戏,玩家的目标是使手中的牌总点数尽可能接近21点,但不能超过21点。玩家和电脑轮流抽取牌,可以选择继续抽牌或停止。游戏的策略在于判断何时继续抽牌以及何时停止,以使得自己的点数最接近21点,同时又不超过。本文将使用Python编写一个简单的21点小游戏,让你可以在终端中体验这个有趣的游戏。
三掌柜
2024/03/19
8210
使用python轻松实现21点小游戏
Java制作一款扫雷游戏(含有源码)
GeekLiHua
2025/01/21
1490
Java制作一款扫雷游戏(含有源码)
java简易小游戏[通俗易懂]
游戏思路:设置人物移动,游戏规则,积分系统,随机移动的怪物,游戏胜负判定,定时器。
全栈程序员站长
2022/09/14
3.1K0
java简易小游戏[通俗易懂]
小型酒店管理系统毕业论文_简易酒店管理系统
编写程序 模拟酒店管理系统 : 预订和退订以及查看所有房间 1 需要有一个酒店类 2 需要有一个房间类 3 需要有一个客户端类
全栈程序员站长
2022/11/08
4700
JAVA零基础小白学习免费教程day14-Set&HashMap
java.util.Set接口和java.util.List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了。与List接口不同的是,Set接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。
张哥编程
2024/12/13
1130
【day20】集合深入探讨
按照斗地主的规则,完成洗牌发牌的动作。具体规则:使用54张牌打乱顺序,三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。
程序员波特
2024/12/30
790
【day20】集合深入探讨
FlyBird(飞翔的小鸟)Java小游戏
《flappy bird》是一款由来自越南的独立游戏开发者Dong Nguyen所开发的作品,游戏于2013年5月24日上线,并在2014年2月突然暴红。2014年2月,《Flappy Bird》被开发者本人从苹果及谷歌应用商店(Google Play)撤下。2014年8月份正式回归App Store,正式加入Flappy迷们期待已久的多人对战模式。游戏中玩家必须控制一只小鸟,跨越由各种不同长度水管所组成的障碍。
GeekLiHua
2025/01/21
2450
FlyBird(飞翔的小鸟)Java小游戏
那些年我们用Java写过的小游戏 --- 快速击键系统
训练技能点 面向对象设计的思想 使用类图理解类的关系 类的封装 构造方法的使用 this、static关键字的使用 需求概述 根据输入速率和正确率将玩家分为不同级别 级别越高,一次显示的字符数越多,玩
房上的猫
2018/03/14
1.8K1
那些年我们用Java写过的小游戏 --- 快速击键系统
大一Java课设,五子棋小游戏
该程序是基于Java的GUI图形界面,实现的双人版五子棋小游戏。该程序拥有简洁美观的图形化界面,且界面主要由棋盘、标题和游戏操作的按钮三部分组成。
全栈程序员站长
2022/09/14
2.3K0
Java实现扫雷小游戏一
程序写到这里很多地方都需要要到图片以及雷区行列数等,故定义工具类定义好一些可能在程序中多次用到且后期会改变的资源或者变量。见工具类Tools
XG.孤梦
2022/05/27
1.3K0
Java实现扫雷小游戏一
推荐阅读
相关推荐
Java实现扫雷小游戏二
更多 >
LV.1
这个人很懒,什么都没有留下~
交个朋友
加入腾讯云技术交流站
洞悉AI新动向 Get大咖技术交流群
加入云原生工作实战群
云原生落地实践 技术难题攻坚探讨
加入HAI高性能应用服务器交流群
探索HAI应用新境界 共享实践心得
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验