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

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

1:游戲要求

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

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

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

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

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

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

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

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

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

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

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

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

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

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

?

2、記錄某一個(gè)學(xué)號(hào)每次被猜的信息及被點(diǎn)名信息。

?

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

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

又一次點(diǎn)名。

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

?

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

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

?

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

?

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

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

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

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

?

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

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

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

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

11、label5:用來顯示編號(hào)、個(gè)人被點(diǎn)總次數(shù)、個(gè)人被猜對(duì)總次數(shù)、個(gè)人被猜錯(cuò)總次數(shù)的文段。

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

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

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

15、imageList1:用來存儲(chǔ)和顯示相片

?

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

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

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 = "編號(hào)" + 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é)超過三次被點(diǎn)名,請(qǐng)又一次點(diǎn)名");
                        timer1.Start();
                        button1.Text = "停止";
                }
                this.listBox1.Items.Add(num + "    " + c[x]+"      "+count+"    "+count1);
            }
        }

3.pictureBox1事件:發(fā)生點(diǎn)擊圖片事件,推斷圖片與學(xué)生信息是否相相應(yīng),并計(jì)算猜對(duì)或猜錯(cuò)的總次數(shù)和個(gè)人猜對(duì)或猜錯(cuò)的總次數(shù)及提示猜對(duì)或猜錯(cuò)和游戲結(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("主人,恭喜你,答對(duì)了");
                    count++;
                    c1[x]++;
                    label2.Text = "猜對(duì)總次數(shù)" + count;
                    this.listBox1.Items.Add(num + "    " + c[x] + "      " + c1[x] + "    " + c2[x]);
                     while(count==10)
                    {
                         MessageBox.Show("主人,恭喜你通過了游戲");
                        
                    }
                     
                }
                
                else {
                    MessageBox.Show("主人,錯(cuò)了哦,繼續(xù)努力");
                    count1++;
                    c2[x]++;
                    label3.Text = "猜錯(cuò)總次數(shù)" + count1;
                    this.listBox1.Items.Add(num + "    " + c[x] + "      " + c1[x] + "    " + c2[x]);
                    while (count1 == 10)
                    {
                        MessageBox.Show("主人,非常遺憾,你沒通過游戲");
                       
                    }
                   
                }
        }

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

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

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

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

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

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

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

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

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



?

2、點(diǎn)擊開始點(diǎn)名button,開始點(diǎn)名button變成停止button:

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

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

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

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


5、點(diǎn)擊圖片,若猜錯(cuò)了,彈窗顯示

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


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

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

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

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

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

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

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

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

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

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


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

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



6、小結(jié):

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

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

?

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












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

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