Android 사용자 정의 View 게임 구현
1.전체 가로 좌표 와 세로 좌표 의 9 칸 에 1-9 의 숫자 만 채 울 수 있 고 중복 되 지 않 습 니 다.
2.현재 3*3 칸 에 1-9 숫자 를 입력 하고 중복 되 지 않 음
일단 효과 도 를 보 여 드릴 게 요.
프로젝트 아이디어
1.UI 표시:이 건 GameView 클래스 에 넣 습 니 다.
원본 데이터 보이 기
사용자 가 작성 한 데 이 터 를 표시 합 니 다.
사용자 가 현재 클릭 한 위 치 를 표시 합 니 다.
후보 영역 데이터 보이 기
2.논리 처리:이것 은 Matrix 류 에 넣 은 것 입 니 다.
원본 데이터:게임 이 시 작 될 때 만들어 야 합 니 다.
현재 데이터:사용자 가 작성 한 실시 간 데이터
데이터 판단:이 위 치 를 판단 하면 데 이 터 를 수정 할 수 있 습 니까?예 를 들 어 원시 데 이 터 는 수정 할 수 없다.
이 위 치 를 판단 할 때 채 울 수 있 는 데이터,예 를 들 어 원시 데이터 라 는 위 치 는 8 이면 8 을 채 울 수 없다.
코드 GameView 클래스
public class GameView extends View {
private int PhoneWidth; //
private int mGridWidth; //
private int[] mFalseNumber; //
private Paint mLinePaint; //
private Paint mDarkPaint; //
private Paint mOptDarkPaint; //
private Paint numberPaint; //
private Paint changePaint; //
private Paint mOptPaint; //
private Matrix M; //
private float tCX;
private float tCY;
private int mOptBoard;
private int mOptNumber;
public GameView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
public GameView(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public GameView(Context context) {
super(context);
initView();
}
private void initView() {
PhoneWidth = getResources().getDisplayMetrics().widthPixels;
mGridWidth = (PhoneWidth - 40) / 9;
tCX = mGridWidth / 2;
tCY = tCX - tCX / 2;
mFalseNumber = new int[9];
for (int i = 0; i < 9; i++) {
mFalseNumber[i] = i;
}
M = new Matrix();
initPaint();
invalidate();
}
private void initPaint() {
mLinePaint = new Paint();
mLinePaint.setColor(Color.WHITE);
mLinePaint.setStyle(Paint.Style.STROKE);
mLinePaint.setStrokeWidth(2f);
mDarkPaint = new Paint();
mDarkPaint.setColor(Color.parseColor("#52E7CD"));
mDarkPaint.setStyle(Paint.Style.FILL);
numberPaint = new Paint();
numberPaint.setColor(Color.WHITE);
numberPaint.setTextSize(mGridWidth * 0.65f);
numberPaint.setTextAlign(Paint.Align.CENTER);
numberPaint.setShadowLayer(10F, -5F, 8F, Color.parseColor("#999999"));
numberPaint.setAntiAlias(true);
mOptPaint = new Paint();
mOptPaint.setColor(Color.WHITE);
mOptPaint.setTextSize(mGridWidth * 0.65f+15);
mOptPaint.setTextAlign(Paint.Align.CENTER);
mOptPaint.setShadowLayer(10F, -5F, 8F, Color.parseColor("#999999"));
mOptPaint.setAntiAlias(true);
changePaint = new Paint();
changePaint.setColor(Color.parseColor("#FCA454"));
changePaint.setTextSize(mGridWidth * 0.65f);
changePaint.setTextAlign(Paint.Align.CENTER);
changePaint.setShadowLayer(10F, -5F, 8F, Color.parseColor("#999999"));
changePaint.setAntiAlias(true);
mOptDarkPaint = new Paint();
mOptDarkPaint.setColor(Color.parseColor("#52E76E"));
mOptDarkPaint.setStyle(Paint.Style.FILL);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(PhoneWidth, PhoneWidth + mGridWidth+20);
}
@Override
protected void onDraw(Canvas canvas) {
drawBoard(canvas);
int x = mOptBoard / 9;
int y = mOptBoard % 9;
//
canvas.drawRect(x * mGridWidth+22, y * mGridWidth+22, x * mGridWidth+20 + mGridWidth, y * mGridWidth+20 + mGridWidth, mOptDarkPaint);
//
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
int cutData = M.getCutData(i, j);
if (M.getOnClicked(i,j) && cutData>0) {
canvas.drawText(Integer.toString(cutData), i * mGridWidth + tCX+20, j*mGridWidth + mGridWidth - tCY+20, changePaint);
}
}
}
//
drawTrueText(canvas);
}
private void drawTrueText(Canvas canvas) {
float startY = PhoneWidth + 30;
//
canvas.drawLine(50, startY, PhoneWidth-50, startY, mLinePaint);
canvas.drawLine(10, startY + mGridWidth - 40, PhoneWidth-10, startY + mGridWidth-40, mLinePaint);
canvas.drawLine(50, startY, 10, startY + mGridWidth - 40, mLinePaint);
canvas.drawLine(PhoneWidth-50, startY, PhoneWidth-10, startY + mGridWidth-40, mLinePaint);
float y = (mGridWidth - 30)/2.0f;
for (int i = 0; i < 9; i++) {
if (mFalseNumber[i] == 0) {
canvas.drawText(Integer.toString(i+1), i * mGridWidth + tCX+ 20, startY + (mGridWidth - tCY) - y, mOptPaint);
}
}
}
private void drawBoard(Canvas canvas) {
//
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
int x = i / 3;
int y = j / 3;
if ((x == 0 || x == 2) && (y == 0 || y == 2)) {
canvas.drawRect(mGridWidth * j + 20, 20 + mGridWidth * i,
mGridWidth * j + 20 + mGridWidth, 20 + mGridWidth
* i + mGridWidth, mDarkPaint);
} else if (y == 1 && x == 1) {
canvas.drawRect(mGridWidth * j + 20, 20 + mGridWidth * i,
mGridWidth * j + 20 + mGridWidth, 20 + mGridWidth
* i + mGridWidth, mDarkPaint);
}
}
}
//
for (int i = 0; i < 10; i++) {
canvas.drawLine(20, mGridWidth * i + 1 + 20, 9 * mGridWidth + 20,
mGridWidth * i + 1 + 20, mLinePaint);
canvas.drawLine(mGridWidth * i + 1 + 20, 0 + 20, mGridWidth * i + 1
+ 20, 9 * mGridWidth + 20, mLinePaint);
}
//
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (!M.getOnClicked(i, j)) {
canvas.drawText(M.getText(i, j), i * mGridWidth +20+tCX, mGridWidth * j + 20+mGridWidth-tCY, numberPaint);
}
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() != MotionEvent.ACTION_DOWN) {
return super.onTouchEvent(event);
}
if (event.getX()<20 || event.getY()<20 || event.getX()>PhoneWidth-20) {
Log.e("123", " ");
return super.onTouchEvent(event);
}
int choX = (int) ((event.getX()-20) / mGridWidth);
int choY = (int) ((event.getY()-20) / mGridWidth);
Log.i("game ", "optX "+choX+" optY "+choY);
if (event.getY() < PhoneWidth-20) { //
if (M.getOnClicked(choX, choY)) {
mFalseNumber = new int[9];
int[] trueData = M.getFalseData(choY, choX);
mOptBoard = choX * 9 + choY;
for (int i : trueData) {
mFalseNumber[i - 1] = 1;
}
}
} else { //
Log.e("game ","opt Number " + choX + 1);
System.out.println(Arrays.toString(mFalseNumber));
if (mFalseNumber[choX] == 0) {
mOptNumber = choX;
int x = mOptBoard / 9;
int y = mOptBoard % 9;
M.setCutData(x, y, mOptNumber+1);
}
}
invalidate();
return true;
}
//
public void play() {
initView();
}
//
public void repeat(){
M.initCutData();
invalidate();
}
코드 매트릭스 클래스
public class Matrix {
private int [][]mData ; //
private int [][]mCutData; //
public Matrix() {
int i = (int)(Math.random()*5);
switch (i) {
case 1:
mData = GAMEDATA1;
break;
case 2:
mData = GAMEDATA2;
break;
case 3:
mData = GAMEDATA3;
break;
case 4:
mData = GAMEDATA4;
break;
case 0:
mData = GAMEDATA2;
break;
}
initCutData();
Log.e("Matrix", "random :"+i);
}
/** */
public String getText(int x, int y){
String index = mData[x][y]+"";
if ("0".equals(index)) {
index = "";
}
return index;
}
/** */
public boolean getOnClicked(int x, int y){
if (mData[x][y] == 0) {
return true;
}
return false;
}
/** */
public int[] getFalseData(int x, int y){
Set<Integer> set = new TreeSet<Integer>();
// X
for (int i = 0; i < 9; i++) {
int d = mData[y][i];
if (d!=0) {
set.add(d);
// LogUtils.e("x: "+d);
}
}
// y
for (int i = 0; i < 9; i++) {
int d = mData[i][x];
if (d!=0) {
set.add(d);
// LogUtils.e("Y: "+d);
}
}
// 3*3
x = x/3*3;
y = y/3*3;
// LogUtils.e(" x "+x+" Y "+y);
for (int i = x; i < x+3; i++) {
for (int j = y; j < y+3; j++) {
int d = mData[j][i];
if (d!=0) {
set.add(d);
// LogUtils.e("i "+i+"j "+j+" xy: "+d);
}
}
}
Integer[] arr2 = set.toArray(new Integer[0]);
// ; Integer int ;
int[] result = new int[arr2.length];
for (int i = 0; i < result.length; i++) {
result[i] = arr2[i];
}
System.out.println("false Number : "+Arrays.toString(result));
return result;
}
/** */
public void initCutData(){
mCutData = new int[9][9];
for (int i = 0; i < mData.length; i++) {
for (int j = 0; j < mData[i].length; j++) {
mCutData[i][j] = mData[i][j];
}
}
for (int i = 0; i < mCutData.length; i++) {
System.out.println(Arrays.toString(mCutData[i]));
}
}
public void setCutData(int x, int y, int data){
if (getOnClicked(x, y)) {
mCutData[x][y] = data;
}
}
public int getCutData(int x, int y){
return mCutData[x][y];
}
}
코드 MainActivity 클래스
public class MainActivity extends Activity {
private GameView gV;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gV = (GameView) findViewById(R.id.game);
}
public void rePay(View v){
gV.repeat();
}
public void newPay(View v){
gV.play();
}
acitivity_main.xml 파일
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#0EC5A5"
android:orientation="vertical" >
<TextView
android:layout_width="match_parent"
android:layout_height="52dp"
android:layout_marginTop="10dp"
android:gravity="center"
android:text="SUDOKU"
android:textColor="@android:color/white"
android:textSize="30sp" />
<com.xuan.sudokugame.GameView
android:id="@+id/game"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="60dp"
android:padding="10dp"
android:orientation="horizontal" >
<Button
android:layout_width="0dp"
android:onClick="rePay"
android:layout_height="match_parent"
android:layout_weight="1"
android:layout_marginRight="10dp"
android:text=" "
android:textColor="@android:color/white"
android:background="@drawable/radius_border_gray"/>
<Button
android:onClick="newPay"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text=" "
android:textColor="@android:color/white"
android:background="@drawable/radius_border_gray"/>
</LinearLayout>
</LinearLayout>
그리고 운행 하기 시작 하면 이렇다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.