C#-多維陣列:規則與不規則的型式

規則:

  int[, ,] A = { {{2,3}, {52,41}, {37,6}}, 
                 {{8,4}, {5,4}, {17,26}}, 
                 {{52,30}, {85,24}, {57,6}} }; 
 Console.WriteLine("A[0,1,1] = {0}", A[0, 1, 1]); 
 Console.WriteLine("A[0,1,1] = {0}", A[0, 1, 1]); }

不規則:

int[][][] A = new int[2][][];
A[0] = new int[2][];
A[1] = new int[1][];

A[0][0] = new int[] { 3, 4, 5, 7 };
A[0][1] = new int[] { 2, 4 };

A[1][0] = new int[] { 4, 5, 7 };

Console.WriteLine("A[0][1][0] = {0}", A[0][1][0]);
Console.WriteLine("A[0][1][1] = {0}", A[0][1][1]);
Console.WriteLine("A[0][1][2] = {0}", A[0][1][2]);
//2、4、0、發生執行時期的例外錯誤 Array index out of bound

【程式設計-C#】巴斯卡三角形

巴斯卡三角形的演算法:

步驟1:在第1列中間行位置放入1

步驟2:從第2列開始,每個元素的值為其左上角的值與右上角的值相加,若元素在邊界,左或右邊已到邊緣,沒有左上或右上的元素可供相加,此時,我們可以假想這些不存在的元素為0,在左邊界的話,則元素的值等於0+右上角的值,在右邊界的話,則元素的值等於左上角的值+0。

程式的寫法:

陣列的大小為n x (2n-1)

    const int nr = 7; //列的數量
    const int nc = 2 * nr - 1; //行的數量
    int[,] M = new int[nr, nc]; //建立一個 n x 2n-1大小的二維陣列
    int row = 0, col = nc / 2; //計算第一列中間位置
    M[row, col] = 1; //將1放入第1列中間位置   
    for (row = 1; row < nr; row++)
    {
        for (col = 0; col < nc; col++)
        {
            if (col == 0) M[row, col] = M[row - 1, col + 1]; //左邊界
            else if (col == nc - 1) M[row, col] = M[row - 1, col - 1]; //右邊界
            else M[row, col] = M[row - 1, col - 1] + M[row - 1, col + 1];
        }
    }
    for (row = 0; row < nr; row++)
    {
        for (col = 0; col < nc; col++)
        {
            if (M[row, col] != 0) Console.Write("{0, 4}", M[row, col]);
            else Console.Write("    "); //如果是0的話,就只輸出4個空白,不要輸出0
        }
        Console.WriteLine();
    }

}


【程式設計】【C# – 變數的視野/scope】

在C# ,變數的視野/Scope是說變數的可見範圍、影響範圍…,共有三種scope:

  1. 類別/class
  2. 方法/method
  3. for, while and do while loop, if and switch敘述

類別視野範例:

class Test
{  // 類別視野的起始
 
  // 在類別中,宣告並初始化一個變數
    string colorName = "red";
 
  // 宣告一個方法 
    public void GetValue()            
    {
      /* 當一個變數是在類別中宣告的話,可以在這個類別中的任何地方被存取。*/
        Console.WriteLine(colorName); 
    }   // 方法的結束
 
} //類別視野結束

方法視野範例:

class Program
{      // 類別視野的起始
       public static void ShowVariable1()
       {  // 第一個方法視野的起始
 
           //宣告整數變數int,並給予初值100
           int number = 100;
 
           // 印出變數
           Console.WriteLine(number);
 
       }  // ShowVariable1 ()方法視野的結束
 
       public static void ShowVariable2()     // 第二個方法視野的起始
       {
         // 印出numver變數,但是,會產生編譯錯誤,因為,在這個方法中,無法存取另一個方法所宣告的變數number
           Console.WriteLine(number);                    
 
       } // ShowVariable2 ()方法視野的結束
   }

for, while and do while loop, if and switch statements 

class Program
    {  // 類別視野的起始
        static void Main(string[] args)         // main方法的起始
        {
            for (int i = 0; i <= 10; i++)
            {  // loop視野的起始
 
                //存取在for區塊中所宣告的變數i
                Console.WriteLine(i);
            }   // End for loop scope
 
            //在for區塊外面,存取for內部的變數i,這樣會造成編譯錯誤!
            Console.WriteLine(i);
            Console.ReadKey();
        }   // main方法視野的結束
    }   // 類別視野的結束

下面的程式中,ShowVariable1與ShowVariable2各印出多少?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static int number = 100;

        static void Main(string[] args)
        {
        }

        public static void ShowVariable1()
        {  // 第一個方法視野的起始

            //宣告整數變數int,並給予初值100


            // 印出變數
            int number = 200;
            Console.WriteLine(number);

        }  // ShowVariable1 ()方法視野的結束

        public static void ShowVariable2()     // 第二個方法視野的起始
        {
            // 印出numver變數,但是,會產生編譯錯誤,因為,在這個方法中,無法存取另一個方法所宣告的變數number
            Console.WriteLine(number);

        } // ShowVariable2 ()方法視野的結束
    }
}

 

延伸閱讀:

  1. Value Type and Reference Type
  2. Understanding Classes and Objects the C# Way
【程式設計】【習題講解】BMI計算

【程式設計】【習題講解】BMI計算

【程式設計】【習題講解】BMI計算

題目:建立三個陣列,用來存放六人的姓名、身高、體重資料,在表單載入時,使用迴圈列出六人的資料(含姓名、身高、體重和BMI)及平均值。BMI為身體質量指數=體重(公斤) / 身高^2(公尺^2)。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        string[] 姓名 = new string[] {"張志成", "廖美昭", "蔡文龍", "周家旬", "蔡汶璇", "蔡汶妤"};
        int[] 身高 = new int[] { 170, 168, 165, 164, 172, 160 }; 
        int[] 體重 = new int[] { 60, 55, 72, 59, 55, 54 };

        private void Form1_Load(object sender, EventArgs e)
        {
            label1.Text = "  姓名       身高      體重      BMI" + Environment.NewLine;
            int BMI加總 = 0, 身高加總 = 0, 體重加總 = 0;
            int BMI = 0;

            for (int i = 0; i <= 5; i++)
            {
                BMI = (int)(體重[i] / (身高[i] / 100.0 * 身高[i] / 100.0));
                label1.Text += "  " + 姓名[i] + "   " + 身高[i] + "       " + 體重[i] + "         " +  BMI + Environment.NewLine;
                身高加總 += 身高[i]; 體重加總 += 體重[i]; BMI加總 += BMI;
            }

            label1.Text += "   平均" + "      " + 身高加總 / 6 + "       " + 體重加總 / 6 + "         " + BMI加總/6 + Environment.NewLine;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}

【程式設計】【C#】【遊戲設計】馬力歐跳跳跳

【素材下載】

在遊戲進行時,當玩家按了空白鍵或上鍵,可以讓馬力歐角色往上跳,到頂後落地。

為了要完成這樣的動作,我們把「馬力歐角色往上跳,到頂後落地」這個動作用計時器元件來完成,將計時器元件拖曳至表單:

下一步,在計時器的Tick事件處理函式中處理馬力歐的跳躍動作:

int 角色移動量 = 15; 
private void timer1_Tick(object sender, EventArgs e)
{
    角色.Top -= 角色移動量; //向上移動,也就是往上跳的意思
    if (角色.Top < 50) 角色移動量 = 0 - 角色移動量; //當馬力歐跳到頂時,將角色移動量變負,使得馬力歐往下移動,也就是落地

    if (  (角色.Top +角色.Height + 20) > 遊戲背景.Height ) {  //當馬力歐腳著地時…,20是地上磚塊的高度              
        角色移動量 = 0 - 角色移動量; //著地時,轉變移動的方向
        timer1.Enabled = false; //計時器timer1關閉
    }
}

計時器每跳一次(一個滴答),讓馬力歐以垂直的方向移動,往上是將其Top進行減的動作,往下則是將其Top進行加的動作。

我們設置一個到頂的位置為50,當馬力歐這個角色的元件位置(Top)一直減到小於50時,表示到頂,要進行落地的處理。

落地的處理只要將角色移動量變個號就行了…

然後,落地後,就關閉掉計時器,表示停止移動。

以上是計時器處理馬力歐角色跳與落地的想法與程式作法。

接下來,就是判斷是否按了空白鍵與上鍵,是的話,就啟動計時器,由計時器每隔一段時間,進行馬力歐的垂直移動,以完成跳躍與落地的連續性動作。

if (e.KeyCode == Keys.Space || e.KeyCode == Keys.Up) //按下空白鍵或上鍵的時候…
{
    timer1.Enabled = true;     //計時器timer1打開,由計時器來負責馬力歐的跳躍與落地的位置變換
}

整支程式列表如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace MarionRunRunRun
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            角色.Parent = 遊戲背景;  //將角色圖片方塊的Parent屬性設為遊戲背景圖片方塊,Parent表示上一層,父層…
            遊戲背景.BackColor = Color.Transparent; //將戲背景的BackColor設為透明,
        }

        int 移動量 = 10;

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Right && 遊戲背景.Left > (this.ClientSize.Width - 遊戲背景.Width)) //按了右鍵的話 而且 …
            {
                角色.Location = new Point(角色.Location.X + 移動量, 角色.Location.Y); //一旦角色的Parent屬性設為遊戲背景圖片時,角色圖片會跟著跑,因此,需要進行水平位置的移動,使得角色保持中間位置
                遊戲背景.Left -= 移動量; //背景向左                       
            }
            if (e.KeyCode == Keys.Left && 遊戲背景.Left < 0) //按了左鍵的話 而且 遊戲背景.Left 超過 畫面左邊的情況下
            {
                角色.Location = new Point(角色.Location.X - 移動量, 角色.Location.Y);
                遊戲背景.Left += 移動量; //背景向右                
            }
            if (e.KeyCode == Keys.Space || e.KeyCode == Keys.Up) //按下空白鍵或上鍵的時候…
            {
                timer1.Enabled = true;     //計時器timer1打開,由計時器來負責馬力歐的跳躍與落地的位置變換
            }
        }

        int 角色移動量 = 15; 
        private void timer1_Tick(object sender, EventArgs e)
        {
            角色.Top -= 角色移動量; //向上移動,也就是往上跳的意思
            if (角色.Top < 50) 角色移動量 = 0 - 角色移動量; //當馬力歐跳到頂時,將角色移動量變負,使得馬力歐往下移動,也就是落地

            if (  (角色.Top +角色.Height + 20) > 遊戲背景.Height ) {  //當馬力歐腳著地時…,20是地上磚塊的高度              
                角色移動量 = 0 - 角色移動量; //著地時,轉變移動的方向
                timer1.Enabled = false; //計時器timer1關閉
            }
        }
    }
}

 

 

課外補充

按下空白鍵…,要如何防止再次進行空白鍵的處理? 一個作法就是設置一個旗標isPressed,初值為false,進入空白鍵的判斷加上這個旗標必須為false,當進入空白鍵處理時,立刻設此旗標為true,防止再次進入。

在另一個事件KeyUp,將這個旗標設為false…

private bool isPressed = false;
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if(e.KeyCode == Keys.Space && !isPressed )
    {
        isPressed = true;
        // do work
    }
}

private void Form1_KeyUp(object sender, KeyEventArgs e)
{
    if (isPressed )
        isPressed = false;
}

 

【程式設計】【C#】【遊戲設計】利用背景捲動實現遊戲場景的動態變化

馬利歐遊戲大概是最家喻互曉的遊戲了:

一般來說,遊戲由靜態的元素與動作組成:

遊戲的靜態元素:

  1. 角色
  2. 場景
  3. 阻礙物、暗樁
  4. 敵人(魔王)
  5. 蘑菇 (好、壞)

遊戲的動態元素

  1. 角色的移動、奔跑
  2. 魔王的移動、奔跑

我們要如何做這樣的遊戲呢?

我們先參考這些紙板遊戲:

一、要開始製作遊戲,我們要有角色、背景材料,所幸下面網站提供了絕佳的製作材料:

  • 遊戲資源,背景圖、角色圖(動作分解圖)、音效等遊戲資源

我們從上面的資源來準備我們要的圖、音效檔。

下載圖片,並用小畫家(或其他繪圖軟體,例PhotoShop)處理圖片,剪下需要的部份。

若圖片需要去背處理(去掉白色/其他顏色背景),在線上搜尋”線上去背”網站來處理去背的工作。

二、接下來,我們開始設計程式,開啟Visual C#。

加入PictureBox元件放置背景圖片

指定Image,載入背景圖片

設定Location為(0,0),讓PictureBox置於Form1左上角。

設定SizeMode為”AutoSize”,讓PictureBox自動設定大小為載入圖片的大小。

加入PictureBox元件放置角色圖片

指定Image,載入角色圖片,角色圖片必須為去背景圖片,才能融入背景畫面。

設定SizeMode為”StretchImahe”,讓角色圖片自動縮放為PictureBox元件的大小。

畫面如下:

此時,角色圖片雖為去背圖片,但是並未融入背景,嗯,我們要在程式加上二條指令:

private void Form1_Load(object sender, EventArgs e)
{
    角色.Parent = 遊戲背景;  //將角色圖片方塊的Parent屬性設為遊戲背景圖片方塊,Parent表示上一層,父層…
    遊戲背景.BackColor = Color.Transparent; //將戲背景的BackColor設為透明,
}

執行時,畫面就能變成完美的遊戲畫面了:

三、接下來,我們要處理奔跑的動作

我們觀察馬利歐遊戲的動作發現,馬利歐的移動分成二個部份,慢速移動與快速移動,當慢速移動時(走),是角色在畫面中移動,當快速移動時(跑),角色固定在螢幕中間,以背景左右移動的方式,產生角色奔跑的效果。

在這邊,我們要處理當玩家按了左鍵與右鍵的對應動作,當玩家按左鍵,我們移動背景圖片向右(與角色動作相反方向),產生角色向左跑的效果;當玩家按右鍵,我們移動背景圖片向左,產生角色向右跑的效果。

背景圖片向右就是將背景圖片的Left屬性加一個固定大小的移動值,比如5(要快一點的話,增量為10)。

背景圖片向左就是將背景圖片的Left屬性減一個固定大小的移動值,比如5(要快一點的話,減量為10)。

OK,了解整個動作的大概後,我們來加上程式碼在表單的KeyDown事件。

int 移動量 = 5;

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Right) //按了右鍵的話
    {
        角色.Location = new Point(角色.Location.X + 移動量, 角色.Location.Y); //一旦角色的Parent屬性設為遊戲背景圖片時,角色圖片會跟著跑,因此,需要進行水平位置的移動,使得角色保持中間位置
        遊戲背景.Left -= 移動量; //背景向左                       
    }
    if (e.KeyCode == Keys.Left) //按了左鍵的話
    {
        角色.Location = new Point(角色.Location.X - 移動量, 角色.Location.Y);
        遊戲背景.Left += 移動量; //背景向右                
    }
}

上面程式也同時處理角色的移動,原因是一旦角色的Parent屬性設為遊戲背景圖片時,角色圖片會跟著跑,因此,需要進行水平位置的移動,使得角色保持中間位置。

上面的程式,尚未處理背景捲動時,左右二邊的狀況:

因此,下面的程式處理了二邊的狀況:

int 移動量 = 10;

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Right && 遊戲背景.Left > (this.ClientSize.Width - 遊戲背景.Width)) //按了右鍵的話 而且 …
    {
        角色.Location = new Point(角色.Location.X + 移動量, 角色.Location.Y); //一旦角色的Parent屬性設為遊戲背景圖片時,角色圖片會跟著跑,因此,需要進行水平位置的移動,使得角色保持中間位置
        遊戲背景.Left -= 移動量; //背景向左                       
    }
    if (e.KeyCode == Keys.Left && 遊戲背景.Left < 0) //按了左鍵的話 而且 遊戲背景.Left 超過 畫面左邊的情況下
    {
        角色.Location = new Point(角色.Location.X - 移動量, 角色.Location.Y);
        遊戲背景.Left += 移動量; //背景向右                
    }
}

參考:

Part 1 – Movements – http://www.youtube.com/watch?v=Cc62S6…

Part 2 – Jumping – http://www.youtube.com/watch?v=X1lfRI…

Part 3 – Collision – http://www.youtube.com/watch?v=vBT5Gl…

Part 4 – Character Design – http://www.youtube.com/watch?v=EMOpp1…

【程式設計】【C#】C#的變數可視範圍(SCOPE)

 

在一個程式中,變數的宣告意味著二件事:

  1. 跟系統配置一個空間,用來儲存資料
  2. 為了存取(儲存或讀取)這個變數,必須要透過一個名字,就像人一樣,出生下來就要取名字(取名字的目的,無非就是要來辨識一個人)。

另外從路的命名來看,相同的名字可以被用來命名不同地方的路,例如:

台中市有中山路、台中市裏的太平市(以前叫太平區)也有一條路叫中山路,大甲區有一條路叫中山路…

太平市、大甲區、大安區在台中市裏,用來類比程式的架構:

台中市可類比程式裏的類別,太平市、太甲區、大安區可類比程式裏的方法…

而中華民國就可類比namespace (命名空間)中的 WindowsFormsApplication1了

回到程式中來看,

在類別裏宣告的變數叫做類別的變數(在以前不是物件導向的世界時,叫做全域變數),類別變數的可視範圍遍及整個類別,類別裏的方法也能存取類別變數,方法裏宣告的變數,叫做方法變數(在以前不是物件導向的世界時,叫做區域變數),方法變數只能在宣告其變數的方法中被存取,其他方法不能存取其他方法裏的方法變數。

再下一階的變數,就是區塊變數(區塊是由左右大括弧的程式碼段落,像是if, while, do-while, for, try, catch等區塊),在一個區塊內變告的變數,僅能在該宣告其變數裏的區塊存取,區塊外不能取存取在區塊內宣告的變數。

原理講完了…,程式就簡單了!

【程式設計】【C#】乒乓遊戲

1.先將表單視窗放到最大,並將標題列隱藏

WindowState –> Maximized

FormBorderStyle –> None

 

2.2個pictureBox元件,一個是球,一個是球拍/棒

請自行Google適當的圖 (或僅設背景顏色)

3.程式一開始時,把球拍放在畫面的最下方 (表單底部)

4.使用滑鼠控制球拍的左右移動

 

程式碼-1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        int 水平位移量 = 5;
        int 垂直位移量 = 5;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            球.Left += 水平位移量;
            球.Top += 垂直位移量;

            if ((球.Top + 球.Height) >= this.ClientSize.Height || 球.Top <= 0) 垂直位移量 = 垂直位移量 * -1; //變化方向,縱向
            if ((球.Left + 球.Width) >= this.ClientSize.Width || 球.Left <= 0) 水平位移量 = 水平位移量 * -1; //變化方向,橫向

        }
    }
}

 

程式碼-2,加上棒子,並可用滑鼠來移動

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        int 水平位移量 = 5;
        int 垂直位移量 = 5;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            棒子.Top = this.ClientSize.Height - 棒子.Height;
            棒子.Left = this.ClientSize.Width/2 - 棒子.Width/2;
            //以上二行將棒子移到畫面的正中、下方處

            Cursor.Hide();//將游標隱藏起來
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            球.Left += 水平位移量;
            球.Top += 垂直位移量;

            if ((球.Top + 球.Height) >= this.ClientSize.Height || 球.Top <= 0) 垂直位移量 = 垂直位移量 * -1; //變化方向,縱向
            if ((球.Left + 球.Width) >= this.ClientSize.Width || 球.Left <= 0) 水平位移量 = 水平位移量 * -1; //變化方向,橫向

        }

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            棒子.Left = Cursor.Position.X; //棒子的水平位置 與 游標的水平位置聯動
        }
    }
}

 

程式碼-3,棒子擊球,並判斷球沒接到後的處理方式

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace bounceBall
{
    public partial class Form1 : Form
    {
        int 水平位移量 = 10, 垂直位移量 = 10; //控制水平與垂直的移動距離(跳5個像素)

        public Form1()
        {
            InitializeComponent();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            //水平方向方向的判斷,右邊碰觸的判斷 + 左邊碰觸的判斷
            if ((球.Location.X + 球.Width) > this.ClientSize.Width || 球.Location.X < 0) 
                水平位移量 = 0 - 水平位移量; //正變負,負變正,也就是變換方向
            
            //上方碰觸的判斷 
            if (球.Location.Y < 0) 
                垂直位移量 = 0 - 垂直位移量; //正變負,負變正,也就是變換方向


            //棒子打中球的判斷
            if (球.Left >= 棒子.Left && 球.Left <= (棒子.Left + 棒子.Width) &&
                球.Top >= 棒子.Top - 球.Height) 
            {
                垂直位移量 = 0 - 垂直位移量; //正變負,負變正,也就是變換方向
            } 
           
            //底下是判斷球是否碰到畫面底碰部,是的話,遊戲結束
            if (球.Top + 球.Height >=  this.ClientSize.Height) //球碰到底部
            { //沒接到球…                
                timer1.Enabled = false; //關閉計時器,不要讓球繼續跑
                球.Left = 10; 球.Top = 10; //讓球回到點(10, 10)
                Cursor.Show();//讓游標顯示出來
                MessageBox.Show("你出局了!");
                this.Close(); //結束遊戲程式
            }

            //將水平位移量, 垂直位移量加到pictureBox1的X與Y
            球.Location = new Point(球.Location.X + 水平位移量, 球.Location.Y + 垂直位移量);

            /* 或者用Left和Top來移動球的位置
              球.Left += 水平位移量;
              球.Top += 垂直位移量;
             */
        }

        private void Form1_Load(object sender, EventArgs e) 
        {
            棒子.Top = this.ClientSize.Height - 棒子.Height;
            棒子.Left = this.ClientSize.Width / 2 - 棒子.Width / 2;
            //以上二行將棒子移到畫面的正中、下方處

            Cursor.Hide();//將游標隱藏起來
        }

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            棒子.Left = Cursor.Position.X; //棒子的水平位置 與 游標的水平位置聯動
        }
    }
}

 

球出現在隨機的水平位置 +運動方向的改變 (左下方、正下方、右下方)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace bounceBall
{
    public partial class Form1 : Form
    {
        int 水平位移量 = 10, 垂直位移量 = 10; //控制水平與垂直的移動距離(跳5個像素)
        int 分數 = 0; 

        public Form1()
        {
            InitializeComponent();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            //水平方向方向的判斷,右邊碰觸的判斷 + 左邊碰觸的判斷
            if ((球.Location.X + 球.Width) > this.ClientSize.Width || 球.Location.X < 0) 
                水平位移量 = 0 - 水平位移量; //正變負,負變正,也就是變換方向
            
            //上方碰觸的判斷 
            if (球.Location.Y < 0) 
                垂直位移量 = 0 - 垂直位移量; //正變負,負變正,也就是變換方向


            //棒子打中球的判斷
            if (球.Left >= 棒子.Left && 球.Left <= (棒子.Left + 棒子.Width) &&
                球.Top >= 棒子.Top - 球.Height) 
            {
                水平位移量 += 5;
                垂直位移量 += 5;

                垂直位移量 = 0 - 垂直位移量; //正變負,負變正,也就是變換方向
                
                分數 = 分數 + 1;
                label1.Text = "分數:" + 分數;
            } 
           
            //底下是判斷球是否碰到畫面底部,是的話,遊戲.... 
            if (球.Top + 球.Height >=  this.ClientSize.Height) //球碰到底部
            { //沒接到球…                
                timer1.Enabled = false; //關閉計時器,不要讓球繼續跑
                GameOver.Visible = true;
               

            }

            //將水平位移量, 垂直位移量加到pictureBox1的X與Y
            球.Location = new Point(球.Location.X + 水平位移量, 球.Location.Y + 垂直位移量);

            /* 或者用Left和Top來移動球的位置
              球.Left += 水平位移量;
              球.Top += 垂直位移量;
             */
        }

        private void Form1_Load(object sender, EventArgs e) 
        {
            棒子.Top = this.ClientSize.Height - 棒子.Height;
            棒子.Left = this.ClientSize.Width / 2 - 棒子.Width / 2;
            GameOver.Left = (this.ClientSize.Width - GameOver.Width) / 2;
            GameOver.Top = (this.ClientSize.Height - GameOver.Height) / 2;
            GameOver.Visible = false;

            //將球依隨機的水平位置來放
            Random Rnd = new Random(); //新建一個隨機數(Random)物件
            球.Left = Rnd.Next(10, this.ClientSize.Width - 球.Width);

            int 球的運動方式 = Rnd.Next(1, 4 ); //1:左下,2:正下方跑,3:右下(原本的方式)
            if (球的運動方式 == 1) 水平位移量 = 0 - 水平位移量;
            if (球的運動方式 == 2) 水平位移量 = 0 ;
            //if (球的運動方式 == 3)  原本的方式

            //以上二行將棒子移到畫面的正中、下方處

            Cursor.Hide();//將游標隱藏起來
        }

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            棒子.Left = Cursor.Position.X; //棒子的水平位置 與 游標的水平位置聯動
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.F1)
            {
                水平位移量 = 10;
                垂直位移量 = 10;
                分數 = 0;
                label1.Text = "分數:" + 分數;
                球.Top = 20;

                //將球依隨機的水平位置來放
                Random Rnd = new Random(); //新建一個隨機數(Random)物件
                球.Left = Rnd.Next(10, this.ClientSize.Width - 球.Width);

                int 球的運動方式 = Rnd.Next(1, 4); //1:左下,2:正下方跑,3:右下(原本的方式)
                if (球的運動方式 == 1) 水平位移量 = 0 - 水平位移量;
                if (球的運動方式 == 2) 水平位移量 = 0;
                if (球的運動方式 == 3) 水平位移量 = 10;


                GameOver.Visible = false;
                timer1.Enabled = true;
            }

            if (e.KeyCode == Keys.Escape)
            {
                this.Close();
            }

        }
    }
}

 

參考資料:

【程式設計】【C#】乒乓遊戲

 

【程式設計】【C#】籃球MVP等級計算

問題描述:
試寫一個程式,讓使用者可以輸入籃球員的得分,籃板,助攻、抄截、失誤等五個數值。並依(得分*1+助攻*2+籃板*2+抄截*2)-(失誤*2)的公式取得此籃球員MVP數值。大於45分以上為A級球員,35~44分為B級球員,25~34之間為C級球員,低於25分為D級球員。

輸入說明:
每一組需要輸入五個正整數,依序分別代表:平均得分、籃板數、
助攻數、抄截數、失誤數。

輸出說明:
以MVP數值對應球員等級。

例:

輸入:20 12 15 6 3

輸出:A

程式列表: