<html> <head> <meta charset="utf-8"> <style type="text/css"> .haha { border-width: 2; font-size: 50; font-weight: bold; color: white; text-align: center; color: white; background-color: black; } .form { position: fixed; } </style> </head> <h4 id='de'></h4> <div class='form'> <input type="number" name="quantity" min="1" max="5" value="3" id='xsize'> <input type="number" name="quantity" min="1" max="5" value="3" id='ysize'> <button onclick="newGame()">提交</button> </div> <table align='center' id="table"> </table> <script> var xsize = 3, ysize = 3; var size = xsize * ysize; var a = new Array(size); var spaceX, spaceY; var table=document.getElementById("table") newGame(); function newGame() { xsize=document.getElementById('xsize').value; ysize=document.getElementById("ysize").value; size = xsize * ysize; a = new Array(size); clear(); shuffle(); init(); draw(); } onkeydown = keyDown; function print(s) { document.getElementById('de').innerHTML = s; } function clear() { for (var i = 0; i < size - 1; i++) a[i] = i + 1; a[size - 1] = 0; spaceX = xsize - 1; spaceY = ysize - 1; } function shuffle() { for (var i = 0; i < 100; i++) { var x, y; do { x = Math.floor(Math.random() * (size - 1)); y = Math.floor(Math.random() * (size - 1)); } while (x == y); var temp = a[x]; a[x] = a[y]; a[y] = temp; } } function keyDown(e) { var x = spaceX, y = spaceY; switch (e.keyCode) { case 37: y++; break; case 38: x++; break; case 39: y--; break; case 40: x--; break; } if (x >= 0 && y >= 0 && x < xsize && y < ysize) { var temp = a[x * ysize + y]; a[x * ysize + y] = a[spaceX * ysize + spaceY]; a[spaceX * ysize + spaceY] = temp; spaceX = x; spaceY = y; draw(); if (over()) { confirm('you win!'); clear(); shuffle(); draw(); } } } function over() { for (var i = 0; i < size - 1; i++) { if (a[i] != i + 1) return false; } return true; } function draw() { for (var i = 0; i < size; i++) { var img = document.getElementById('pic' + i); img.innerHTML = (a[i] == 0 ? "" : a[i]); } } function init() { var w = document.documentElement.clientHeight * 0.95 / xsize; var h = document.documentElement.clientWidth * 0.95 / ysize; w = h = Math.min(w, h); var html=""; for (var i = 0; i < xsize; i++) { html+="<tr>"; for (var j = 0; j < ysize; j++) { html+="<td width=" + Math.floor(w) + " height=" + Math.floor(h) + " class='haha' id=pic" + (i * ysize + j) + "></td>"; } html+="</tr>"; } table.innerHTML=html; } </script> <html>
==========================java版拼图游戏==============
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Font; import java.awt.Graphics; import java.awt.Image; import java.awt.MenuBar; import java.awt.Rectangle; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import javax.swing.*; import java.util.Random; import javax.swing.*; public class Pintu extends JFrame { public static void main(String []args) { new Pintu(); } int[][] a = new int[4][4]; int x, y; void init() { for (int i = 0; i < 4; i++) for (int j = 0; j < 4; j++) a[i][j] = i * 4 + j; x=y=3; } Pintu() { setTitle("拼图游戏-made by weidiao.neu"); setSize(600,600); addKeyListener(listenKey); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); init(); shuffle(); } @Override public void paint(Graphics g) { Container pane=getContentPane(); BufferedImage bit=new BufferedImage(pane.getWidth(),pane.getHeight(),BufferedImage.TYPE_INT_ARGB); Graphics gg=bit.getGraphics(); gg.setColor(Color.BLUE); gg.fillRect(0, 0, bit.getWidth(), bit.getHeight()); for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ if(a[i][j]==15)continue; gg.drawImage(getPic(a[i][j]), j*pane.getWidth()/4, i*pane.getHeight()/4, pane.getWidth()/4-1, pane.getHeight()/4-1, null); } } pane.getGraphics().drawImage(bit, 0, 0, null); } private BufferedImage getPic(int i) { BufferedImage bit; Font font=new Font("Consolas",Font.BOLD,50); Rectangle2D rec= getFontMetrics(font).getStringBounds(i+"", getGraphics()); bit=new BufferedImage((int)rec.getWidth(),(int)rec.getHeight(),BufferedImage.TYPE_INT_ARGB); Graphics gg=bit.getGraphics(); gg.setColor(Color.BLACK); gg.fillRect(0, 0, bit.getWidth(), bit.getHeight()); gg.setFont(font); gg.setColor(Color.RED); gg.drawString(i+"",0, getFontMetrics(font).getAscent()); return bit; } private void shuffle() { Random r=new Random(); for(int i=0;i<100;i++){ int p=r.nextInt(15); int q=r.nextInt(15); if(p==q){ i--; } else{ int temp=a[p/4][p%4]; a[p/4][p%4]=a[q/4][q%4]; a[q/4][q%4]=temp; } } } KeyListener listenKey = new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_UP: if (x == 3) return; else { int temp = a[x][y]; a[x][y] = a[x + 1][y]; a[x + 1][y] = temp; x++; } break; case KeyEvent.VK_DOWN: if (x == 0) return; else { int temp = a[x][y]; a[x][y] = a[x - 1][y]; a[x - 1][y] = temp; x--; } break; case KeyEvent.VK_RIGHT: if (y == 0) return; else { int temp = a[x][y]; a[x][y] = a[x][y - 1]; a[x][y - 1] = temp; y--; } break; case KeyEvent.VK_LEFT: if (y == 3) return; else { int temp = a[x][y]; a[x][y] = a[x][y + 1]; a[x][y + 1] = temp; y++; } break; } repaint(); if(checkWin()){ JOptionPane.showMessageDialog(Pintu.this, "You win"); init(); shuffle(); repaint(); } } private boolean checkWin() { // TODO Auto-generated method stub for(int i=0;i<4;i++) for(int j=0;j<4;j++) if(a[i][j]!=i*4+j) return false; return true; } }; }
=================android版======================================
本程序没有用到图片资源。
package weidiao.pintu; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Point; import android.os.Bundle; import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.view.SurfaceView; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.LinearLayout; import android.widget.Toast; import java.util.ArrayList; import java.util.Random; public class MainActivity extends Activity { class MyView extends View { public MyView(Context context) { super(context); init(); shuffle(); initPaint(); } final int width = 4, height = 6; int a[][] = new int[width][height]; Point last; Point space; int d[] = {-1, 0, 0, -1, 1, 0, 0, 1}; Paint fill, stroke; @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { last = new Point((int) event.getX(), (int) event.getY()); } else if (event.getAction() == MotionEvent.ACTION_UP) { double dx = event.getX() - last.x, dy = event.getY() - last.y; double the = Math.atan2(dy, dx); if (the < 0) the += Math.PI * 2; int min = 0; for (int i = 1; i < 4; i++) { if (Math.abs(the - min * Math.PI / 2) > Math.abs(the - i * Math.PI / 2)) { min = i; } } if (move(min)) { if (isWin()) { Toast.makeText(getContext(), "you win!", Toast.LENGTH_LONG).show(); init(); shuffle(); } postInvalidate(); } } return true; } void initPaint() { fill = new Paint(); fill.setColor(Color.BLACK); fill.setStyle(Paint.Style.FILL); stroke = new Paint(); stroke.setTextSize(60); stroke.setStrokeWidth(3); stroke.setStyle(Paint.Style.STROKE); stroke.setColor(Color.WHITE); } void init() { for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { a[i][j] =j* width + i+1; } } a[width-1][height-1]=0; space = new Point(width-1, height-1); } boolean move(int dir) { int x = space.x + d[dir << 1], y = space.y + d[dir << 1 | 1]; if (x < 0 || x >= width || y < 0 || y >= height) return false; a[space.x][space.y] = a[x][y]; a[x][y] = 0; space = new Point(x, y); return true; } void shuffle() { Random r = new Random(); for (int i = 0; i < 100; i++) { move(r.nextInt(4)); } } boolean isWin() { int all = width * height; for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { if (a[i][j] != (j*width+i+1) % all) { return false; } } } return true; } @Override protected void onDraw(Canvas canvas) { float w = Math.min(getWidth() / width, getHeight() / height); for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { canvas.drawRect(i * w + 2, j * w + 2, i * w + w - 2, j * w + w - 2, fill); if (a[i][j] > 0) canvas.drawText(a[i][j] + "", i * w + 102, j * w + 102, stroke); } } } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new MyView(this)); } }