昨天学习了一个控制台五子棋的小程序,还是获益匪浅的,下面对这个小程序总结一下:

首先是要解决如何显示棋盘和显示棋子,这里我们用了一个二维数组借助图像“□”来布局棋盘,棋子用● 遍历二维数组并把“□”赋给二维数组的每一个元素就可以实现棋盘的显示了。

考虑到每盘棋下完后要初始化因此对棋盘进行初始化然后考虑如何把棋下到棋盘上呢?这一点我们利用屏幕的显示,只要屏幕上显示的是□就表示此处可以下棋●,

这样的话我们要做一个判断根据坐标来判断棋盘上的某个点是否为方框,这样有引出了新的问题就是找坐标的问题,在控制台了用户下棋需自己输入坐标位置的,因此获取用户的输入然后将其保存在数组中,再调用数组的Splict()方法即可。

接下来就要考虑怎么才能区别是谁下的子呢 这就要考虑棋子的属性 :形状一样大小一样只有颜色和位置不确定,但是位置是随机的很难把它找到并保存下来,所以考虑用颜色来做区别。想到了两种办法:1定义一个二维数组分别保存内容和颜色 2 定义棋子的枚举类型 将这个枚举定义为位枚举即在枚举的声明前加一个[Flags]。

接着就要判断输赢了,根据五子棋的原理,横向,纵向,斜对角的两个方向能连续的连成五个谁先连到谁就赢。还要注意边界的判断。

加入悔棋的思想::利用堆栈这个集合来存储下棋的位置,并提示落子者是否要悔棋,如果悔棋的话就把刚才他下的那一步POP出来,然后把那个位置置为□,并把颜色值为黑色,若果还要悔棋的话就POP++,我们可以控制下棋悔棋的部数,如最多3步

注意:1。循环的控制  用以个mark标志来处理,还要注意mark的位置

* 2 。还有就是将能封装成为一个方法的程序一定封装成一个方法

* 封装后前面定义的会成为局部变量 就会出错,这样的把他们都定义成方法的参数即可

* 3。 注意console.writeline和console.write的使用已经犯过两次这样的错误了

* 这个程序还包涵了控制台颜色和改变清空暂留等知识点,要熟练掌握,加油~!*/

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

using System.IO;

namespace WuZiQI

{

class Program

{

//显示谁落的子的时候有两种办法:

//1定义数组分别存放内容和颜色

//2用位枚举

//□●

struct Point

{

public int X;

public int Y;

}

static void Main(string[] args)

{

//初始化棋盘

int length =20;

//int height = 20;

string[,] wuziqi=new string[length,length];//布局

ConsoleColor[,] consolecolor=new ConsoleColor[length,length];

for (int i = 0; i

{

for (int j = 0; j

{

wuziqi[i,j]="□";//

consolecolor[i,j]=ConsoleColor.Black;

}

}

下棋

ShowChess(wuziqi, consolecolor);

//落子

bool mark = false;

while (true)

{

//try

//{

if (XiaQi(wuziqi, consolecolor, ref mark))

{

ShowChess(wuziqi, consolecolor);

Console.WriteLine("赢了");

Thread.Sleep(500);

break;

}

//}

//catch (Exception ex)

//{

//    Console.WriteLine(ex.Message);

//}

}

}

///

/// 显示棋盘

/// ,

///

static void ShowChess(string[,] wuziqi, ConsoleColor[,] consolecolor)

{

Console.Clear();

for (int i = 0; i < wuziqi.GetLength(0); i++)

{

for (int j = 0; j < wuziqi.GetLength(1); j++)

{

Console.ForegroundColor=consolecolor[i,j];

Console.Write(wuziqi[i, j]);

Console.ResetColor();

}

Console.WriteLine();

}

}

///

/// 下棋落子

///

///

///

///

///

static bool XiaQi(string[,] wuziqi,ConsoleColor[,] consolecolor,ref bool mark)

{

ShowChess(wuziqi, consolecolor);

if (mark)

{

Console.Write("该甲落子啦");

}

else

{

Console.Write("该乙落子啦");

}

Console.WriteLine("请输入落子坐标:如8,6");

string location = Console.ReadLine();

string[] point = location.Split(',');//由于这里用数组来保存输入的坐标,因此输入8,6的话就是数组的索引下标为7,5,按数组的索引下标即为第7行第5列所以x轴为纵向的,y轴为横向的。

int x = int.Parse(point[0]) - 1;

int y = int.Parse(point[1]) - 1;

//悔棋

Point P = new Point();

P.X = x;

P.Y = y;

Stack sp = new Stack();

sp.Push(P);

bool aa = true;

ShowChess(wuziqi, consolecolor);

do

{

Console.Write("悔棋 Y 继续 N");

Console.WriteLine();

if (Console.ReadLine().ToUpper().ToString() == "Y")

{

Point p =sp.Pop();

wuziqi[P.X, P.Y] = "□";

consolecolor[P.X, P.Y] = ConsoleColor.Black;

ShowChess(wuziqi,consolecolor);

aa = true;

}

else

{

aa = false;

}

} while (aa);

if (wuziqi[x, y] == "□")

{

if (mark)

{

consolecolor[x, y] = ConsoleColor.Red;

}

else

{

consolecolor[x, y] = ConsoleColor.Blue;

}

mark = !mark;

wuziqi[x, y] = "●";

}

else

{

Console.WriteLine("sorry,这里不能放子了");

Thread.Sleep(500);

}

return (HWhoWin(consolecolor,x,y)||ZWhoWin(consolecolor,x,y)||ZXWhoWin(consolecolor,x,y)||YXWhoWin(consolecolor,x,y));

}

///

/// 判断横向谁赢了

///

///

//static  int m = 1;//

static bool HWhoWin(ConsoleColor[,] consolecolor,int x,int y)//有人赢了就返回true

{

int m = 1;

ConsoleColor cc=consolecolor[x,y];

for (int i = 1; i < 5; i++)

{

if (y - i >= 0 && consolecolor[x , y - i] == cc)//横向y在变,x不变

{

m++;

}

else

{

break;

}

}

for (int i = 1; i < 5; i++)

{

if (y + i < consolecolor.GetLength(1)&&consolecolor[x,y+i] == cc)

{

m++;

}

else

{

break;

}

}

if (m >=5)

{

return true;

}

else

{

return false;

}

}

///

/// 判断纵向是否连成5个棋子

///

///

///

///

///

static bool ZWhoWin(ConsoleColor[,] consolecolor, int x, int y)

{

int m = 1;

ConsoleColor cc =consolecolor[x,y];

for (int i = 1; i < 5; i++)

{

if (x - i >=0 && consolecolor[x-i, y ] == cc)

{

m++;

}

else

{

break;//不满足左边连成五个就要跳出往下进行,不break的话就一直在这个for循环里了

}

}

for (int i = 1; i < 5; i++)

{

if (x + i < consolecolor.GetLength(0) && consolecolor[x + i, y] == cc)

{

m++;

}

else

{

break;

}

}

if (m >=5)

{

return true;

}

else

{

return false;

}

}

///

/// 向左斜的方向

///

///

///

///

///

static bool ZXWhoWin(ConsoleColor[,] consolecolor, int x, int y)

{

ConsoleColor cc=consolecolor[x,y];

int m = 1;

for (int i = 1; i < 5; i++)

{

if (x - i >= 0 && y - i >= 0&&x+i

{

m++;

}

else

{

break;

}

}

for (int i = 1; i < 5; i++)

{

if (x-i>=0&& y+i

{

m++;

}

else

{

break;

}

}

if (m >= 5)

{

return true;

}

else

{

return false;

}

}

///

/// y右斜方向

///

///

///

///

///

static bool YXWhoWin(ConsoleColor[,] consolecolor, int x, int y)

{

int m = 1;

ConsoleColor cc=consolecolor[x,y];

for (int i = 1; i < 5; i++)

{

if (x - i >= 0 && y - i <= 0 &&consolecolor[x + i, y + i] == cc)

{

m++;

}

else

{

break;

}

}

for (int i = 1; i < 5; i++)

{

if (x + i < consolecolor.GetLength(0) && y + i < consolecolor.GetLength(1) && consolecolor[x + i, y + i] == cc)

{

m++;

}

else

{

break;

}

}

if (m >= 5)

{

return true;

}

else

{

return false;

}

}

}

五子棋项目结束总结_五子棋编程思想小结相关推荐

  1. 五子棋项目结束总结_五子棋项目总结

    五子棋项目是在我加入蓝杰后第一个接触的小型游戏项目,有着非同寻常的意义,所以本人也是相当的重视. 在胡哥的指导下,我们通过完成一个简单的登录界面,初步对桌面应用程序的开发有了一定的了解,即UI的相关知 ...

  2. 五子棋项目结束总结_五子棋活动总结

    五子棋活动总结 篇一:五子棋兴趣小组活动总结 五子棋兴趣小组活动总结 在这个学期里,我们五子棋兴趣小组的活动提高了学 生活动兴趣,增长学生棋艺水平,陶冶学生的性情.现将本 小组的活动情况总结如下: 一 ...

  3. 五子棋项目结束总结_五子棋和画板项目总结

    五子棋和画板项目总结 项目介绍 项目过程: 一.遇到的困难 五子棋:刚开始接触到五子棋的时候经常会被一些很简单的算法纠结,比如说,判断输赢的算法,还有就是怎么样让棋子下到交叉点上,刚开始有点不太明白 ...

  4. 五子棋项目结束总结_五子棋比赛总结

    五子棋比赛总结 为了丰富我校课余文化和学生们的课余生活, 宣传中华传统文化 和棋类文化, 促进棋类爱好者之间的交流, 提高我系学生的综合素质, 我们女生部特此举办了五子棋比赛,于 2011 年 11 ...

  5. 五子棋项目结束总结_居家活动系列总结

    刚开始一直待家里真的好无聊......不过后来电气学院举办了一系列线上活动,在家里也能参与! 我们一起来看看吧! 厨艺比赛 2020年3月2日-3月6日,为了鼓励大家好好利用假期时间,享受生活.电气工 ...

  6. 五子棋项目结束总结_朱建锋:五子棋对局要不断总结、精益求精!

    原标题:朱建锋:五子棋对局要不断总结.精益求精! [编者按]这是朱建锋老师在2010年全国五子棋公开赛上的对局自我点评,从中我们不仅可以学习到一流棋手的行棋思路和中局作战能力,更能学到优秀棋手那种不断 ...

  7. java五子棋项目创新点_五子棋规则的改革创新方法

    五子棋规则最近几年来,关于五子棋规则改革的讨论掀起了一阵阵高潮,形态各异的新规则层出无穷,可谓是对各种规则改革方案的大胆设想.下面小编给你介绍五子棋规则的改革创新,欢迎阅读. 五子棋大多数新规则跟流星 ...

  8. 基于STM32F103移植华为LiteOS_任务挂起与恢复_面向对象编程思想之按键状态机

    华为LiteOS_任务挂起与恢复_面向对象编程思想之按键状态机 因为在做华为LiteOS任务挂起和恢复需要使用到按键去触发任务挂起和恢复动作,因为我就萌发出使用状态机这种架构做一个按键检测触发.回想已 ...

  9. java五子棋需求分析文档_五子棋需求文档.docx

    五子棋需求文档 <五子棋goBang>项目需求分析报告作者:陈平.雷小梅.唐莉.邓悦.程强日期:2016-3-12审批:日期:状态修订人修改日期版本备注五子棋2016-3-121.0概述1 ...

最新文章

  1. linux 调用 fudanNLP
  2. [Hadoop in China 2011] 中兴:NoSQL应用现状及电信业务实践
  3. c#执行存储过程的简单实例
  4. 设计模式-依赖倒转模式(面向接口编程)
  5. x x x x c程序语言,C语言写个贪吃蛇游戏
  6. JavaScript 是如何成为一门严肃的编程语言的
  7. “干掉”程序员饭碗后,OpenAI 又对艺术家下手了!
  8. 小数点保留若干位小数 %.*f
  9. 地壳中元素含量排名记忆口诀_地壳中含量最多的元素--氧元素
  10. jquery.筛选文档处理
  11. java程序设计基础_陈国君版第五版_第六章习题
  12. 程序员工作交接文档怎么写_浅谈程序员该如何做好工作交接?
  13. 《符号学:原理与推演》引论
  14. java jdom jar_jdom jar下载_jdom jar官方下载-太平洋下载中心
  15. 计算机识别图像的原理,什么是图像识别技术?图像识别技术原理介绍
  16. 财务报表java_财务报表识别
  17. (CCF202109-4)收集卡牌(概率DP)
  18. RockyLinux9.0系统在VMware虚拟机上【保姆级】安装步骤,并修改网络配置,使用固定IP进行SSH连接【47张过程图】
  19. XAMPP的MySQL配置
  20. arm芯片中的浮点运算(一)

热门文章

  1. 大罗讲SQL:如何优雅的进行SQL编写?
  2. IMP-00009:异常结束导出文件解决方案
  3. 图神经网络,这到底是个什么?
  4. 有了这个算法,图像上文字擦除再也用不上PS了
  5. 【华为云技术分享】DAS文件上传组件的进化
  6. 化繁就简 · 万物互联,华为云All-Connect企业级云网络正式发布
  7. 华为云ROMA,联接企业应用的现在与未来
  8. Kotlin学习笔记 第四章注解
  9. 优达学城深度学习之三(下)——卷积神经网络
  10. WORD如何关闭标题段落分页功能?