Android怎么实现数独游戏开发
发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,这篇"Android怎么实现数独游戏开发"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇
千家信息网最后更新 2025年01月21日Android怎么实现数独游戏开发
这篇"Android怎么实现数独游戏开发"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"Android怎么实现数独游戏开发"文章吧。
一、界面布局
1.主界面
2.数字键盘布局
3.游戏提示布局
二、游戏提示类
package com.dw.gamesuduku;import android.app.Activity;import android.os.Bundle;public class About extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.about); }}
三、逻辑实现1
package com.dw.gamesuduku;import android.app.Activity;import android.app.Dialog;import android.os.Bundle;import android.util.Log;import android.view.Gravity;import android.widget.Toast;public class Game extends Activity { private static final String TAG="Sudoku"; private static final String PREF_PUZZLE="puzzle"; protected static final int DIFFICULTY_CONTINUE=-1; public static final String KEY_DIFFICULTY="difficulty"; public static final int DIFFICULTY_EASY=0; public static final int DIFFICULTY_MEDIUM=1; public static final int DIFFICULTY_HARD=2; private int puzzle[]=new int[9*9]; private PuzzleView puzzleView; //三种游戏模式 private static final String easyPuzzle="360000000004230800000004200"+ "070460003820000014500013010"+ "001900000007048300000000045"; private static final String mediumPuzzle="650000070000506000014000005"+ "007009000002314700000700800"+ "500000630000201000030000097"; private static final String hardPuzzle="009000000080605020501078000"+ "000000700706040102004000000"+ "000720903090301080000000600"; private final int used[][][]=new int[9][9][]; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); Log.e(TAG, "onCreate"); int diff=getIntent().getIntExtra(KEY_DIFFICULTY, DIFFICULTY_EASY); puzzle=getPuzzle(diff); calculateUsedTiles(); puzzleView=new PuzzleView(this); setContentView(puzzleView); puzzleView.requestFocus(); //if the activity is restarted ,do a continue next time getIntent().putExtra(KEY_DIFFICULTY, DIFFICULTY_CONTINUE); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); Music.stop(this); //Save the current puzzle getPreferences(MODE_PRIVATE).edit().putString(PREF_PUZZLE, toPuzzleString(puzzle)).commit(); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); Music.play(this, R.raw.game); } protected int[] getUsedTiles(int x,int y){ return used[x][y]; } private void calculateUsedTiles() { // TODO Auto-generated method stub for (int x = 0; x < 9; x++) { for (int y = 0; y < 9; y++) { used[x][y]=calculateUsedTiles(x,y); } } } private int[] calculateUsedTiles(int x, int y) { // TODO Auto-generated method stub int c[]=new int[9]; //horizontal for(int i=0;i<9;i++){ if(i==y) continue; int t=getTitle(x, i); if(t!=0) c[t-1]=t; } //vertical for(int i=0;i<9;i++){ if(i==x) continue; int t=getTitle(i, y); if(t!=0) c[t-1]=t; } //same cell block int startx=(x/3)*3; int starty=(y/3)*3; for(int i=startx;i四、数字键盘
package com.dw.gamesuduku;import android.app.Dialog;import android.content.Context;import android.os.Bundle;import android.view.KeyEvent;import android.view.View;public class Keypad extends Dialog { protected static final String TAG="Sudoku"; private final View keys[]=new View[9]; private View keypad; private final int useds[]; private PuzzleView puzzleView; public Keypad(Context context,int useds[],PuzzleView puzzleView){ super(context); this.useds=useds; this.puzzleView=puzzleView; } @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.keypad); findViews(); for (int element : useds) { if(element!=0){ keys[element-1].setVisibility(View.INVISIBLE); } setListeners(); } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub int tile=0; switch (keyCode) { case KeyEvent.KEYCODE_0: case KeyEvent.KEYCODE_SPACE:tile=0;break; case KeyEvent.KEYCODE_1:tile=1;break; case KeyEvent.KEYCODE_2:tile=2;break; case KeyEvent.KEYCODE_3:tile=3;break; case KeyEvent.KEYCODE_4:tile=4;break; case KeyEvent.KEYCODE_5:tile=5;break; case KeyEvent.KEYCODE_6:tile=6;break; case KeyEvent.KEYCODE_7:tile=7;break; case KeyEvent.KEYCODE_8:tile=8;break; case KeyEvent.KEYCODE_9:tile=9;break; default: return super.onKeyDown(keyCode, event); } if(isValid(tile)){ returnResult(tile); } return true; } private boolean isValid(int tile) { // TODO Auto-generated method stub for (int t : useds) { if(tile==t) return false; } return true; } private void findViews() { // TODO Auto-generated method stub keypad=findViewById(R.id.keypad); keys[0]=findViewById(R.id.keypad_1); keys[1]=findViewById(R.id.keypad_2); keys[2]=findViewById(R.id.keypad_3); keys[3]=findViewById(R.id.keypad_4); keys[4]=findViewById(R.id.keypad_5); keys[5]=findViewById(R.id.keypad_6); keys[6]=findViewById(R.id.keypad_7); keys[7]=findViewById(R.id.keypad_8); keys[8]=findViewById(R.id.keypad_9); } private void setListeners(){ for(int i=0;i五、背景音乐
package com.dw.gamesuduku;import android.content.Context;import android.media.MediaPlayer;public class Music { private static MediaPlayer mp=null; //stop old song and start a new song public static void play(Context context,int resource){ stop(context); if(Settings.getMusic(context)){ mp=MediaPlayer.create(context, resource); mp.setLooping(true); mp.start(); } } //stop the music public static void stop(Context context) { // TODO Auto-generated method stub if(mp!=null){ mp.stop(); mp.release(); mp=null; } }}六、逻辑实现2
package com.dw.gamesuduku;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.Paint.FontMetrics;import android.graphics.Paint.Style;import android.graphics.Rect;import android.os.Bundle;import android.os.Parcelable;import android.util.Log;import android.view.KeyEvent;import android.view.MotionEvent;import android.view.View;import android.view.animation.AnimationUtils;@SuppressLint("DrawAllocation")public class PuzzleView extends View { private static final String TAG = "Sudoku"; private final Game game; private float width; private float height; private int selX; private int selY; private final Rect selRect = new Rect(); private static final String SELX="selX"; private static final String SELY="selY"; private static final String VIEW_STATE="viewState"; private static final int ID=42;//any positive int num public PuzzleView(Context context) { super(context); this.game = (Game) context; setFocusable(true); setFocusableInTouchMode(true); setId(ID); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { // TODO Auto-generated method stub width = w / 9f; height = h / 9f; getRect(selX, selY, selRect); Log.d(TAG, "onSizeChanged:width" + width + ",height" + height); super.onSizeChanged(w, h, oldw, oldh); } //实例状态保存在bundle中,保存当前游戏状态 @Override protected Parcelable onSaveInstanceState() { // TODO Auto-generated method stub Parcelable p=super.onSaveInstanceState(); Log.d(TAG, "onSavedInstanceState"); Bundle bundle=new Bundle(); bundle.putInt(SELX, selX); bundle.putInt(SELY, selY); bundle.putParcelable(VIEW_STATE, p); return bundle; } //恢复已经保存的信息 @Override protected void onRestoreInstanceState(Parcelable state) { // TODO Auto-generated method stub Log.d(TAG, "onRestoreInstanceState"); Bundle bundle=(Bundle) state; select(bundle.getInt(SELX),bundle.getInt(SELY)); super.onRestoreInstanceState(bundle.getParcelable(VIEW_STATE)); return; } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub // draw background Paint background = new Paint(); background.setColor(getResources().getColor(R.color.puzzle_background)); canvas.drawRect(0, 0, getWidth(), getHeight(), background); // draw board Paint dark = new Paint(); dark.setColor(getResources().getColor(R.color.puzzle_dark)); Paint hilite = new Paint(); hilite.setColor(getResources().getColor(R.color.puzzle_hilite)); Paint light = new Paint(); light.setColor(getResources().getColor(R.color.puzzle_light)); // draw minor grid lines for (int i = 0; i < 9; i++) { canvas.drawLine(0, i * height, getWidth(), i * height, light); canvas.drawLine(0, i * height + 1, getWidth(), i * height + 1, hilite); canvas.drawLine(i * width, 0, i * width, getHeight(), dark); canvas.drawLine(i * width + 1, 0, i * width + 1, getHeight(), hilite); } // draw major grid lines for (int i = 0; i < 9; i++) { if (i % 3 != 0) continue; canvas.drawLine(0, i * height, getWidth(), i * height, dark); canvas.drawLine(0, i * height + 1, getWidth(), i * height + 1, hilite); canvas.drawLine(i * width, 0, i * width, getHeight(), dark); canvas.drawLine(i * width + 1, 0, i * width + 1, getHeight(), hilite); } // draw numbers Paint foreground = new Paint(Paint.ANTI_ALIAS_FLAG); foreground.setColor(getResources().getColor(R.color.puzzle_foregroud)); foreground.setStyle(Style.FILL); foreground.setTextSize(height * 0.75f); foreground.setTextScaleX(width / height); foreground.setTextAlign(Paint.Align.CENTER); // draw num in the center of the tile FontMetrics fm = foreground.getFontMetrics(); float x = width / 2; float y = height / 2 - (fm.ascent + fm.descent) / 2; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { canvas.drawText(this.game.getTitleString(i, j), i * width + x, j * height + y, foreground); } } // draw the selection Log.e(TAG, "selRect=" + selRect); Paint selected = new Paint(); selected.setColor(getResources().getColor(R.color.puzzle_selected)); canvas.drawRect(selRect, selected); //draw the hints pick a hint color based on moves left //根据每个单元格可填的数目给出不同颜色的提示 if(Settings.getHints(getContext())){ Paint hint=new Paint(); int c[]={getResources().getColor(R.color.puzzle_hint_0), getResources().getColor(R.color.puzzle_hint_1), getResources().getColor(R.color.puzzle_hint_2),}; Rect r=new Rect(); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { int movesleft=9-game.getUsedTiles(i, j).length; if(movesleft七、游戏设置
package com.dw.gamesuduku;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.preference.PreferenceFragment;import android.preference.PreferenceManager;public class Settings extends Activity { private static final String OPT_MUSIC="music"; private static final boolean OPT_MUSIC_DEF=true; private static final String OPT_HINTS="hints"; private static final boolean OPT_HINTS_DEF=true; @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); getFragmentManager().beginTransaction().replace(android.R.id.content, new PrefsFragement()).commit(); } public static class PrefsFragement extends PreferenceFragment{ public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.settings); } } //get the current music option public static boolean getMusic(Context context){ return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(OPT_MUSIC,OPT_MUSIC_DEF); } //get the current music option public static boolean getHints(Context context){ return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(OPT_HINTS,OPT_HINTS_DEF); }}八、游戏入口
package com.dw.gamesuduku;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.Menu;import android.view.MenuInflater;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;public class Sudoku extends Activity implements OnClickListener { private static final String TAG = "Sudoku"; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); View continueButton = this.findViewById(R.id.continue_button); continueButton.setOnClickListener(this); View newButton = this.findViewById(R.id.new_button); newButton.setOnClickListener(this); View aboutButton = this.findViewById(R.id.about_button); aboutButton.setOnClickListener(this); View exitButton = this.findViewById(R.id.exit_button); exitButton.setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.continue_button: startGame(Game.DIFFICULTY_CONTINUE); case R.id.about_button: Intent i = new Intent(this, About.class); startActivity(i); break; case R.id.new_button: openNewGameDialog(); break; case R.id.exit_button: finish(); break; } } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); Music.play(this, R.raw.welcome); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); Music.stop(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { // TODO Auto-generated method stub super.onCreateOptionsMenu(menu); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub switch (item.getItemId()) { case R.id.settings: startActivity(new Intent(this, Settings.class)); return true; } return false; } private void openNewGameDialog() { // TODO Auto-generated method stub new AlertDialog.Builder(this).setTitle(R.string.new_game_title) .setItems(R.array.difficulty, new DialogInterface.OnClickListener() { @Override public void onClick( DialogInterface dialoginterface, int i) { // TODO Auto-generated method stub startGame(i); } }).show(); } protected void startGame(int i) { // TODO Auto-generated method stub Log.i(TAG, "clicked on"+i); Intent intent=new Intent(Sudoku.this,Game.class); intent.putExtra(Game.KEY_DIFFICULTY, i); startActivity(intent); }}以上就是关于"Android怎么实现数独游戏开发"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。
内容
开发
区域
布局
键盘
提示
选择
数字
文章
状态
界面
知识
篇文章
逻辑
j++
不同
价值
信息
入口
再次
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
岳阳软件开发公司电话
惠山区加工软件开发市场价格
数据库建设任务书
代理服务器配置搭建
软件开发报价问题
17年网络安全考试题
衡水有容软件开发有限公司
office做一个简单的数据库
别克音乐软件找不到服务器
php数据库转换
网络安全法多久进行检测评估
总是显示服务器异常
网络安全是一个啥行业
后台数据库连接
网络安全技术节点
油卡网络技术有限公司
计算机三级网络技术协议
富士通对日软件开发
数据库系统工程师下午真题及答案
华宇软件开发转正率
哪有软件开发定制
server u 服务器
综改示范区软件开发公司
数据库若要得到著作权法的保护
网络安全中学生剧本
成都市高新区软件开发比赛
科创板网络安全龙头
软件开发还是服务外包
杭州略成网络技术有限公司
数据库中session