用C#写出一个控制台五子棋程序。学习C#中遇到的比较有意思的程序。

首先,在Main方法中定义棋盘的行数列数,int hang,lie = 15;然后定义数组,string[ , ] qipan = new string[hangshu,lieshu];

然后写一个下棋的方法  (其中用*代表白棋,#代表黑棋)

static void Xiaqi (string[,] qipan,int hang,int lie,bool baizixia)

{

qipan[hang, lie] = baizixia ? "*":"#";

}

? "*":"#"; 这个是三目运算符,条件为真结果为问号后面的,条件为假,结果为冒号后面的,因为要判断白子黑子下棋的顺序,所以在方法中定义一个bool 值,再利用三目运算符进行判断。这样就很方便的判断是谁下了。

判断谁下之后要写一个与用户交互的方法,所以:

static void Jiaohu(bool baizixia, out int hanghao , out int liehao)定义一个bool变量,因为只有黑白下两种情况,接下来要写一个if语句

{

if(baizixia)

{

Console.WriteLine("请白子下,输入落子行号");

hanghao = int.Parse(Console.ReadLine());

Console.WriteLine("请白子下,输入落子列号");

liehao = int.Parse(Console.ReadLine());

}

else

{

Console.WriteLine("请黑子下,输入落子行号");

hanghao = int.Parse(Console.ReadLine());

Console.WriteLine("请黑子下,输入落子列号");

liehao = int.Parse(Console.ReadLine());

}

}这样用户交互就写完了。

然后我们要一个检查落子的方法,判断下过的地方不能再下了以及是否超出棋盘界限,用if语句判断

static bool Jianchaluozi(string[,] qipan, int hanghao, int liehao, int hangshu, int lieshu)

{

if (hanghao >= hangshu || liehao >= lieshu)
         {
           Console.WriteLine("该位置已经不在棋盘内,请重新落子");
           return false;
         }

else
         {
           if (qipan[hanghao, liehao] == "+")//空位置
               {
                 return true;//符合规则
               }
           else
             {
                Console.WriteLine("该位置已经有棋子了,请重新落子");
                return false;//不符合规则
              }
         }

}

这样判断棋子位置的方法就写完了

然后做一个棋盘的界面,输出棋盘,利用for循环来控制棋盘行列的输出。

static void Xianshiqipan(string[,] qipan, int hangshu, int lieshu)
{
   Console.WriteLine(" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14");
   for (int i = 0; i < hangshu; i++)
   {
     Console.Write(i < 10 ? i + " 行:" : i + "行:");
     for (int j = 0; j < lieshu; j++)
      {
       Console.Write(qipan[i, j] + " ");
        }
      Console.WriteLine();
    }
}

接下来要写判断胜负的方法,判断胜负有四种,一种是横行5个,一种是竖行5个,然后左斜行5个,右斜行5个。可以写四个if语句

static int Panduanshengfu(string[,] qipan, int hangshu, int lieshu)
{

for (int i = 0; i < hangshu; i++)
{
for (int j = 0; j < lieshu - 4; j++)
{

#region 横行
if (j < lieshu - 4)
{
       if (qipan[i, j] == "#" && qipan[i, j + 1] == "#" && qipan[i, j + 2] == "#" && qipan[i, j + 3] == "#" && qipan[i, j + 4] == "#")
             {
                //横行黑子赢
                 return -1;
             }
       if (qipan[i, j] == "*" && qipan[i, j + 1] == "*" && qipan[i, j + 2] == "*" && qipan[i, j + 3] == "*" && qipan[i, j + 4] == "*")
              {
                //横行白子赢
                 return 1;
               }

}
#endregion

#region 竖行
if (i < hangshu - 4)
{
          if (qipan[i, j] == "#" && qipan[i + 1, j] == "#" && qipan[i + 2, j] == "#" && qipan[i + 3, j] == "#" && qipan[i + 4, j] == "#")
            {
              //竖行黑子赢
              return -1;
             }
          if (qipan[i, j] == "*" && qipan[i + 1, j] == "*" && qipan[i + 2, j] == "*" && qipan[i + 3, j] == "*" && qipan[i + 4, j] == "*")
             {
                //竖行白子赢
               return 1;
              }
}
#endregion

#region 右斜
if (i < hangshu - 4 && j < lieshu - 4)
{
          if (qipan[i, j] == "#" && qipan[i + 1, j + 1] == "#" && qipan[i + 2, j + 2] == "#" && qipan[i + 3, j + 3] == "#" && qipan[i + 4, j + 4] == "#")
            {
              //黑子赢
              return -1;
             }
          if (qipan[i, j] == "*" && qipan[i + 1, j + 1] == "*" && qipan[i + 2, j + 2] == "*" && qipan[i + 3, j + 3] == "*" && qipan[i + 4, j + 4] == "*")
            {
             //白子赢
            return 1;
            }
}
#endregion

#region 左斜
if (i < hangshu - 4 && j >= 4)
{
           if (qipan[i, j] == "#" && qipan[i + 1, j - 1] == "#" && qipan[i + 2, j - 2] == "#" && qipan[i + 3, j - 3] == "#" && qipan[i + 4, j - 4] == "#")
            {
              //竖行黑子赢
              return -1;
             }
            if (qipan[i, j] == "*" && qipan[i + 1, j - 1] == "*" && qipan[i + 2, j - 2] == "*" && qipan[i + 3, j - 3] == "*" && qipan[i + 4, j - 4] == "*")
             {
              //竖行白子赢
              return 1;
              }
}
#endregion

}

}
return 0;
}

接着让棋盘以+号输出,

static void InitQipan(string[,] qipan, int hangshu, int lieshu)
{
for (int i = 0; i < hangshu; i++)
{
for (int j = 0; j < lieshu; j++)
{
qipan[i, j] = "+";
}
}
}

最后写一个方法来控制游戏

static void GameManager(string[,] qipan, int hangshu, int lieshu)
{
//首先初始化
InitQipan(qipan, hangshu, lieshu);
//显示棋盘
Xianshiqipan(qipan, hangshu, lieshu);
//循环控制轮流下棋
bool baizixia = true;
while (true)
{
//交互
int hanghao, liehao;
jiaohu(baizixia, out hanghao, out liehao);
//检查规则
if (Jianchaluozi(qipan, hanghao, liehao, hangshu, lieshu))
{
//下棋
Xiaqi(qipan, hanghao, liehao, baizixia);
//显示棋盘
Xianshiqipan(qipan, hangshu, lieshu);
//判断胜负
int shengfu = Panduanshengfu(qipan, hangshu, lieshu);
if (shengfu == -1)
{
Console.WriteLine("黑棋赢");
InitQipan(qipan, hangshu, lieshu);
Xianshiqipan(qipan, hangshu, lieshu);
}
else if (shengfu == 1)
{
Console.WriteLine("白棋赢");
InitQipan(qipan, hangshu, lieshu);
Xianshiqipan(qipan, hangshu, lieshu);
}
}

else
{
Console.WriteLine("落子不符合规则,请重新落子");
}
//交换棋手
baizixia = !baizixia;
}
}

写完这个方法后在Main方法中调用这个game方法,就完成了。

这个五子棋盘是我在学习C#过程的第一个难度比较大的程序,在老师的指导下一步一步写了下来,在博客中复盘了一下,还是有许多不太懂的地方,这个五子棋盘融合了for循环,if语句,方法的调用,以及各种情况的方法书写。是一个比较完整的学习C#的作业。我会继续努力,将这个五子棋学好。

原文地址:https://www.cnblogs.com/zzy476710623/p/9304223.html

时间: 2024-10-28 07:06:30

用C#写出一个控制台五子棋程序。学习C#中遇到的比较有意思的程序。的相关文章

写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串。

题目描述 写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串.例如: 输入描述: 输入N个字符 输出描述: 输出该字符串反转后的字符串 输入例子: abcd 输出例子: dcba import java.util.Scanner; public class Main {     public static void main(String[] args) {         // TODO Auto-generated method stub         Scanner in = 

《Effective C++》item25:考虑写出一个不抛异常的swap函数

std::swap()是个很有用的函数,它可以用来交换两个变量的值,包括用户自定义的类型,只要类型支持copying操作,尤其是在STL中使用的很多,例如: int main(int argc, _TCHAR* argv[]) { int a[10] = {1,2,3,4,5,6,7,8,9,10}; vector<int> vec1(a, a + 4); vector<int> vec2(a + 5, a + 10); swap(vec1, vec2); for (int i =

怎么写出一个Activity

1.怎么写出一个Activity a.新建一个类继承Activity b.重写onCreate方法 setContentView(R.layout.main);                              //设置布局文件 c.注册Activity <activity   android:name=".类名"      android:label="@string/app_name"> <!--  如果是主程序入口则写上,否则删除--

怎样写出一个较好的高速排序程序

写出一个较好的高速排序程序 高速排序是经常使用的排序算法之中的一个,但要想写出一个又快又准的使用程序,就不是那么简单了 须要注意的事项 首先要写正确.通常使用递归实现.其递归相当于二叉树展开,因此假设要用迭代实现的话须要使用一个队列来保存兴许遍历信息. 高速排序须要找到一个pivot值,假设顺序选择pivot则易造成N^2的复杂度,假设使用随机数则效果最好,但开销又太大,採取三数中值法比較合适.三数中值法指的是选取第一个值,最后一个值,数组中间的值的中值.有文献表明能够提升5%的执行时间. 当数

如何写出一个较好的快速排序程序

写出一个较好的快速排序程序 快速排序是常用的排序算法之一,但要想写出一个又快又准的使用程序,就不是那么简单了 需要注意的事项 首先要写正确.通常使用递归实现.其递归相当于二叉树展开,因此如果要用迭代实现的话需要使用一个队列来保存后续遍历信息. 快速排序需要找到一个pivot值,如果顺序选择pivot则易造成N^2的复杂度,如果使用随机数则效果最好,但开销又太大,采取三数中值法比较合适.三数中值法指的是选取第一个值,最后一个值,数组中间的值的中值.有文献表明可以提升5%的运行时间. 当数组长度较小

写出一个缓存系统的伪代码001

/** * 写出一个缓存系统的伪代码 * @author ysloong * */ public class CacheDemo { private Map<String, Object> map = new HashMap<String, Object>(); public static void main(String[] args) { // TODO Auto-generated method stub } public synchronized Object getDat

《Effective C 》资源管理:条款25--考虑写出一个不抛出异常的swap函数

条款25考虑写出一个不抛出异常的swap函数 条款25:考虑写出一个不抛出异常的swap函数 swap是STL中的标准函数,用于交换两个对象的数值.后来swap成为异常安全编程(exception-safe programming,条款29)的脊柱,也是实现自我赋值(条款11)的一个常见机制.swap的实现如下: namespace std{ template<typename T> void swap(T& a, T& b) { T temp(a); a=b; b=temp;

条款25:考虑写出一个不抛异常的swap函数

条款25:考虑写出一个不抛异常的swap函数 swap函数在C++中是一个非常重要的函数,但实现也非常复杂. 看一个缺省的std::swap函数的实现 namespace std { template<typename T> void swap( T& a , T& b) { T temp(a); a = b; b = temp } } ①内置类型的调用 int a = 2; int b =3; std::swap(a, b); cout<<"a:&quo

一个文件中有40亿个整数,每个整数为四个字节,内存为1GB,写出一个算法:求出这个文件里的整数里不包含的一个整数

4个字节表示的整数,总共只有2^32约等于4G个可能.为了简单起见,可以假设都是无符号整数.分配500MB内存,每一bit代表一个整数,刚好可以表示完4个字节的整数,初始值为0.基本思想每读入一个数,就把它对应的bit位置为1,处理完40G个数后,对500M的内存遍历,找出一个bit为0的位,输出对应的整数就是未出现的.算法流程:1)分配500MB内存buf,初始化为02)unsigned int x=0x1;  for each int j in file  buf=buf|x<<j;  e