標籤:
//////////////////2015/07/23////////////////
//////////////////by xbw//////////////////////
/////////////////環境 VS2013////////////
這個飛機大戰呢,做了也有好幾天了,我一半以上時間在鼓搗這個資料庫,第一次弄,也學到了不少東西,在此記錄一下,也分享一下經驗;;
接著上次說吧,昨天呢,實現了多組資料的儲存與調用,欣喜若狂,昨天就已經實驗了這個對使用者積分的儲存,但是昨天不只失敗了,而且把來源程式毀了,還好再此貼了完整代碼,很快恢複了,今天一想,如果有了帳號的註冊而沒有得分的記錄,那又有什麼意義呢,於是又鼓搗起來;;終於好了;;
先說一下思路吧,,,,
這個得分要與賬戶匹配,就是把最終得分儲存到當前的使用者,這個呢,為了簡單實現,我做了一個遊戲結束儲存記錄的對話方塊,先看一下布局
這個得分呢,關閉了使用者編輯的功能,遊戲得分就是遊戲得分嘛,不能亂改的,這個帳號呢,就是當前玩家的帳號,需要自行輸入,只要輸錯了,就會把得分儲存到其他使用者中去了,唉,為了簡單實現吧,暫時先不自動匹配了,一會在弄,就是這麼個過程;
在實現過程中,還弄了好多囧事,誰讓自己知識儲備不夠呢;
對於在不同cpp中的資料的相互傳輸讓我大費周折,還建了好多類,不是重複定義就是這那的錯誤,鼓搗一上午還是不行,在尋找資料時,發現了這個可以用全域變數解決,我的天,只用了一個extern int score;
extern ,唉,下邊看主要代碼吧;;;
為儲存記錄對話方塊建立的類jilu類,英語不好,沒辦法;
.cpp
// jilu.cpp : 實現檔案//#pragma once#include "stdafx.h"#include "PlaneGame.h"#include "jilu.h"#include "afxdialogex.h"#include "afxdao.h"//#include "final.h"// jilu 對話方塊IMPLEMENT_DYNAMIC(jilu, CDialogEx)extern int score;jilu::jilu(CWnd* pParent /*=NULL*/): CDialogEx(jilu::IDD, pParent), m_score(0), zhongyu(_T("")){m_score = score;}jilu::~jilu(){}void jilu::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT2, m_score);DDX_Text(pDX, IDC_EDIT1, zhongyu);}BEGIN_MESSAGE_MAP(jilu, CDialogEx)ON_EN_CHANGE(IDC_EDIT2, &jilu::OnEnChangeEdit2)ON_BN_CLICKED(IDOK, &jilu::OnBnClickedOk)END_MESSAGE_MAP()// jilu 訊息處理常式void jilu::OnEnChangeEdit2(){// TODO: 如果該控制項是 RICHEDIT 控制項,它將不// 發送此通知,除非重寫 CDialogEx::OnInitDialog()// 函數並調用 CRichEditCtrl().SetEventMask(),// 同時將 ENM_CHANGE 標誌“或”運算到掩碼中。// TODO: 在此添加控制項通知處理常式代碼//CString str1;//CString str2;//CString str3;/*int a, b;GetDlgItemText(IDC_EDIT1, str1);GetDlgItemText(IDC_EDIT2, str2);a = _wtoi(str1);b = _wtoi(str2);for (int i = a; i <= b; i++){//UpdateData(true); if (i % 3 == 0){str3.Format(_T("%s %d"), str3, i);str3 += _T("\r\n");}//std::cout << std::endl;}*//*CString str3;int score = 100;str3;str3.Format(_T("%s %d"), str3,score);SetDlgItemText(IDC_EDIT2, str3);*/}void jilu::OnBnClickedOk(){CString Str;Str.Format(_T("%d"), score);UpdateData(true);//上一次視頻裡已經講過,續及時更新資料CString Filepath = _T("Database.mdb");CDaoDatabase db;CDaoRecordset Dbset(&db);db.Open(Filepath);Dbset.Open(AFX_DAO_USE_DEFAULT_TYPE, _T("SELECT * FROM DataTable"), 0);if (zhongyu.IsEmpty()){MessageBox(_T("資訊不可為空!"), _T("溫情提示"));}else{CString Sname;COleVariant var;// 欄位類型var.ChangeType(VT_BSTR, NULL);int first = 1;while (!Dbset.IsEOF())// 有沒有到表結尾{Dbset.GetFieldValue(_T("Name"), var);Sname = (LPCSTR)var.pbstrVal;if (Sname.Compare(zhongyu) == 0)//如果密碼和賬戶與資料庫一致{Dbset.Edit();Dbset.SetFieldValue(_T("Score"), _variant_t(Str));Dbset.Update();MessageBox(_T("紀錄已儲存"), _T("溫情提示"));first = 0;break;}else{Dbset.MoveNext();}}if (first){MessageBox(_T("使用者不存在"), _T("溫情提示"));}}Dbset.Close();db.Close();// TODO: 在此添加控制項通知處理常式代碼}
.h
#pragma once// jilu 對話方塊//#include "final.h"class jilu : public CDialogEx{DECLARE_DYNAMIC(jilu)/*private:int fen;public:jilu(){};jilu(int a){ fen = a; }//int get(int a){ fen = a; }int get(){ return fen; }*/public:jilu(CWnd* pParent = NULL); // 標準建構函式virtual ~jilu();int mm_score=0;// 對話方塊資料enum { IDD = IDD_DIALOG3 };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支援DECLARE_MESSAGE_MAP()public:int m_score;afx_msg void OnEnChangeEdit2();afx_msg void OnBnClickedOk();CString zhongyu;};
那個全域變數,放到我們該放的地方,,,就是遊戲結束得分的地方,
int score = 0;int number = 0;int r_life = 10;void CPlaneGameView::UpdateFrame(CDC* pMemDC){//繪製天空/*pMemDC->FillSolidRect(0,0,GAME_WIDTH,GAME_HEIGHT,RGB(84, 142, 239));//繪製我方戰機if(m_pMe!=NULL){m_pMe->Draw(m_pMemDC,FALSE);}else{ //Game OverCString str=_T("Game Over!");pMemDC->SetBkMode(TRANSPARENT);pMemDC->SetTextAlign(TA_CENTER);pMemDC->SetTextColor(RGB(255,0,0));pMemDC->TextOut(GAME_WIDTH/2,GAME_HEIGHT/2,str);}*///背景if (Back_y >= 0){CBitmap MemBitmap;MemBitmap.CreateCompatibleBitmap(m_pDC, GAME_WIDTH, 3072);m_pMemDC->SelectObject(&MemBitmap);image.Draw(*m_pMemDC, 0, 0, GAME_WIDTH, GAME_HEIGHT, 0, Back_y, GAME_WIDTH, GAME_HEIGHT);Back_y -= 1;}if (Back_y <= 0)Back_y = 2000;//繪製我方戰機
就這個意思吧,放到該放的地方 就好了;;;;
這樣呢,中間還有一些問題,再說一下,關於這個Access資料的,好幾次給我彈出記憶體不足了,我想這是什麼鬼,
經過實踐發現了問題,這個變數類型必須要與儲存的資料定義的變數要匹配,整數儲存為字元就會記憶體不足,經驗之談,這個整型轉字元型也找了一個函數,還不錯,挺方便,
CString Str;
Str.Format(_T("%d"), score);
就這樣了,經驗之談,分享給你們了,歡迎學習交流,提出指導性意見,謝謝啦!!!!
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
windows程式設計——飛機大戰筆記(資料庫記錄遊戲得分)