Java课程设计写错了益智游戏让写人机取火柴小游戏结果我不知道然后写了2048这个益智游戏不过好歹老师松口说也可以用。
代码一:窗口主界面代码这个很好理解就是最初写的时候不知道有这么个形式,以为是要用框架来写出窗口,不过还好java右JFrame这个接口可以显示窗体就很方便。
public class Game2048 {
public static JFrame gameFrame;//窗口
public static void main(String[] args) {
//显示窗体
gameFrame = new JFrame();
//大小名字
gameFrame.setSize(370,400);
gameFrame.setTitle("2048小游戏");
gameFrame.setLocationRelativeTo(null);//居中
//面板内容
gameFrame.add(new GamePanel());
//显示
gameFrame.setVisible(true);
}
}
代码二:这是这个代码核心功能,因为玩2048这个游戏只有四个简单操作,而写的时候我发现四个操作也要思考很多,比如向上移动,第一排不能移动,还要考虑卡片上的数字是不是0,非0则移动,0则返回。其次考虑合并相同数字,采用方法递归,而在递归方法里面又设计到如何为0,如何领卡片数字翻倍且上移。在写的时候上移动最好写,再写下左右时还经常写出数组越界,因为没有考虑好移动的范围与判断式。
//向上
public void moveUpCard(){
for (int i=1;i<4;i++){
for (int j=0;j<4;j++){
Card card=allcards[i][j];
if(card.num!=0){
card.moveUp(allcards);
}
}
}
}
//
public void moveUp(Card[][] allcards){
if(this.i==0){
return;
}
Card preCard=allcards[i-1][j];//上一个卡片
//赋值之后卡片变成0
if(preCard.num==0){
preCard.num=this.num;
this.num=0;
preCard.moveUp(allcards);
}else if(preCard.num==this.num && !preCard.hebing){//合并数字
preCard.hebing = true;
preCard.num *= 2;
this.num = 0;
}
代码三:这是代码的监听与操作方式WASD与↑↓←→,加一个打印则可以看出自己刚才的执行步骤。重点是每执行一次操作要刷新卡片还是采用方法的调用。
Game2048.gameFrame.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
for (int i = 0; i <4; i++) {
for (int j = 0; j < 4; j++) {
Card card =allcards[i][j];
card.hebing = false;
}
}
int code =e.getKeyCode();
switch (code){
case KeyEvent.VK_UP:
case KeyEvent.VK_W:
moveUpCard();
System.out.println("上");
break;
case KeyEvent.VK_DOWN:
case KeyEvent.VK_S:
System.out.println("下");
moveDownCard();
break;
case KeyEvent.VK_LEFT:
case KeyEvent.VK_A:
System.out.println("左");
moveLeftCard();
break;
case KeyEvent.VK_RIGHT:
case KeyEvent.VK_D:
System.out.println("右");
moveRightCrad();
break;
}
//创建卡片
createNewCard();
//刷新
repaint();
//游戏结束
isgameOver();
}
@Override
public void keyReleased(KeyEvent e) {
}
});
}
最后整个代码块分为三个一个是Card类,一个是GamePenel类,一个是Game2048主类
Game2048主类
public class Game2048 {
public static JFrame gameFrame;//窗口
public static void main(String[] args) {
//显示窗体
gameFrame = new JFrame();
//大小名字
gameFrame.setSize(370,400);
gameFrame.setTitle("2048小游戏");
gameFrame.setLocationRelativeTo(null);//居中
//面板内容
gameFrame.add(new GamePanel());
//显示
gameFrame.setVisible(true);
}
}
GamePenel类
//面板设计(开始)
public class GamePanel extends JPanel {
Random rand=new Random();
//卡片4*4
Card[][] allcards=new Card[4][4];
//初始化界面
public GamePanel() {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
Card card = new Card(i, j);
allcards[i][j] = card;
}
}
createNewCard();
//游戏操作(监听操作)
Game2048.gameFrame.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
for (int i = 0; i <4; i++) {
for (int j = 0; j < 4; j++) {
Card card =allcards[i][j];
card.hebing = false;
}
}
int code =e.getKeyCode();
switch (code){
case KeyEvent.VK_UP:
case KeyEvent.VK_W:
moveUpCard();
System.out.println("上");
break;
case KeyEvent.VK_DOWN:
case KeyEvent.VK_S:
System.out.println("下");
moveDownCard();
break;
case KeyEvent.VK_LEFT:
case KeyEvent.VK_A:
System.out.println("左");
moveLeftCard();
break;
case KeyEvent.VK_RIGHT:
case KeyEvent.VK_D:
System.out.println("右");
moveRightCrad();
break;
}
//创建卡片
createNewCard();
//刷新
repaint();
//游戏结束
isgameOver();
}
@Override
public void keyReleased(KeyEvent e) {
}
});
}
//判断游戏结束
private void isgameOver() {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4 ; j++) {
if(allcards[i][j].num == 2048){//其中有个数字是2048
JOptionPane.showMessageDialog(null,"赢了!","恭喜",JOptionPane.WARNING_MESSAGE);
return;
}else if(isFull()){//位置满了
JOptionPane.showMessageDialog(null,"游戏结束!","很遗憾",JOptionPane.WARNING_MESSAGE);
return;
}
}
}
}
//判断格子满不满
private boolean isFull() {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if(allcards[i][j].num == 0){
return false;
}
}
}
return true;
}
//向上
public void moveUpCard(){
for (int i=1;i<4;i++){
for (int j=0;j<4;j++){
Card card=allcards[i][j];
if(card.num!=0){
card.moveUp(allcards);
}
}
}
}
//向下
public void moveDownCard(){
for (int i=2;i>=0;i--){
for (int j=0;j<4;j++){
Card card=allcards[i][j];
if(card.num!=0){
card.moveDown(allcards);
}
}
}
}
//向左
public void moveLeftCard(){
for (int i=0;i<4;i++){
for (int j=1;j<4;j++){
Card card=allcards[i][j];
if(card.num!=0){
card.moveLeft(allcards);
}
}
}
}
//向右
public void moveRightCrad(){
for (int i=0;i<4;i++){
for (int j=2;j>=0;j--){
Card card=allcards[i][j];
if(card.num!=0){
card.moveRight(allcards);
}
}
}
}
//随机生成数字
public void createNewCard(){
//数字生成
int num;
int id=rand.nextInt(5);
if(id==4||id==3){
num=4;
}
else {num=2;}
Card card= randCrad();
card.num=num;
}
//卡片生在空位置
public Card randCrad(){
int j=rand.nextInt(4);
int i=rand.nextInt(4);
Card card =allcards[i][j];
if(card.num==0){
return card;
}
else{//!=0
return randCrad();
}
}
//绘图
public void paint(Graphics graphics) {
super.paint(graphics);
//16个卡片位置
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
Card card = allcards[i][j];
//卡片设计
graphics.setColor(getColor(card.num));//颜色
graphics.fillRect(card.x, card.y, 80, 80);//尺寸
if(card.num!=0){
//设置卡片上的数字颜色大小
graphics.setColor(new Color(125,78,51));
graphics.setFont(new Font("宋体",Font.BOLD,35));
//数字坐标
//字符长度决定数字位置在中央
int x=card.x;
if(card.num<10){
x=x+32;
} else if(card.num<100){
x=x+20;
} else if(card.num<1000){
x=x+8;
} else{
x=x+2;
}
int y=card.y+50;
graphics.drawString(card.num+"",x,y);}
}
}
}
//num决定颜色
public Color getColor(int num) {
Color color ;
switch (num) {
case 0:
color = new Color(92, 151, 117);
break;
case 2:
color = new Color(242, 230, 56);
break;
case 4:
color = new Color(55, 236, 130);
break;
case 8:
color = new Color(174, 213, 130);
break;
case 16:
color = new Color(142, 201, 75);
break;
case 32:
color = new Color(111, 148, 48);
break;
case 64:
color = new Color(76, 174, 124);
break;
case 128:
color = new Color(60, 182, 144);
break;
case 256:
color = new Color(45, 130, 120);
break;
case 512:
color = new Color(9, 97, 26);
break;
case 1024:
color = new Color(242, 177, 121);
break;
case 2048:
color = new Color(223, 185, 0);
break;
default:
color=null;
}
return color;
}
}
Card类
//卡片设计
public class Card {
int x,y;//坐标
int num;//显示数字
int i,j;//数组下标
boolean hebing = false;//判断合并
public Card(int i, int j) {
this.i = i;
this.j = j;
//卡片位置
this.x=5+80*j+5*(j+1);
this.y=5+80*i+5*(i+1);
}
//上
public void moveUp(Card[][] allcards){
if(this.i==0){
return;
}
Card preCard=allcards[i-1][j];//上一个卡片
//赋值之后卡片变成0
if(preCard.num==0){
preCard.num=this.num;
this.num=0;
preCard.moveUp(allcards);
}else if(preCard.num==this.num && !preCard.hebing){//合并数字
preCard.hebing = true;
preCard.num *= 2;
this.num = 0;
}
}
//下
public void moveDown(Card[][] allcards){
if(this.i==3){
return;
}
Card downCard = allcards[i+1][j];
if(downCard.num == 0){//把数字移动
downCard.num = this.num;
this.num = 0;
downCard.moveDown(allcards);
}else if(downCard.num==this.num && !downCard.hebing){//合并数字
downCard.hebing = true;
downCard.num *= 2;
this.num = 0;
}
}
//左
public void moveLeft(Card[][] allcards){
if(this.j==0){
return;
}
//左边的卡片
Card leftCard = allcards[i][j-1];
if(leftCard.num == 0){//把数字移动上去
leftCard.num = this.num;
this.num = 0;
leftCard.moveLeft(allcards);
}else if(leftCard.num==this.num && !leftCard.hebing){//合并数字
leftCard.hebing = true;
leftCard.num *= 2;
this.num = 0;
}
}
//右
public void moveRight(Card[][] allcards) {
if (this.j == 3) {
return;
}
Card rightCard = allcards[i][j + 1];
if (rightCard.num == 0) {//把数字移动上去
rightCard.num = this.num;
this.num = 0;
rightCard.moveRight(allcards);
} else if (rightCard.num == this.num && !rightCard.hebing) {//合并数字
rightCard.hebing = true;
rightCard.num *= 2;
this.num = 0;
}
}}