當(dāng)前位置:首頁 > IT技術(shù) > Windows編程 > 正文

c#課程設(shè)計---猜猜看游戲
2021-08-06 15:26:38

1:游戲要求

1.?隨機(jī)顯示 一個名字 與 若干張相片(如3張)。選擇正確的相片。

2. 記錄老師對每一個學(xué)生的認(rèn)識概率P。并依據(jù)認(rèn)識概率,確定“猜猜看”游戲中學(xué)生出現(xiàn)的頻率。

? ? ? ? ??認(rèn)識概率P?= 識別的準(zhǔn)確次數(shù)/(識別的準(zhǔn)確次數(shù)+識別的錯誤次數(shù)

a)?? 原則1:認(rèn)識概率 高的學(xué)生,在猜猜看游戲中出現(xiàn)的頻率相對低一些。

b)?? 原則2:認(rèn)識概率 低的學(xué)生。在猜猜看游戲中出現(xiàn)的頻率相對高一些。

c)?? 原則3:認(rèn)識概率 100%的學(xué)生。也有出現(xiàn)的可能性。

d)?? 原則4:認(rèn)識概率 0%的學(xué)生,也不必每次都出現(xiàn)。
請設(shè)計一個算法來實現(xiàn)上述原則。

3. 實現(xiàn)課堂考勤的功能,可以依據(jù)相片與姓名對部分學(xué)生進(jìn)行考勤(設(shè)置一個比例。如考勤30%,50%等)。設(shè)置可以設(shè)計一個算法。類似于目標(biāo)3,既有隨機(jī)性,同一時候每一個學(xué)生的考勤頻率有差異(依據(jù)之前考勤的經(jīng)驗)。

2、設(shè)計描寫敘述:

此系統(tǒng)為猜猜看游戲兼考勤系統(tǒng)? ?

採用了windows窗口界面設(shè)計創(chuàng)建了此系統(tǒng)。?

系統(tǒng)功能包含:?

1、從已設(shè)置的學(xué)生編號中隨機(jī)抽取3個編號。并隨機(jī)顯示這三個學(xué)生的相片。

2、在設(shè)定的文本文件里選取被選中的學(xué)生的信息。

?

2、記錄某一個學(xué)號每次被猜的信息及被點名信息。

?

3、顯示當(dāng)前被點學(xué)號的被猜和被點的信息,以及全部同學(xué)被猜和被點信息。?

4、每個同學(xué)最多被點三次,當(dāng)被點次數(shù)超過3時,顯示警告窗體,提示用戶

又一次點名。

5.每次猜對或猜錯總數(shù)超過10。顯示窗體信息,游戲自己主動結(jié)束。

?

3、系統(tǒng)具體設(shè)計——控件選取c#課程設(shè)計---猜猜看游戲_數(shù)組

1、listBox1:用來存放及顯示全部同學(xué)被點信息。

?

2、Button1:就是開始點名button。用來控制隨機(jī)抽數(shù)。當(dāng)點下開始button,其會變成停止button,按下停止button。顯示終于被選中的編號和顯示選中的學(xué)生相片。

?

3、Button2:就是用來顯示當(dāng)前被點同學(xué)的被點情況。

4、Button3:就是重置button,用來清除listBox1中的數(shù)據(jù)信息。

5、Button4:就是顯示listBox1中記錄的全部同學(xué)被點情況。

6、timer1:用來控制抽取過程中數(shù)據(jù)在空白處閃動。

?

7、label1:用來顯示被選編號和學(xué)生信息。

8、label2:用來顯示猜對的總次數(shù)。

9、label3:用來顯示猜錯的總次數(shù)。

10、label4:用來顯示游戲名字“猜猜看”?。

11、label5:用來顯示編號、個人被點總次數(shù)、個人被猜對總次數(shù)、個人被猜錯總次數(shù)的文段。

12、pictureBox1:用來顯示arry1[i]數(shù)組的圖片。

13、pictureBox2:用來顯示arry2[i]數(shù)組的圖片。

14、pictureBox3:用來顯示arry3[i]數(shù)組的圖片。

15、imageList1:用來存儲和顯示相片

?

4、系統(tǒng)具體設(shè)計——代碼實現(xiàn):

1.timer1事件:控制隨機(jī)選取學(xué)號編號,為每個存儲相片的數(shù)組抽取一個隨機(jī)數(shù)。并在選出的編號中再隨機(jī)選取一個編號,作為被猜的編號,同一時候在已創(chuàng)建的文件里。相相應(yīng)的讀取編號相應(yīng)的學(xué)號的信息。

private void timer1_Tick(object sender, EventArgs e)
        {
            long tick = DateTime.Now.Ticks;
            Random ran = new Random((int)(tick & 0xffffffffL) | (int)(tick >> 32));
            for (int i = 0; i < arry1.Length && i < arry2.Length && i < arry3.Length; i++)
            {
                arry1[i] = ran.Next(0, imageList1.Images.Count-1 );
                arry2[i] = ran.Next(0, imageList1.Images.Count-1 );
                arry3[i] = ran.Next(0, imageList1.Images.Count-1 );
                int[] ary = new int[3] { arry1[i], arry2[i], arry3[i] };
                d = r.Next(0, 2);
                x = ary[d];
                num = ary[d].ToString();
               // p = (double)c1[x] / (c1[x] + c2[x]);
                string[] line = File.ReadAllLines(@"C:UsersAdministratorDesktopc#a.txt", UnicodeEncoding.GetEncoding("GB2312"));
                label1.Text = "編號" + ary[d].ToString() + "," + "學(xué)生信息" + line[ary[d]];
            }
        }

2.button1事件:開始猜猜看按鈕。用來控制timer1的執(zhí)行,三張圖片的顯示和listBox1里面的信息以及提示警告

private void button1_Click(object sender, EventArgs e)
        {   
            int[] ary = new int[3] { arry1[i], arry2[i], arry3[i] };
            d = r.Next(0, 3);
            first_click = !first_click;
            if (!first_click)
            {
                timer1.Start();
                button1.Text = "停止";
            }
            else 
            {
                timer1.Stop();
                button1.Text = "開始";
                new System.Drawing.Size(30, 30);
                pictureBox1.Image = imageList1.Images[arry1[i]];
                pictureBox2.Image = imageList1.Images[arry2[i]];
                pictureBox3.Image = imageList1.Images[arry3[i]];
                c[x]++;
             
                if (c[x] > 3) 
                {   
                        MessageBox.Show("警告:該同學(xué)超過三次被點名,請又一次點名");
                        timer1.Start();
                        button1.Text = "停止";
                }
                this.listBox1.Items.Add(num + "    " + c[x]+"      "+count+"    "+count1);
            }
        }

3.pictureBox1事件:發(fā)生點擊圖片事件,推斷圖片與學(xué)生信息是否相相應(yīng),并計算猜對或猜錯的總次數(shù)和個人猜對或猜錯的總次數(shù)及提示猜對或猜錯和游戲結(jié)束或通過。(以此類推pictureBox2事件,pictureBox3事件)

 private void pictureBox1_Click(object sender, EventArgs e)
        {
            int[] ary = new int[3] { arry1[i], arry2[i], arry3[i] };
            d = r.Next(0, 2);
            if (arry1[i] == x)
                {
                    MessageBox.Show("主人,恭喜你,答對了");
                    count++;
                    c1[x]++;
                    label2.Text = "猜對總次數(shù)" + count;
                    this.listBox1.Items.Add(num + "    " + c[x] + "      " + c1[x] + "    " + c2[x]);
                     while(count==10)
                    {
                         MessageBox.Show("主人,恭喜你通過了游戲");
                        
                    }
                     
                }
                
                else {
                    MessageBox.Show("主人,錯了哦,繼續(xù)努力");
                    count1++;
                    c2[x]++;
                    label3.Text = "猜錯總次數(shù)" + count1;
                    this.listBox1.Items.Add(num + "    " + c[x] + "      " + c1[x] + "    " + c2[x]);
                    while (count1 == 10)
                    {
                        MessageBox.Show("主人,非常遺憾,你沒通過游戲");
                       
                    }
                   
                }
        }

4.button2事件:用作“顯示該同學(xué)信息”顯示當(dāng)前同學(xué)被點信息,用作考勤功能

 private void button2_Click(object sender, EventArgs e)
        {
            if (c[x] == 3)
            {
                MessageBox.Show("該同學(xué)第三次被點名");
            }
             if (c[x] == 2)
            {
                MessageBox.Show("該同學(xué)第二次被點名");
            }
          if (c[x] == 1)
            {
                MessageBox.Show("該同學(xué)第一次被點名");
            }
          
        }

5. button3事件:用作重置按鈕,清除listBox1里面記錄的信息

 private void button3_Click(object sender, EventArgs e)
        {
            this.listBox1.Items.Clear();
            result.Clear();
        }

6. button4事件:用作“顯示全部被猜及被點信息”按鈕,顯示全部同學(xué)當(dāng)前被猜和被點的詳細(xì)信息

private void button4_Click(object sender, EventArgs e)
        {
            this.listBox1.Visible = !this.listBox1.Visible;
            this.button3.Visible = !this.button3.Visible;
        }

5、系統(tǒng)實現(xiàn)

1、點擊開始執(zhí)行

c#課程設(shè)計---猜猜看游戲_數(shù)據(jù)庫_02



?

2、點擊開始點名button,開始點名button變成停止button:

? ? ?
c#課程設(shè)計---猜猜看游戲_數(shù)據(jù)庫_03? ? ? ? ? ? ? ?c#課程設(shè)計---猜猜看游戲_重置_04

3、點擊停止button:顯示當(dāng)前隨機(jī)抽取的三張相片和的學(xué)生信息

c#課程設(shè)計---猜猜看游戲_數(shù)組_05

?
4、點擊圖片。若猜對了。彈窗顯示
c#課程設(shè)計---猜猜看游戲_文件流_06


5、點擊圖片,若猜錯了,彈窗顯示

c#課程設(shè)計---猜猜看游戲_數(shù)據(jù)_07


6.若是隨機(jī)點名抽取的編號超過三次。彈窗警告。

c#課程設(shè)計---猜猜看游戲_數(shù)據(jù)_08

7.若猜圖片猜錯十次,彈窗顯示。猜圖片失敗

c#課程設(shè)計---猜猜看游戲_數(shù)組_09

8.若猜圖片猜對十次,彈窗顯示,猜圖片成功

c#課程設(shè)計---猜猜看游戲_數(shù)據(jù)庫_10

9.按一下“該同學(xué)被點信息”的button,彈窗顯示該同學(xué)被點的信息

c#課程設(shè)計---猜猜看游戲_數(shù)組_11

10. 分別按一下“全部被猜及被點次數(shù)”和“重置”button,全部同學(xué)被點名的全部信息在列表框中顯示,重置button則是清除列表框的內(nèi)容。

c#課程設(shè)計---猜猜看游戲_數(shù)組_12? ? ? ? ? ??c#課程設(shè)計---猜猜看游戲_數(shù)據(jù)_13


11. 文本中的學(xué)生信息

c#課程設(shè)計---猜猜看游戲_重置_14



6、小結(jié):

? ? ? ?弄這個游戲斷斷續(xù)續(xù)的花了挺多時間的,大概半個月吧。當(dāng)然這中間穿插了很多雜七雜八的事情,從非常久之前就開始做了,但對于c#還是太陌生了。這和我這學(xué)期沒有花足夠的時間去學(xué)有關(guān),所以一開始設(shè)計時,腦袋一片空白。一點頭緒都沒有,僅僅能從之前作業(yè)的內(nèi)容里找一些靈感。一開始我在選取圖片的方式上花了好多時間,由于對pictureBox接觸不多。還沒能全然會用,這給我一開頭造成好多麻煩,一直卡在這里進(jìn)退不得,那時心里特別煩躁,上網(wǎng)搜資料都是迷迷糊糊的。像一頭盲頭蒼蠅一樣。無從下手。后來把它又?jǐn)R置了幾天后。這時心里也平靜了很多,腦袋也開始慢慢進(jìn)入主題。開始認(rèn)真思考問題。

由于我讀取圖片使用的是文件流函數(shù)。從既定的路徑中讀取圖片,可是我又發(fā)現(xiàn),我無法將圖片里的學(xué)生信息顯示出來。所以我就將圖片的名字改成自然數(shù),把里面的學(xué)生信息提取出來放進(jìn)一個txt文件中面,用lable標(biāo)簽控件顯示出來,但這樣另一個問題又來了,我無法確保圖片和lable標(biāo)簽里的內(nèi)容僅僅有一對相相應(yīng),于是這個問題又困擾了我一天,后來問了一下舍友。經(jīng)她提示,把選出來的那三個圖片編號放進(jìn)一個數(shù)組里,在這個數(shù)組里再用隨機(jī)函數(shù)隨機(jī)選取一個,就能保證圖片和學(xué)生信息的一一相應(yīng)了??墒俏野l(fā)現(xiàn)被改成自然序號的圖片編號和學(xué)生信息之間沒有共同點。這樣就連不起來了;經(jīng)過一番思考,我想到了數(shù)據(jù)庫,我的想法是把學(xué)生信息和圖片編號存進(jìn)數(shù)據(jù)庫。從數(shù)據(jù)庫中讀取就能有共同的鏈接點了。于是我又把讀取相片的方式從文件流換成了從數(shù)據(jù)庫讀取,可是問題非常快出現(xiàn)了。由于我對鏈接數(shù)據(jù)庫的操作全然陌生。盡管之前作業(yè)有試過連接,但當(dāng)時由于電腦軟件問題一直沒連接上,后來就一直擱置了這個操作,在嘗試了一晚以后,我就放棄了用數(shù)據(jù)庫這個念頭。問題似乎又回到了最開始的時候,相片究竟要如何引進(jìn)才干和標(biāo)簽信息同步。由于沒想法,我開始去網(wǎng)上搜搜各類資料,后來我又發(fā)現(xiàn)了用imageList的方法。它用是用數(shù)組存儲相片的方法,這樣我就能共用這個數(shù)組,引進(jìn)每一個pictureBox里面了,經(jīng)過多次測試、改動。最終把相片編碼和標(biāo)簽同步顯示出來了。那時心情真是激動到極點,最終完畢了第一步,果然是萬事開頭難啊。入門了其它事情就能循序漸進(jìn)了,所以我下一步就開始點擊圖片事件了,剛寫這部分時事實上還不是非常有想法的,由于我一直在想的是點擊圖片和標(biāo)簽信息時,相片是會跳動或翻轉(zhuǎn)的,結(jié)果就鉆了牛角尖,一直掙扎怎么讓相片在點擊后能夠自己動,后來寫完程序,調(diào)試后才知道,僅僅要相片的編號和標(biāo)簽信息有一一相應(yīng)的關(guān)系了,就能發(fā)生事件了。所以我在每一個pictureBox事件里寫了三個相同的程序,僅僅要把if語句里的條件語句換成和每一個pictureBox相相應(yīng)的語句即可了,然后在if語句里面相相應(yīng)的加入了messageBox、猜對/猜錯的總次數(shù)等語句,經(jīng)過不斷的改動、加入考勤功能等步驟。最終完畢了初具規(guī)模的猜猜看游戲,盡管功能上另一些不完好,可是我還是挺愜意的。從一竅不通,到自己親自作出一個小游戲,在這過程中收獲的知識非常多,這就像一種積累的財富。一點一點的積累。最后所擁有的一定是別人無法給予的,實踐才是真理,事實上我也能夠做到。

?

我的百度網(wǎng)盤的地址:http://pan.baidu.com/s/1kTszg7H












本文摘自 :https://blog.51cto.com/u

開通會員,享受整站包年服務(wù)立即開通 >