转载请注明出处:http://blog.csdn.net/a512337862/article/details/74165085

最近,写一个简单的五子棋游戏,效果如下:

现在其实还算不上一个真正的游戏,因为只是实现了在同一设备上五子棋最基本的逻辑。下面简单介绍一下逻辑,仅供参考。

思路

1.五子棋游戏的基本逻辑:包括棋盘棋子的绘制,游戏胜利判断,重开游戏。
2.添加背景图片,游戏胜负信息,重开按钮等。

代码分析

FiveChessView

/*** Created by ZhangHao on 2017/6/27.* 五子棋 View*/public class FiveChessView extends View implements View.OnTouchListener {//画笔private Paint paint;//棋子数组private int[][] chessArray;//当前下棋顺序(默认白棋先下)private boolean isWhite = true;//游戏是否结束private boolean isGameOver = false;//bitmapprivate Bitmap whiteChess;private Bitmap blackChess;//Rectprivate Rect rect;//棋盘宽高private float len;//棋盘格数private int GRID_NUMBER = 10;//每格之间的距离private float preWidth;//边距private float offset;//回调private GameCallBack callBack;//当前黑白棋胜利次数private int whiteChessCount, blackChessCount;/*** 一些常量*///白棋public static final int WHITE_CHESS = 1;//黑棋public static final int BLACK_CHESS = 2;//白棋赢public static final int WHITE_WIN = 101;//黑棋赢public static final int BLACK_WIN = 102;//平局public static final int NO_WIN = 103;public FiveChessView(Context context) {this(context, null);}public FiveChessView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public FiveChessView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);//初始化Paintpaint = new Paint();//设置抗锯齿paint.setAntiAlias(true);paint.setColor(Color.BLACK);//初始化chessArraychessArray = new int[GRID_NUMBER][GRID_NUMBER];//初始化棋子图片bitmapwhiteChess = BitmapFactory.decodeResource(context.getResources(), R.drawable.white_chess);blackChess = BitmapFactory.decodeResource(context.getResources(), R.drawable.black_chess);//初始化胜利局数whiteChessCount = 0;blackChessCount = 0;//初始化Rectrect = new Rect();//设置点击监听setOnTouchListener(this);}/*** 重新测量宽高,确保宽高一样*/@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);//获取高宽值int width = MeasureSpec.getSize(widthMeasureSpec);int height = MeasureSpec.getSize(heightMeasureSpec);//获取宽高中较小的值int len = width > height ? height : width;//重新设置宽高setMeasuredDimension(len, len);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//棋盘为一个GRID_NUMBER*GRID_NUMBER的正方形,所有棋盘宽高必须一样len = getWidth() > getHeight() ? getHeight() : getWidth();preWidth = len / GRID_NUMBER;//边距offset = preWidth / 2;//棋盘线条for (int i = 0; i < GRID_NUMBER; i++) {float start = i * preWidth + offset;//横线canvas.drawLine(offset, start, len - offset, start, paint);//竖线canvas.drawLine(start, offset, start, len - offset, paint);}//绘制棋子for (int i = 0; i < GRID_NUMBER; i++) {for (int j = 0; j < GRID_NUMBER; j++) {//rect中点坐标float rectX = offset + i * preWidth;float rectY = offset + j * preWidth;//设置rect位置rect.set((int) (rectX - offset), (int) (rectY - offset),(int) (rectX + offset), (int) (rectY + offset));//遍历chessArrayswitch (chessArray[i][j]) {case WHITE_CHESS://绘制白棋canvas.drawBitmap(whiteChess, null, rect, paint);break;case BLACK_CHESS://绘制黑棋canvas.drawBitmap(blackChess, null, rect, paint);break;}}}}/*** 判断是否结束*/private void checkGameOver() {//获取落子的颜色(如果当前是白棋,则落子是黑棋)int chess = isWhite ? BLACK_CHESS : WHITE_CHESS;//棋盘是否填满boolean isFull = true;//遍历chessArrayfor (int i = 0; i < GRID_NUMBER; i++) {for (int j = 0; j < GRID_NUMBER; j++) {//判断棋盘是否填满if (chessArray[i][j] != BLACK_CHESS && chessArray[i][j] != WHITE_CHESS) {isFull = false;}//只需要判断落子是否五连即可if (chessArray[i][j] == chess) {//判断五子相连if (isFiveSame(i, j)) {//五子相连游戏结束isGameOver = true;if (callBack != null) {if (chess == WHITE_CHESS) {whiteChessCount++;} else {blackChessCount++;}callBack.GameOver(chess == WHITE_CHESS ? WHITE_WIN : BLACK_WIN);}return;}}}}//如果棋盘填满,平局结束if (isFull) {isGameOver = true;if (callBack != null) {callBack.GameOver(NO_WIN);}}}/*** 重置游戏*/public void resetGame() {isGameOver = false;//重置棋盘状态for (int i = 0; i < GRID_NUMBER; i++) {for (int j = 0; j < GRID_NUMBER; j++) {chessArray[i][j] = 0;}}//更新UIpostInvalidate();}/*** 判断是否存在五子相连** @return*/private boolean isFiveSame(int x, int y) {//判断横向if (x + 4 < GRID_NUMBER) {if (chessArray[x][y] == chessArray[x + 1][y] && chessArray[x][y] == chessArray[x + 2][y]&& chessArray[x][y] == chessArray[x + 3][y] && chessArray[x][y] == chessArray[x + 4][y]) {return true;}}//判断纵向if (y + 4 < GRID_NUMBER) {if (chessArray[x][y] == chessArray[x][y + 1] && chessArray[x][y] == chessArray[x][y + 2]&& chessArray[x][y] == chessArray[x][y + 3] && chessArray[x][y] == chessArray[x][y + 4]) {return true;}}//判断斜向(左上到右下)if (y + 4 < GRID_NUMBER && x + 4 < GRID_NUMBER) {if (chessArray[x][y] == chessArray[x + 1][y + 1] && chessArray[x][y] == chessArray[x + 2][y + 2]&& chessArray[x][y] == chessArray[x + 3][y + 3] && chessArray[x][y] == chessArray[x + 4][y + 4]) {return true;}}//判断斜向(左下到右上)if (y - 4 > 0 && x + 4 < GRID_NUMBER) {if (chessArray[x][y] == chessArray[x + 1][y - 1] && chessArray[x][y] == chessArray[x + 2][y - 2]&& chessArray[x][y] == chessArray[x + 3][y - 3] && chessArray[x][y] == chessArray[x + 4][y - 4]) {return true;}}return false;}@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:if (!isGameOver) {//获取按下时的位置float downX = event.getX();float downY = event.getY();//点击的位置在棋盘上if (downX >= offset / 2 && downX <= len - offset / 2&& downY >= offset / 2 && downY <= len - offset / 2) {//获取棋子对应的位置int x = (int) (downX / preWidth);int y = (int) (downY / preWidth);//判断当前位置是否已经有子if (chessArray[x][y] != WHITE_CHESS &&chessArray[x][y] != BLACK_CHESS) {//给数组赋值chessArray[x][y] = isWhite ? WHITE_CHESS : BLACK_CHESS;//修改当前执子isWhite = !isWhite;//更新棋盘postInvalidate();//判断是否结束checkGameOver();//回调当前执子if (callBack != null) {callBack.ChangeGamer(isWhite);}}}} else {Toast.makeText(mContext, "游戏已经结束,请重新开始!",Toast.LENGTH_SHORT).show();}break;}return false;}public void setCallBack(GameCallBack callBack) {this.callBack = callBack;}public int getWhiteChessCount() {return whiteChessCount;}public int getBlackChessCount() {return blackChessCount;}
}

FiveChessView主要实现五子棋游戏的基本逻辑,包括棋子绘制,游戏胜利判断,重开游戏等逻辑:

构造方法

FiveChessView构造方法主要是对一些参数的初始化:
1.int[][] chessArray来保存游戏的棋子信息,chessArray[x][y] = 0/1/2(0->无子,1->白棋,2->黑棋)表示在(x,y)点的棋子信息,并通过判断chessArray各个位置的棋子来判断胜利。
2.whiteChess,blackChess黑白棋子图片对应的Bitmap。
3.rect用来指定绘制的棋子的大小。
4.添加OnTouchListener

 public FiveChessView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);//初始化Paintpaint = new Paint();//设置抗锯齿paint.setAntiAlias(true);paint.setColor(Color.BLACK);//初始化chessArraychessArray = new int[GRID_NUMBER][GRID_NUMBER];//初始化棋子图片bitmapwhiteChess = BitmapFactory.decodeResource(context.getResources(), R.drawable.white_chess);blackChess = BitmapFactory.decodeResource(context.getResources(), R.drawable.black_chess);//初始化胜利局数whiteChessCount = 0;blackChessCount = 0;//初始化Rectrect = new Rect();//设置点击监听setOnTouchListener(this);}

onMeasure

因为五子棋棋盘是一个N*N的网格,必须确保FiveChessView的宽高一致,所以必须在onMeasure对宽高进行重绘。

/*** 重新测量宽高,确保宽高一样*/@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);//获取高宽值int width = MeasureSpec.getSize(widthMeasureSpec);int height = MeasureSpec.getSize(heightMeasureSpec);//获取宽高中较小的值int len = width > height ? height : width;//重新设置宽高setMeasuredDimension(len, len);}

onDraw

onDraw主要用来绘制棋盘网格线条和所有位置的棋子。

@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//棋盘为一个GRID_NUMBER*GRID_NUMBER的正方形,所有棋盘宽高必须一样len = getWidth() > getHeight() ? getHeight() : getWidth();preWidth = len / GRID_NUMBER;//边距offset = preWidth / 2;//棋盘线条for (int i = 0; i < GRID_NUMBER; i++) {float start = i * preWidth + offset;//横线canvas.drawLine(offset, start, len - offset, start, paint);//竖线canvas.drawLine(start, offset, start, len - offset, paint);}//绘制棋子for (int i = 0; i < GRID_NUMBER; i++) {for (int j = 0; j < GRID_NUMBER; j++) {//rect中点坐标float rectX = offset + i * preWidth;float rectY = offset + j * preWidth;//设置rect位置rect.set((int) (rectX - offset), (int) (rectY - offset),(int) (rectX + offset), (int) (rectY + offset));//遍历chessArrayswitch (chessArray[i][j]) {case WHITE_CHESS://绘制白棋canvas.drawBitmap(whiteChess, null, rect, paint);break;case BLACK_CHESS://绘制黑棋canvas.drawBitmap(blackChess, null, rect, paint);break;}}}}

isFiveSame

isFiveSame用于判断指定位置是否存在五子相连,因为在checkGameOver中从左到右,从上到下遍历,所以判断五子相连,只需要判断以下四种情况:
1.横向(从左到右)
2.纵向(从下往上)
3.斜向(左上到右下)
4.斜向(左下到右上)
其他的类似横向(从右往左)这种情况就可以无需判断了。

/*** 判断是否存在五子相连** @return*/private boolean isFiveSame(int x, int y) {//判断横向(从左到右)if (x + 4 < GRID_NUMBER) {if (chessArray[x][y] == chessArray[x + 1][y] && chessArray[x][y] == chessArray[x + 2][y]&& chessArray[x][y] == chessArray[x + 3][y] && chessArray[x][y] == chessArray[x + 4][y]) {return true;}}//判断纵向(从下往上)if (y + 4 < GRID_NUMBER) {if (chessArray[x][y] == chessArray[x][y + 1] && chessArray[x][y] == chessArray[x][y + 2]&& chessArray[x][y] == chessArray[x][y + 3] && chessArray[x][y] == chessArray[x][y + 4]) {return true;}}//判断斜向(左上到右下)if (y + 4 < GRID_NUMBER && x + 4 < GRID_NUMBER) {if (chessArray[x][y] == chessArray[x + 1][y + 1] && chessArray[x][y] == chessArray[x + 2][y + 2]&& chessArray[x][y] == chessArray[x + 3][y + 3] && chessArray[x][y] == chessArray[x + 4][y + 4]) {return true;}}//判断斜向(左下到右上)if (y - 4 > 0 && x + 4 < GRID_NUMBER) {if (chessArray[x][y] == chessArray[x + 1][y - 1] && chessArray[x][y] == chessArray[x + 2][y - 2]&& chessArray[x][y] == chessArray[x + 3][y - 3] && chessArray[x][y] == chessArray[x + 4][y - 4]) {return true;}}return false;}

checkGameOver

checkGameOver用于判断游戏是否结束,即是否存在五子相连或者平局的情况,如果游戏结束回调游戏结果。这里判断五子相连,是通过遍历chessArray判断是否存在落子的五子相连。平局则是遍历chessArray,判断是否存在空(chessArray[x][y] = 0)的情况,如果不存在则棋盘已满,平局。

/*** 判断是否结束*/private void checkGameOver() {//获取落子的颜色(如果当前是白棋,则落子是黑棋)int chess = isWhite ? BLACK_CHESS : WHITE_CHESS;//棋盘是否填满boolean isFull = true;//遍历chessArrayfor (int i = 0; i < GRID_NUMBER; i++) {for (int j = 0; j < GRID_NUMBER; j++) {//判断棋盘是否填满if (chessArray[i][j] != BLACK_CHESS && chessArray[i][j] != WHITE_CHESS) {isFull = false;}//只需要判断落子是否五连即可if (chessArray[i][j] == chess) {//判断五子相连if (isFiveSame(i, j)) {//五子相连游戏结束isGameOver = true;if (callBack != null) {if (chess == WHITE_CHESS) {whiteChessCount++;} else {blackChessCount++;}callBack.GameOver(chess == WHITE_CHESS ? WHITE_WIN : BLACK_WIN);}return;}}}}//如果棋盘填满,平局结束if (isFull) {isGameOver = true;if (callBack != null) {callBack.GameOver(NO_WIN);}}}

resetGame

这里没有太多的东西,就是重置游戏状态。

/*** 重置游戏*/public void resetGame() {isGameOver = false;//重置棋盘状态for (int i = 0; i < GRID_NUMBER; i++) {for (int j = 0; j < GRID_NUMBER; j++) {chessArray[i][j] = 0;}}//更新UIpostInvalidate();}

onTouch

onTouch通过点击位置实现落子功能。通过点击位置的坐标,来获取落子的位置,并判断当前位置是否已经有落子(chessArray[x][y] == 0 ?),落子后判断游戏是否结束并更新UI。游戏结束则无法落子。

@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:if (!isGameOver) {//获取按下时的位置float downX = event.getX();float downY = event.getY();//点击的位置在棋盘上if (downX >= offset / 2 && downX <= len - offset / 2&& downY >= offset / 2 && downY <= len - offset / 2) {//获取棋子对应的位置int x = (int) (downX / preWidth);int y = (int) (downY / preWidth);//判断当前位置是否已经有子if (chessArray[x][y] != WHITE_CHESS &&chessArray[x][y] != BLACK_CHESS) {//给数组赋值chessArray[x][y] = isWhite ? WHITE_CHESS : BLACK_CHESS;//修改当前执子isWhite = !isWhite;//更新棋盘postInvalidate();//判断是否结束checkGameOver();//回调当前执子if (callBack != null) {callBack.ChangeGamer(isWhite);}}}} else {Toast.makeText(mContext, "游戏已经结束,请重新开始!",Toast.LENGTH_SHORT).show();}break;}return false;}

GameCallBack

游戏回调

/*** Created by ZhangHao on 2017/6/27.* 游戏相关回调*/public interface GameCallBack {//游戏结束回调void GameOver(int winner);//游戏更换执子回调void ChangeGamer(boolean isWhite);
}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/back_ground"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@mipmap/bg"android:orientation="vertical"><!--游戏信息--><LinearLayout
        android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="10dp"android:orientation="horizontal"><!--白棋信息--><LinearLayout
            android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="2"android:orientation="vertical"><ImageView
                android:layout_width="20dp"android:layout_height="20dp"android:layout_gravity="center_horizontal"android:layout_marginTop="5dp"android:background="@drawable/white_chess"android:contentDescription="@null" /><TextView
                android:id="@+id/white_count_tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:layout_marginTop="10dp"android:text="0"android:textColor="#ffffff"android:textSize="16sp" /></LinearLayout><RelativeLayout
            android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"><ImageView
                android:id="@+id/current_gamer"android:layout_width="30dp"android:layout_height="30dp"android:layout_centerInParent="true"android:layout_marginTop="30dp"android:background="@mipmap/vs"android:contentDescription="@null" /></RelativeLayout><LinearLayout
            android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="2"android:orientation="vertical"><ImageView
                android:layout_width="20dp"android:layout_height="20dp"android:layout_gravity="center_horizontal"android:layout_marginTop="5dp"android:background="@drawable/black_chess"android:contentDescription="@null" /><TextView
                android:id="@+id/black_count_tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:layout_marginTop="10dp"android:text="0"android:textColor="#ffffff"android:textSize="16sp" /></LinearLayout></LinearLayout><!--游戏界面--><com.sona.udv.FiveChessView
        android:id="@+id/five_chess_view"android:layout_width="match_parent"android:layout_height="match_parent" /><!--重新开始--><RelativeLayout
        android:layout_width="match_parent"android:layout_height="match_parent"><ImageButton
            android:id="@+id/restart_game"android:layout_width="30dp"android:layout_height="30dp"android:layout_centerInParent="true"android:background="@mipmap/restart"android:contentDescription="@null"android:onClick="onClick" /></RelativeLayout>
</LinearLayout>

Activity

public class MainActivity extends AppCompatActivity implements GameCallBack {private FiveChessView fiveChessView;private TextView whiteWinTv,blackWinTv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);fiveChessView = (FiveChessView) findViewById(R.id.five_chess_view);fiveChessView.setCallBack(this);whiteWinTv = (TextView) findViewById(R.id.white_count_tv);blackWinTv = (TextView) findViewById(R.id.black_count_tv);}@Overridepublic void GameOver(int winner) {//更新游戏胜利局数updateWinInfo();switch (winner) {case FiveChessView.BLACK_WIN:showToast("黑棋胜利!");break;case FiveChessView.NO_WIN:showToast("平局!");break;case FiveChessView.WHITE_WIN:showToast("白棋胜利!");break;}}//更新游戏胜利局数private void updateWinInfo(){whiteWinTv.setText(fiveChessView.getWhiteChessCount()+" ");blackWinTv.setText(fiveChessView.getBlackChessCount()+" ");}@Overridepublic void ChangeGamer(boolean isWhite) {}private void showToast(String str) {Toast.makeText(this, str, Toast.LENGTH_SHORT).show();}public void onClick(View view) {switch (view.getId()) {case R.id.restart_game://重新开始游戏fiveChessView.resetGame();break;}}
}

Activity和布局文件,主要实现了一下功能:
1.添加背景图片
2.增加游戏信息(胜利局数)
3.游戏重开按钮
这里没什么特别需要注意的东西,布局或者背景其实也可以自己重新设置。

结语

1.因为文字功底有限,所以介绍性的文字不多,但是基本上每句代码都加了注释,理解起来应该不难,如果有任何问题,可以留言。
2.人机五子棋对战已经实现:http://blog.csdn.net/a512337862/article/details/76166049
3. Demo下载地址:http://download.csdn.net/detail/a512337862/9911855
4. Github:https://github.com/LuoChen-Hao/GameFiveChess

Android实现五子棋游戏(一) 游戏基本逻辑相关推荐

  1. android五子棋设计模板,基于android的五子棋游戏设计

    内容介绍 原文档由会员 hfnmb 发布 基于Android的五子棋游戏设计 软件工程 [摘 要]本论文主要阐述以面向对象的程序开发语言eclipse为开发工具, 基于智能手机Android之上设计一 ...

  2. java android 五子棋游戏_基于Android平台五子棋游戏最终版.doc

    基于Android平台五子棋游戏最终版 毕业设计(论文)任务书 毕业设计(论文)题目: 基于android平台的五子棋游戏的设计与实现 毕业设计(论文)要求及原始数据(资料): 1.综述国内基于and ...

  3. 基于安卓Android的五子棋游戏设计与实现

    下载地址 本论文主要阐述以面向对象的程序开发语言,Eclipse为开发工具, 基于智能手机Android系统之上设计的一个五子棋游戏.五子棋起源于中国古代的传统黑白棋种之一,它不仅能增强思维能力提高智 ...

  4. 基于android的五子棋游戏的设计——毕业论文.doc,基于Android的五子棋游戏的设计——毕业论文.doc.doc...

    基于Android的五子棋游戏的设计--毕业论文.doc 躁虐方慎养娇陇榷圣枚茵另裙弧懈舅愤拱玫叙未殆鸿嗽透凝彰枝句坯败醋求惦刑退馆罗拖膨清褐兔捻吮嘘唆鞋匆九若秃纽谓跃捡夺浇居汛纠耻生瘟欣糯弹贯住编却 ...

  5. 基于Android的五子棋设计与实现,毕业答辩-基于Android的五子棋游戏的设计与实现...

    ,基于安卓的五子棋游戏的设计与实现,本文中设计与开发实现的是一款基于安卓操作系统的五子棋游戏.Android作为当前智能手机市场的主要占有者,发展态势十分火热,截止2017年3月,在我国安卓市场份额达 ...

  6. 【Android 逆向】逆向修改游戏应用 ( 分析应用结构 | 定位动态库位置 | 定位动态库中的修改点 | 修改动态库 | 重打包 )

    文章目录 一.应用结构分析 二.定位动态库位置 三.定位动态库中的修改点 四.修改动态库 五.重打包 一.应用结构分析 分析上一篇博客 [Android 逆向]逆向修改游戏应用 ( APK 解析工具 ...

  7. android2048项目报告,Android项目开发实战-2048游戏

    <2048>是一款比较流行的数字游戏,最早于2014年3月20日发行.原版2048首先在GitHub上发布,原作者是Gabriele Cirulli,后被移植到各个平台.这款游戏是基于&l ...

  8. 使用Android studio开发一个数独游戏APP 系列第一讲

    数独是一种需要进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并且满足每一行.每一列.每一个粗线宫内的数字均含1-9,不能重复.随着各种报刊杂志刊登了数独游戏,也让越 ...

  9. android 开发游戏_Android游戏开发–基本游戏循环

    android 开发游戏 在到目前为止的系列之后,您将对游戏架构有所了解. 即使只是短暂的一次,但我们知道我们需要以某种形式进行输入,更新游戏的内部状态,最后将其渲染到屏幕上,并产生一些声音和/或振动 ...

  10. Android应用-猜数字小游戏

    描述: 猜数字游戏包含"猜数"."排行榜"和"设置" 3个模块. 1)"猜数"模块:随机生成一定范围内的一个整数,用户可 ...

最新文章

  1. 软件测试培训分享:软件测试的职业发展方向有哪些
  2. linux云自动化运维基础知识23(DNS服务)
  3. java 字符流与字节流区别_JAVA 字符流与字节流的区别
  4. bzoj 1572: [Usaco2009 Open]工作安排Job
  5. Linux/Ubuntu sudo不用输入密码的方法
  6. 神策数据入选《2020 爱分析·数据智能厂商全景报告》
  7. 实战|Python轻松实现动态网页爬虫(附详细源码)
  8. Visual C++ 设置适合自己的解决方案目录结构
  9. hdu 4794 FIb求循环节
  10. 玩客云服务器怎么卖,玩客云使用教程;低价NAS怎么打造;玩客云现在还值得入手吗?-聚超值...
  11. 黑马程序员————银行业务调度系统
  12. 转|函数零点问题考点透视
  13. xgboost的plot_importance绘图时出现的f0、f1、f2、f3、f4、f5等改为对应特征的字段名
  14. excel 第5讲:分类汇总与数据有效性
  15. Android - scheme 一个app跳转另一个app、模块开发
  16. 微信小程序云开发数据库操作
  17. 欲登千层楼,又何惧寒风
  18. 自己做网站要买服务器,自己做网站要买服务器
  19. Excel从身份证提取出生年月的几种方法
  20. 安卓手机变成横屏_学会用手机远程控制电脑,出门在外,随时随地也能轻松办公!...

热门文章

  1. c语言课程图书信息管理系统,c语言课程设图书信息管理系统.doc
  2. 直线电机模组的定位精度与原理方法-博扬智能
  3. 基于Spring Boo微信公众号授权登录获取用户信息(附带完整源码)
  4. viewport视口的概念
  5. 推荐计算机类英文ei源刊,2008EI英文刊源 计算机类 .doc
  6. 基于SaaS软件即服务模式的报表系统
  7. 河南科技学院计算机专业代码,商丘工学院代码_商丘工学院专业代码_2021商丘工学院招生代码,报考代码...
  8. oracle非聚簇索引,聚簇索引(Clustered Index)和非聚簇索引 (Non- Clustered Index)
  9. java btrace_Java调优—Btrace监控Java线程/方法执行参数、执行时间(Windows)
  10. Java学习----前端1