如何用python制作五子棋游戏代码python

package com.zhdf.
import java.util.ArrayL
import java.util.L
import android.content.C
import android.graphics.B
import android.graphics.BitmapF
import android.graphics.C
import android.graphics.P
import android.graphics.P
import android.os.B
import android.os.P
import android.util.AttributeS
import android.view.MotionE
import android.view.V
import android.widget.T
public class wuziqiPanle extends View {
private int mPanleW// 棋盘的宽度的宽度
private float mLineH// 棋盘线与线之间的间隔
private int MAN_LINE = 12; // 棋盘的最大线数
private int MAX_IN_LINE = 5;
private Paint paint = new Paint();
private Bitmap mWhiteP
private Bitmap mBlackP
// 设置白棋为先手
private Boolean mIsWhite =
// 定义白子坐标的集合
private ArrayList&Point& mWhiteArray = new ArrayList&Point&();
// 定义黑子坐标的集合
private ArrayList&Point& mBlackeArray = new ArrayList&Point&();
// 棋子的大小设置为横高的3/4,这样棋子之间就会有横高的1/4的间隙
private float radioPieceOfLineHeight = 3 * 1.0f / 4;
private Boolean mIsGameOver =
private Boolean mIsWhiteW
public wuziqiPanle(Context context, AttributeSet attrs) {
super(context, attrs);
// setBackgroundColor(0x44ff0000);
// paint初始化操作
private void init() {
paint.setColor(0x);
paint.setAntiAlias(true);// (抗锯齿功能)使得图像边缘相对清晰一点,锯齿痕迹不那么明显
paint.setDither(true);// (防抖动功能)绘制的时候使得图像颜色相对柔和
paint.setStyle(Paint.Style.STROKE);
mWhitePiece = BitmapFactory.decodeResource(getResources(),
R.drawable.stone_w2);
mBlackPiece = BitmapFactory.decodeResource(getResources(),
R.drawable.stone_b1);
* onMeasure测量view 的大小详细测量值 ( measureSpec) 需要两样东西来确定它,那就是大小(size)和模式(mode)
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightize = MeasureSpec.getSize(heightMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int width = Math.min(widthSize, heightize);
* UNSPECIFIED *父不没有对子施加任何约束,子可以是任意大小(也就是未指定)
* (UNSPECIFIED在源码中的处理和EXACTLY一样。
* 当View的宽高值设置为0的时候或者没有设置宽高时,模式为UNSPECIFIED
if (widthMode == MeasureSpec.UNSPECIFIED) {
} else if (heightMode == MeasureSpec.UNSPECIFIED) {
width = widthM
setMeasuredDimension(width, width);
* 当view布局发生变化的时候调用此方法,重新绘制布局
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mPanleWidth =
mLineHeight = mPanleWidth * 1.0f / MAN_LINE;
// 更改棋子图片的尺寸大小
int pieceWidth = (int) (mLineHeight * radioPieceOfLineHeight);
mWhitePiece = Bitmap.createScaledBitmap(mWhitePiece, pieceWidth,
pieceWidth, false);
mBlackPiece = Bitmap.createScaledBitmap(mBlackPiece, pieceWidth,
pieceWidth, false);
public boolean onTouchEvent(MotionEvent event) {
if (mIsGameOver)
int action = event.getAction();
if (action == MotionEvent.ACTION_UP) {
int x = (int) event.getX();
int y = (int) event.getY();
Point p = getValiPoint(x, y);
if (mWhiteArray.contains(p) || mBlackeArray.contains(p)) {
if (mIsWhite) {
mWhiteArray.add(p);
mBlackeArray.add(p);
invalidate();
mIsWhite = !mIsW
// 意思是在该项目中该事件交给View处理
// 得到的是点击棋盘上线与线之间的交叉点的坐标,这样能够保证同样一个坐标不会重复放棋子
private Point getValiPoint(int x, int y) {
return new Point((int) (x / mLineHeight), (int) (y / mLineHeight));
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
drawBoard(canvas);// 绘制棋盘
drawPiece(canvas);// 绘制棋子
checkGameOver();// 检查游戏是否结束
private void checkGameOver() {
boolean whiteWin = cheackFiveInLine(mWhiteArray);
boolean blackWin = cheackFiveInLine(mBlackeArray);
if (whiteWin || blackWin) {
mIsGameOver =
mIsWhiteWinner = whiteW
// 判断是白棋胜还是黑棋胜利 mIsWhiteWinner?&白棋胜利&:&黑棋胜利&
String text = mIsWhiteWinner ? &白棋胜利& : &黑棋胜利&;
Toast.makeText(getContext(), text, Toast.LENGTH_SHORT).show();
private boolean cheackFiveInLine(List&Point& points) {
for (Point p : points) {
int x = p.x;
int y = p.y;
boolean win = checkHorizontal(x, y, points);
win = checkVertical(x, y, points);
win = checkLeftDiagonal(x, y, points);
win = checkRightDiagonal(x, y, points);
* 判断x,y位置的棋子,是否横向有相邻的五个一致。
* @param x
* @param y
* @param points
private boolean checkHorizontal(int x, int y, List&Point& points) {
int count = 1;
// 左边相同颜色棋子数的统计
for (int i = 1; i & MAX_IN_LINE; i++) {
if (points.contains(new Point(x - i, y))) {
count++;
if (count == MAX_IN_LINE)
// 右边相同颜色棋子数的统计
for (int i = 1; i & MAX_IN_LINE; i++) {
if (points.contains(new Point(x + i, y))) {
count++;
if (count == MAX_IN_LINE)
* 判断x,y位置的棋子,是否纵向有相邻的五个一致。
* @param x
* @param y
* @param points
private boolean checkVertical(int x, int y, List&Point& points) {
int count = 1;
// 左边相同颜色棋子数的统计
for (int i = 1; i & MAX_IN_LINE; i++) {
if (points.contains(new Point(x, y - i))) {
count++;
if (count == MAX_IN_LINE)
// 右边相同颜色棋子数的统计
for (int i = 1; i & MAX_IN_LINE; i++) {
if (points.contains(new Point(x, y + i))) {
count++;
if (count == MAX_IN_LINE)
* 判断x,y位置的棋子,是否左斜有相邻的五个一致。
* @param x
* @param y
* @param points
private boolean checkLeftDiagonal(int x, int y, List&Point& points) {
int count = 1;
// 左边相同颜色棋子数的统计
for (int i = 1; i & MAX_IN_LINE; i++) {
if (points.contains(new Point(x - i, y + i))) {
count++;
if (count == MAX_IN_LINE)
// 右边相同颜色棋子数的统计
for (int i = 1; i & MAX_IN_LINE; i++) {
if (points.contains(new Point(x + i, y - i))) {
count++;
if (count == MAX_IN_LINE)
* 判断x,y位置的棋子,是否右斜有相邻的五个一致。
* @param x
* @param y
* @param points
private boolean checkRightDiagonal(int x, int y, List&Point& points) {
int count = 1;
// 左边相同颜色棋子数的统计
for (int i = 1; i & MAX_IN_LINE; i++) {
if (points.contains(new Point(x - i, y - i))) {
count++;
if (count == MAX_IN_LINE)
// 右边相同颜色棋子数的统计
for (int i = 1; i & MAX_IN_LINE; i++) {
if (points.contains(new Point(x + i, y + i))) {
count++;
if (count == MAX_IN_LINE)
private void drawPiece(Canvas canvas) {
for (int i = 0, n = mWhiteArray.size(); i & i++) {
Point whitePoint = mWhiteArray.get(i);
canvas.drawBitmap(mWhitePiece,
(whitePoint.x + (1 - radioPieceOfLineHeight) / 2)
* mLineHeight,
(whitePoint.y + (1 - radioPieceOfLineHeight) / 2)
* mLineHeight, null);
for (int i = 0, n = mBlackeArray.size(); i & i++) {
Point blackPoint = mBlackeArray.get(i);
canvas.drawBitmap(mBlackPiece,
(blackPoint.x + (1 - radioPieceOfLineHeight) / 2)
* mLineHeight,
(blackPoint.y + (1 - radioPieceOfLineHeight) / 2)
* mLineHeight, null);
// 绘制棋盘
private void drawBoard(Canvas canvas) {
int w = mPanleW
float lineWidth = mLineH
for (int i = 0; i & MAN_LINE; i++) {
int startX = (int) (lineWidth / 2);
int endX = (int) (w - lineWidth / 2);
int y = (int) ((0.5 + i) * lineWidth);
// 棋盘横线的绘制
canvas.drawLine(startX, y, endX, y, paint);
* 棋盘纵线的绘制 y为起点的横坐标,startX为起点的纵坐标 endX为纵坐标
canvas.drawLine(y, startX, y, endX, paint);
public void start()
mWhiteArray.clear();
mBlackeArray.clear();
mIsGameOver =
mIsWhiteWinner =
invalidate();
private static final String INSTANCE = &instance&;
private static final String INSTANCE_GAME_OVER = &instance_game_over&;
private static final String INSTANCE_WHITE_ARRAY = &instance_white_array&;
private static final String INSTANCE_BLACK_ARRAY = &instance_black_array&;
protected Parcelable onSaveInstanceState() {
Bundle bundle = new Bundle();
bundle.putParcelable(INSTANCE, super.onSaveInstanceState());
bundle.putBoolean(INSTANCE_GAME_OVER, mIsGameOver);
bundle.putParcelableArrayList(INSTANCE_WHITE_ARRAY, mWhiteArray);
bundle.putParcelableArrayList(INSTANCE_BLACK_ARRAY, mBlackeArray);
protected void onRestoreInstanceState(Parcelable state) {
if (state instanceof Bundle) {
Bundle bundle = (Bundle)
mIsGameOver = bundle.getParcelable(INSTANCE_GAME_OVER);
mWhiteArray = bundle.getParcelableArrayList(INSTANCE_WHITE_ARRAY);
mBlackeArray = bundle.getParcelableArrayList(INSTANCE_BLACK_ARRAY);
super.onRestoreInstanceState(bundle.getParcelable(INSTANCE));
super.onRestoreInstanceState(state);
主函数部分
package com.zhdf.
import android.os.B
import android.view.M
import android.view.MenuI
import android.app.A
public class Wuziqi extends Activity {
private wuziqiP
& & @Override
& & protected void onCreate(Bundle savedInstanceState) {
& & & & super.onCreate(savedInstanceState);
& & & & setContentView(R.layout.activity_wuziqi);
& & & & wuziqipanle = (wuziqiPanle) findViewById(R.id.wuziqi);
& & @Override
& & public boolean onCreateOptionsMenu(Menu menu) {
& & getMenuInflater().inflate(R.menu.wuziqi, menu);
& & @Override
& & public boolean onOptionsItemSelected(MenuItem item) {
& & int id = item.getItemId();
& & if (id == R.id.action_settings) {
& & wuziqipanle.start();
& & if (id == R.id.action_exit) {
& & return super.onOptionsItemSelected(item);
本文已收录于以下专栏:
相关文章推荐
package cn.itcast.
import android.app.A
import android.os.B
public cla...
Android简单的人机对战五子棋游戏。
第四版的五子棋游戏界面虽然漂亮多了,但是只能自个跟自个下或者两个人轮着下
讲C++课的第一天,老师就让我们编一个C++的五子棋游戏,虽然她给出一些提示,还是觉得不可思议
Android实现简单五子棋游戏。
(完全手绘版五子棋)在制作五子棋时的一般流程:首先:设置好显示窗口的大小、布局、外观,绘制好棋子所下的网格线和一些信息描述等等。其次:定义一个二维数组用于保存所有棋子的坐标,例如:         /...
最近一直在学习Android自定义View方面的知识,正好看到一个讲解制作五子棋小游戏的案例,遂学习一番,记录下学习过程,帮助那些有需要的人。
首先放上效果图:
下面我将带领大家一步步完成这个五子...
Android,AI算法
哈喽,我又来了。
       前段时间看了慕课网上的一个小游戏,自己比较喜欢,然后就跟着写了一遍,感觉还不错,一直没来得及跟你们分享,今天整好有空就来跟你们聊聊。
我是用的studio写的...
学习Android系统开发之余,编写了一个小游戏--交互式人机对战五子棋,自娱自乐。之所以称之为交互式人机对战五子棋,一是因为在进入人机对战模式这前,你可以任意设置好开局,同时,在对战过程中,你可以看...
他的最新文章
讲师:姜飞俊
讲师:汪木铃
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)只需一步,快速开始
后使用快捷导航没有帐号?
查看: 2223|回复: 17
用Python的Tkinter做了个五子棋程序
& 累计签到:1 天连续签到:1 天
马上注册加入鱼C,享用更多服务吧^_^
才可以下载或查看,没有帐号?
本帖最后由 ray-z 于
13:34 编辑
-----删除旧日志-----
完善了一下功能。
增加点击开始按钮可弹出一个选择先手的窗口功能;双人对战,又增加了一个正方形光标,每一个单独控制;在右下角增加了一个帮助的按钮,可以查看帮助(可查看按键设定);给右上角的提示标签增加了一个信息框;
棋盘支持自动判断输赢、悔棋功能。
&日 13:33:07&
Python版本:3.5.0
源代码:/s/1dFG4CWL
支持楼主!求源码!
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:240 天连续签到:1 天
自己写的,可以的
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:63 天连续签到:1 天
发下代码让大家学习学习吧
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:275 天连续签到:1 天
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:231 天连续签到:1 天
无码说个j8
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:289 天连续签到:1 天
其实可以了,会做些小软件,小脚本已经够用了
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:178 天连续签到:1 天
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:1 天连续签到:1 天
发下代码让大家学习学习吧
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:1 天连续签到:1 天
无码说个j8
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:1 天连续签到:1 天
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:1 天连续签到:1 天
其实可以了,会做些小软件,小脚本已经够用了
越学越感觉不会的太多。最近先学一下html和css,感觉只学python也不行,网络模块都不懂。
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:1 天连续签到:1 天
帖出来了。看的时候不许偷笑!
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
头像被屏蔽
& 累计签到:6 天连续签到:1 天
提示: 作者被禁止或删除 内容自动屏蔽
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:4 天连续签到:1 天
好!受教了!!
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:231 天连续签到:1 天
开始游戏&&和&&重新开始&&都没有指定代码
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:1 天连续签到:1 天
开始游戏&&和&&重新开始&&都没有指定代码
开始游戏不是按钮,只是一个标签,打开以后默认就是可以了。默认黑棋先,所以先下1。重新开始只有有棋子才有用,如果什么都没有,重新开始肯定不起作用。
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:1 天连续签到:1 天
哥,分享链接失效了。能再分享一下源码吗
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
& 累计签到:57 天连续签到:1 天
链接不存在了
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的
按钮,否则您的代码可能会被“吃掉”!
小甲鱼强烈推荐 /1
特效不会给你基本工资,但却能让你升职加薪
- - - - - - - - - - - -
有备无患,念念不忘
•••(
Powered by想做五子棋.求教问题【python吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:151,638贴子:
想做五子棋.求教问题收藏
想要用python+wxpython做一个五子棋的程序才学了一点点,不知道棋盘下棋的位置绘图的点怎么和储存的棋盘图结合起来...想问应该看那一块方面学习呢?求教啊........
python_总监级名师全程面授,项目实战案例式教学,企业需求无缝对接,助你无忧就业!python,报名即送树莓设备,0基础23周快速实现高薪就业,名额有限,欲报从速.点击抢座
基础python学过没? 学完学GUI wxpy还行反正别急就是,慢慢来
登录百度帐号推荐应用}

我要回帖

更多关于 python五子棋代码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信