C#实现十五子游戏

最近由于工作需要,做一个C#的简单程序。学习了一些基础东西先记下来。

主要有:

1.生成初始框架

2.打乱顺序

3.游戏部分,点击按钮后与空白部分交换的只是Text和Visible部分

  1 const int N = 4;  //行列数
  2 Button[,] buttons = new Button[N, N];
  3
  4 private void Form1_Load(object sender, EventArgs e)
  5 {
  6     //产生所有按钮
  7     GenerateAllButtons();
  8 }
  9
 10 private void button1_Click(object sender, EventArgs e)
 11 {
 12     //打乱顺序
 13     Shuffle();
 14 }
 15
 16 //生成按钮
 17 void GenerateAllButtons()
 18 {
 19     int x0 = 100, y0 = 10, w = 45, d = 50;
 20      for( int row = 0; row < N; row++ )
 21         for ( int col = 0; col < N; col++ )
 22         {
 23             int num = row * N + col;    //数字编号
 24             Button btn = new Button();
 25             btn.Text = (num + 1).ToString();
 26             btn.Top = y0 + row * d;
 27             btn.Left = x0 + col * d;
 28             btn.Width = w;
 29             btn.Height = w;
 30             btn.Visible = true;
 31             btn.Tag = row * N + col;    //button位置
 32
 33             //注册button点击事件
 34             btn.Click += new EventHandler(btn_Click);
 35
 36             buttons[row, col] = btn;
 37             this.Controls.Add(btn);
 38         }
 39     buttons[N - 1, N - 1].Visible = false;
 40 }
 41
 42 void Shuffle()
 43 {
 44     Random rnd = new Random();
 45     for (int i = 0; i < 100; i++ )
 46     {
 47         int a = rnd.Next(N);
 48         int b = rnd.Next(N);
 49         int c = rnd.Next(N);
 50         int d = rnd.Next(N);
 51         Swap(buttons[a, b], buttons[c, d]);
 52     }
 53 }
 54 // 进行游戏
 55 private void btn_Click(object sender, EventArgs e)
 56 {
 57     Button btn = sender as Button;
 58     Button blank = FindHiddenButton();
 59
 60     // 判断是否相邻
 61     if ( IsNeighbor(btn, blank) )
 62     {
 63         Swap(btn, blank);
 64         blank.Focus();
 65     }
 66
 67     // 判断是否完成
 68     if ( ResultIsOk() )
 69     {
 70         MessageBox.Show("OK!");
 71     }
 72 }
 73
 74 // 查找空白按钮
 75 Button FindHiddenButton()
 76 {
 77     for (int row = 0; row < N; row++)
 78         for (int col = 0; col < N; col++)
 79         {
 80             if (!buttons[row,col].Visible)
 81             {
 82                 return buttons[row, col];
 83             }
 84         }
 85     return null;
 86 }
 87
 88 // 判断是否相邻
 89 bool IsNeighbor(Button btnA, Button btnB)
 90 {
 91     int a = (int)btnA.Tag;
 92     int b = (int)btnB.Tag;
 93     int r1 = a / N, c1 = a % N;
 94     int r2 = b / N, c2 = b % N;
 95
 96     if ( (r1 == r2 && (c1 == c2 + 1 || c1 == c2 - 1))
 97         || (c1 == c2 && (r1 == r2 + 1 || r1 == r2 - 1)) )
 98         return true;
 99     return false;
100 }
101
102 //检查是否完成
103 bool ResultIsOk()
104 {
105     for (int r = 0; r < N; r++)
106         for (int c = 0; c < N; c++)
107         {
108             if (buttons[r, c].Text != (r * N + c + 1).ToString())
109             {
110                 return false;
111             }
112         }
113     return true;
114 }
115 //交换两个按钮
116 void Swap(Button btna, Button btnb)
117 {
118     string t = btna.Text;
119     btna.Text = btnb.Text;
120     btnb.Text = t;
121
122     bool v = btna.Visible;
123     btna.Visible = btnb.Visible;
124     btnb.Visible = v;
125 }
时间: 2024-10-17 12:01:10

C#实现十五子游戏的相关文章

C#十五子游戏

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication15

排块游戏(陈景润“十五子游戏”编程实现)

const int N = 4; //按钮的行.列数 Button[,] buttons = new Button[N, N]; //按钮的数组 private void Form1_Load(object sender, EventArgs e) { //产生所有按钮 GenerateAllButtons(); } private void button1_Click(object sender, EventArgs e) { //打乱顺序 Shuffle(); } //打乱顺序 void S

【Unity 3D】学习笔记四十五:游戏实例——击垮围墙

用这个游戏实例来总结之前我们复习的所有关于物理引擎的知识.在游戏中,发送一个球形的炮弹来击垮前面的墙.给炮弹与墙都添加了刚体组件,给炮弹绑定了粒子系统,并且在炮弹的粒子动画中添加了5组不同的颜色,显示移动轨迹. using UnityEngine; using System.Collections; public class Script_06_14 : MonoBehaviour { //炮弹对象 private GameObject obj; //准心贴图 public Texture te

【Unity 3D】学习笔记三十五:游戏实例——摄像机切换镜头

摄像机切换镜头 在游戏中常常会切换摄像机来观察某一个游戏对象,能够说.在3D游戏开发中,摄像头的切换是不可或缺的. 这次我们学习总结下摄像机怎么切换镜头. 代码: private var Camera0: GameObject; private var Camera1: GameObject; private var Camera2: GameObject; private var Camera: GameObject; function Start() { //获取摄像机对象 Camera =

HTML5+JS 《五子飞》游戏实现(一)规则

很久没写文章了,这个游戏其实已经写了有段时间了,一直没有完善,赶在新年之际,分享给大家. 该<五子飞>游戏,不是平常大家所说的<五子棋>,这个玩法简单,是我们老家儿时常玩的一种益智游戏,我们先来看看棋盘布局: 规则如下: 一.黑白双方(对方黑,我方白)各执五子,分别摆放在双方的边线上: 二.棋子只能走直线(斜的直线也是),不能转弯: 三.只要前面没有棋子(任何一方的)就可以跳格走: 四.可以夹死对方一个或可以挑对方两个棋子(以1表示黑子,0表示白子,-表示空白): 夹一个:任何一条

HTML5+JS 《五子飞》游戏实现(五)移动棋子

上一章 我们知道了怎么处理两个重要的吃棋动作,想要吃对方的棋子,首先得移动自己的棋子.现在里沃特跟大家分享分享,怎么移动棋子. 想要移动棋子,在页面上,首先要点击一下要移动的棋子,然后再点击一下目标位置,如果可以移动,则把棋子移动的目标位置,原来的位置就要清空. 上面这句话,我们要分两步来处理:1.判断目标是否可移动:2.可以移动则移动棋子. 1.判断目标是否可移动. 首先移动时只能按直线,其次目标位置与原始位置之间不能有其他棋子: // 是否可移动 this.canMove = functio

HTML5+JS 《五子飞》游戏实现(八)人机对战

要想实现人机对战,就必须让电脑自动下棋,而且要知道自动去查找对方的棋子,看看有没有可以挑一对的,有没有可以夹一个的,这样下起来才有意思. 当电脑用户下完棋后,电脑应立即搜索用户的棋子,然后如果没有被吃的,就再随机走一个棋子(要想让电脑成为下棋高手就不能随机下棋,要考虑下棋后会不会再被对方吃掉等等,这里只简单做随机下子了). 完整<五子飞>游戏人机对战:http://www.lyout.com/projects/Fiveflychess/FiveflyChess8.htm // 查找是否有可挑的

HTML5+JS 《五子飞》游戏实现(六)鼠标响应与多重选择

上一章我们提到了如果有多条线上的棋子可以被吃掉,那么游戏需要提示用户,让用户选择吃哪条线上的.另外因为是网页游戏,所以一定要实现鼠标单击棋子可以进行操作. 当鼠标移动棋子上面后,切换鼠标指针为手形,移开棋子后再切换回默认的状态: el.mousemove(function (e) { var o = el.offset(); var p = { x: e.clientX - o.left, y: e.clientY - o.top }; el.css("cursor", "d

HTML5+JS 《五子飞》游戏实现(四)夹一个和挑一对

在第一章我们已经说了怎么才能“夹一个”以及怎样才能挑一对,但那毕竟只是书面上的,对码农来讲,我们还是用代码讲解起来会更容易了解. 为了更容易对照分析,我们先把路线再次贴出来: // 可走的路线 this.lines = [ [ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19], [20, 21, 22, 23, 24], [ 0, 5, 10, 15, 20], [ 1, 6, 11, 16,