タイム記録機能を作る前は1度もなかったことなのですが、タイム記録機能を実装しているうちにプログラムのウィンドウを閉じてもプロセスにプログラムが残ったままになってしまうようになりました。
ということは、原因はタイム記録機能実装部分にあり、ウィンドウを閉じても見えてないところで何かの処理が終了できていないということですよね?
でも、プログラムを起動してプレイせずに閉じただけでもプロセスにプログラムが残ったままになってしまうし、今の私では何が原因かわかっていません。
作りかけのマインスイーパーView.cppを、長いのでスポイラーテキストで載せてみます。
► スポイラーを表示
// マインスイーパーView.cpp : CマインスイーパーView クラスの実装
//
#include "stdafx.h"
#include "マインスイーパー.h"
#include "マインスイーパーDoc.h"
#include "マインスイーパーView.h"
#ifdef _DEBUG
#define new DEBUG_NEW#endif
// CマインスイーパーView
IMPLEMENT_DYNCREATE(CマインスイーパーView, CView)
BEGIN_MESSAGE_MAP(CマインスイーパーView, CView)
// 標準印刷コマンド
ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONDBLCLK()
ON_WM_RBUTTONDOWN()
ON_WM_TIMER()
ON_COMMAND(ID_NEW_GAME, &CマインスイーパーView::NewGame)
END_MESSAGE_MAP()
// CマインスイーパーView コンストラクション/デストラクション
CマインスイーパーView::CマインスイーパーView()
{
// TODO: 構築コードをここに追加します。
srand((unsigned)time(NULL));
LoadSetting();
GameSetting();
}
CマインスイーパーView::~CマインスイーパーView()
{
}
BOOL CマインスイーパーView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: この位置で CREATESTRUCT cs を修正して Window クラスまたはスタイルを
// 修正してください。
return CView::PreCreateWindow(cs);
}
// CマインスイーパーView 描画
void CマインスイーパーView::OnDraw(CDC* pDC)
{
CマインスイーパーDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: この場所にネイティブ データ用の描画コードを追加します。
CDC windowDC;
windowDC.CreateCompatibleDC(pDC);
CBitmap make_picture;
make_picture.CreateCompatibleBitmap(pDC,width,height);
windowDC.SelectObject(&make_picture);
CPen white(PS_SOLID,1,RGB(255,255,255));
windowDC.SelectObject(&white);
windowDC.Rectangle(0,0,width,height);
char num[4];
sprintf(num,"%d",timer);
windowDC.TextOutW(15,11,(CString)num);
CPen black(PS_SOLID,1,RGB(0,0,0));
windowDC.SelectObject(&black);
CBrush block_color;
for(int x=0;x<blocks.x;x++){
for(int y=0;y<blocks.y;y++){
if(data[x][y]<0){
block_color.CreateSolidBrush(RGB(180,180,180));
}
else if(data[x][y]==9){
block_color.CreateSolidBrush(RGB(255,0,0));
}
else{
block_color.CreateSolidBrush(RGB(210,210,210));
}
windowDC.SelectObject(&block_color);
windowDC.Rectangle(block[x][y]);
if(data[x][y]==-2){
block_color.DeleteObject();
block_color.CreateSolidBrush(RGB(0,255,0));
windowDC.SelectObject(&block_color);
windowDC.Ellipse(block[x][y]);
}
else if(data[x][y]==9){
windowDC.Ellipse(block[x][y]);
}
else if(data[x][y]==10){
block_color.DeleteObject();
block_color.CreateSolidBrush(RGB(0,0,255));
windowDC.SelectObject(&block_color);
windowDC.Ellipse(block[x][y]);
}
else if(data[x][y]==11){
block_color.DeleteObject();
block_color.CreateSolidBrush(RGB(255,255,0));
windowDC.SelectObject(&block_color);
windowDC.Ellipse(block[x][y]);
}
else if(data[x][y]>0){
switch(data[x][y]){
case 8:
windowDC.SetTextColor(RGB(255,0,0));
break;
case 7:
windowDC.SetTextColor(RGB(255,85,0));
break;
case 6:
windowDC.SetTextColor(RGB(255,255,0));
break;
case 5:
windowDC.SetTextColor(RGB(0,255,0));
break;
case 4:
windowDC.SetTextColor(RGB(0,86,0));
break;
case 3:
windowDC.SetTextColor(RGB(0,255,255));
break;
case 2:
windowDC.SetTextColor(RGB(0,0,255));
break;
case 1:
windowDC.SetTextColor(RGB(255,0,255));
break;
}
sprintf(num,"%d",data[x][y]);
windowDC.SetBkMode(TRANSPARENT);
windowDC.TextOutW(x*20+15,y*20+41,(CString)num);
}
block_color.DeleteObject();
}
}
pDC->BitBlt(0,0,width,height,&windowDC,0,0,SRCCOPY);
}
// CマインスイーパーView 印刷
BOOL CマインスイーパーView::OnPreparePrinting(CPrintInfo* pInfo)
{
// 既定の印刷準備
return DoPreparePrinting(pInfo);
}
void CマインスイーパーView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 印刷前の特別な初期化処理を追加してください。
}
void CマインスイーパーView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 印刷後の後処理を追加してください。
}
// CマインスイーパーView 診断
#ifdef _DEBUG
void CマインスイーパーView::AssertValid() const
{
CView::AssertValid();
}
void CマインスイーパーView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CマインスイーパーDoc* CマインスイーパーView::GetDocument() const // デバッグ以外のバージョンはインラインです。
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CマインスイーパーDoc)));
return (CマインスイーパーDoc*)m_pDocument;
}
#endif //_DEBUG
// CマインスイーパーView メッセージ ハンドラ
void CマインスイーパーView::LoadSetting(){
FILE *fp;
fp=fopen("game.setting","r");
if(fp==NULL){
fp=fopen("game.setting","w");
fprintf(fp,"1 9 9 10\n1 1 0");
fclose(fp);
fp=fopen("game.setting","r");
}
fscanf(fp,"%d %d %d %d",&mode,&height,&width,&bomsr);
fscanf(fp,"%d %d %d",&record,&date,&same);
fclose(fp);
blocks.SetPoint(width,height);
width=blocks.x*20+20;
height=blocks.y*20+50;
if(mode==0){
;
}
else{
;
}
}
void CマインスイーパーView::NewGame(){
KillTimer(1);
GameSetting();
Invalidate(false);
}
void CマインスイーパーView::GameSetting(){
map=(int **)malloc(sizeof(int *)*blocks.x);
data=(int **)malloc(sizeof(int *)*blocks.x);
block=(CRect **)malloc(sizeof(CRect *)*blocks.x);
for(int x=0;x<blocks.x;x++){
map[x]=(int *)malloc(sizeof(int)*blocks.y);
data[x]=(int *)malloc(sizeof(int)*blocks.y);
block[x]=(CRect *)malloc(sizeof(CRect)*blocks.y);
}
for(int x=0;x<blocks.x;x++){
for(int y=0;y<blocks.y;y++){
block[x][y].SetRect(x*20+10,y*20+40,x*20+30,y*20+60);
map[x][y]=0;
data[x][y]=-1;
}
}
int bom=0;
boms=bomsr;
while(bom<boms){
int x=rand()%blocks.x;
int y=rand()%blocks.y;
while(map[x][y]!=0){
x=rand()%blocks.x;
y=rand()%blocks.y;
}
map[x][y]=9;
for(int x2=x-1;x2<=x+1;x2++){
for(int y2=y-1;y2<=y+1;y2++){
if((x2>-1 && x2<blocks.x) && (y2>-1 && y2<blocks.y) && map[x2][y2]!=9){
map[x2][y2]++;
}
}
}
bom++;
}
marks=0;
game=-1;
timer=0;
}
void CマインスイーパーView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。
CView::OnLButtonDown(nFlags, point);
if(game==-1){
SetTimer(1,1000,NULL);
timer=1;
game=0;
}
if(game==0){
for(int x=0;x<blocks.x;x++){
for(int y=0;y<blocks.y;y++){
if(PtInRect(block[x][y],point)==1){
if(data[x][y]!=-2){
data[x][y]=map[x][y];
bool check=true;
for(int x0=0;x0<blocks.x;x0++){
for(int y0=0;y0<blocks.y;y0++){
if(data[x0][y0]<0 && map[x0][y0]!=9){
check=false;
break;
}
}
if(check==false){
break;
}
}
if(check==true && data[x][y]!=9){
GameClear();
return;
}
else{
if(data[x][y]==0){
open(x,y);
}
else if(data[x][y]==9){
bom.x=x;
bom.y=y;
GameOver();
}
}
}
}
}
}
Invalidate(false);
}
}
void CマインスイーパーView::open(int x,int y){
if(data[x][y]==0){
for(int x2=x-1;x2<=x+1;x2++){
for(int y2=y-1;y2<=y+1;y2++){
if((x2>-1 && x2<blocks.x) && (y2>-1 && y2<blocks.y) && !(x2==x && y2==y) && data[x2][y2]==-1){
data[x2][y2]=map[x2][y2];
bool check=true;
for(int x0=0;x0<blocks.x;x0++){
for(int y0=0;y0<blocks.y;y0++){
if(data[x0][y0]<0 && map[x0][y0]!=9){
check=false;
break;
}
}
if(check==false){
break;
}
}
if(check==true){
GameClear();
return;
}
else{
open(x2,y2);
}
}
}
}
}
else{
return;
}
}
void CマインスイーパーView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。
CView::OnLButtonDown(nFlags, point);
if(game==0){
for(int x=0;x<blocks.x;x++){
for(int y=0;y<blocks.y;y++){
if(PtInRect(block[x][y],point)==1){
if(data[x][y]>0){
int count=0;
for(int x2=x-1;x2<=x+1;x2++){
for(int y2=y-1;y2<=y+1;y2++){
if((x2>-1 && x2<9) && (y2>-1 && y2<9) && data[x2][y2]==-2){
count++;
}
}
}
if(count==data[x][y]){
for(int x2=x-1;x2<=x+1;x2++){
for(int y2=y-1;y2<=y+1;y2++){
if((x2>-1 && x2<9) && (y2>-1 && y2<9) && data[x2][y2]!=-2){
data[x2][y2]=map[x2][y2];
if(data[x2][y2]==0){
open(x2,y2);
bool check=true;
for(int x0=0;x0<blocks.x;x0++){
for(int y0=0;y0<blocks.y;y0++){
if(data[x0][y0]<0 && map[x0][y0]!=9){
check=false;
break;
}
}
if(check==false){
break;
}
}
if(check==true && data[x][y]!=9){
bom.x=x;
bom.y=y;
GameClear();
return;
}
}
else if(data[x2][y2]==9){
GameOver();
}
}
}
}
}
}
}
}
}
Invalidate(false);
}
}
void CマインスイーパーView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。
if(game==-1){
SetTimer(1,1000,NULL);
timer=1;
game=0;
}
if(game==0){
CView::OnRButtonDown(nFlags, point);
for(int x=0;x<blocks.x;x++){
for(int y=0;y<blocks.y;y++){
if(PtInRect(block[x][y],point)==1){
if(data[x][y]==-1){
data[x][y]=-2;
marks++;
}
else if(data[x][y]==-2){
data[x][y]=-1;
marks--;
}
}
}
}
Invalidate(false);
}
}
void CマインスイーパーView::OnTimer(UINT_PTR nIDEvent){
switch(game){
case 0:
if(timer<999){
timer++;
Invalidate(false);
}
break;
case 1:
for(int x=0;x<blocks.x;x++){
for(int y=0;y<blocks.y;y++){
if(map[x][y]==9){
data[x][y]=10;
}
}
}
Invalidate(false);
KillTimer(1);
if(record==true){
SaveRecord();
}
break;
case 2:
if(boms>0 || marks>0){
int n=1;
int bomc=0;
while(bom.x-n>-1 || bom.x+n<9 || bom.y-n>-1 || bom.y+n<9){
for(int x=bom.x-n;x<=bom.x+n;x++){
for(int y=bom.y-n;y<=bom.y+n;y++){
if((x>-1 && x<9) && (y>-1 && y<9) && (y==bom.y-n || x==bom.x-n || y==bom.y+n || x==bom.x+n)){
if(map[x][y]==9){
bomc++;
if(bomc>=boms){
if(data[x][y]==-2){
data[x][y]=10;
marks--;
}
else{
data[x][y]=map[x][y];
}
boms--;
Invalidate(false);
return;
}
}
else if(data[x][y]==-2){
data[x][y]=11;
marks--;
Invalidate(false);
return;
}
}
}
}
n++;
}
}
else{
KillTimer(1);
if(record==true){
SaveRecord();
}
}
break;
}
}
void CマインスイーパーView::GameOver(){
boms--;
game=2;
KillTimer(1);
SetTimer(1,1000,NULL);
}
void CマインスイーパーView::GameClear(){
game=1;
KillTimer(1);
SetTimer(1,1000,NULL);
}
void CマインスイーパーView::SaveRecord(){
CTime ctime;
ctime=CTime::GetCurrentTime();
FILE *fp;
fp=fopen("time.score","r");
if(fp==NULL){
fp=fopen("time.score","w");
int grade=1;
while(grade<4){
if(grade==1){
fprintf(fp,"初級\n");
}
else if(grade==2){
fprintf(fp,"中級\n");
}
else if(grade==3){
fprintf(fp,"上級\n");
}
fprintf(fp,"プレイ回数0 クリア回数0 クリア率0% 連勝数0 連敗数0 現在0\n");
for(int n=0;n<10;n++){
fprintf(fp,"999 名無し 0000/00/00 00:00:00\n");
}
grade++;
}
fclose(fp);
fp=fopen("time.score","r");
}
char grade[3][5],numbers[3][100],record[3][10][50];
for(int n=0;n<3;n++){
fscanf(fp,"%s",grade[n]);
fscanf(fp,"%s",numbers[n]);
for(int m=0;m<10;m++){
fscanf(fp,"%s",record[n][m]);
}
}
fclose(fp);
int play,clear,late,renwin,renrose,now;
sscanf(numbers[mode+1],"プレイ回数%d クリア回数%d クリア率%d% 連勝数%d 連敗数%d 現在%d",&play,&clear,&late,&renwin,&renrose,&now);
play++;
if(game==1){
clear++;
if(now>0){
now++;
if(renwin<now){
renwin=now;
}
}
else{
now=1;
}
}
else{
if(now<0){
now--;
if(renrose<abs(now)){
renrose=abs(now);
}
}
else{
now=-1;
}
}
late=(int)(((float)clear/(float)play)*100.0);
sprintf(numbers[mode+1],"プレイ回数%d クリア回数%d クリア率%d% 連勝数%d 連敗数%d 現在%d\n",play,clear,late,renwin,renrose,now);
if(game==1){
int rank,time[11];
char data[50];
for(int n=0;n<10;n++){
sscanf(record[mode+1][n],"%d. %d %s",&rank,&time[n],data);
}
time[10]=timer;
rank=9;
while(rank>=0){
if(time[rank+1]<time[rank]){
time[rank]=time[rank+1];
rank--;
}
else{
break;
}
}
if(rank<9){
char name[20];
sprintf(record[mode+1][10],"%d %s %d/%d/%d %d:%d:%d",timer,name,ctime.GetYear(),ctime.GetMonth(),ctime.GetDay(),ctime.GetHour(),ctime.GetMinute(),ctime.GetSecond());
int n=9;
while(n>rank){
strcpy(data,record[mode+1][n]);
strcpy(record[mode+1][n],record[mode+1][n+1]);
strcpy(record[mode+1][n+1],data);
}
}
}
fp=fopen("time.score","w");
for(int n=0;n<3;n++){
fprintf(fp,"%s\n",grade[n]);
fprintf(fp,"%s\n",numbers[n]);
for(int m=0;m<10;m++){
fprintf(fp,"%s\n",record[n][m]);
}
}
fclose(fp);
}
//
#include "stdafx.h"
#include "マインスイーパー.h"
#include "マインスイーパーDoc.h"
#include "マインスイーパーView.h"
#ifdef _DEBUG
#define new DEBUG_NEW#endif
// CマインスイーパーView
IMPLEMENT_DYNCREATE(CマインスイーパーView, CView)
BEGIN_MESSAGE_MAP(CマインスイーパーView, CView)
// 標準印刷コマンド
ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONDBLCLK()
ON_WM_RBUTTONDOWN()
ON_WM_TIMER()
ON_COMMAND(ID_NEW_GAME, &CマインスイーパーView::NewGame)
END_MESSAGE_MAP()
// CマインスイーパーView コンストラクション/デストラクション
CマインスイーパーView::CマインスイーパーView()
{
// TODO: 構築コードをここに追加します。
srand((unsigned)time(NULL));
LoadSetting();
GameSetting();
}
CマインスイーパーView::~CマインスイーパーView()
{
}
BOOL CマインスイーパーView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: この位置で CREATESTRUCT cs を修正して Window クラスまたはスタイルを
// 修正してください。
return CView::PreCreateWindow(cs);
}
// CマインスイーパーView 描画
void CマインスイーパーView::OnDraw(CDC* pDC)
{
CマインスイーパーDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: この場所にネイティブ データ用の描画コードを追加します。
CDC windowDC;
windowDC.CreateCompatibleDC(pDC);
CBitmap make_picture;
make_picture.CreateCompatibleBitmap(pDC,width,height);
windowDC.SelectObject(&make_picture);
CPen white(PS_SOLID,1,RGB(255,255,255));
windowDC.SelectObject(&white);
windowDC.Rectangle(0,0,width,height);
char num[4];
sprintf(num,"%d",timer);
windowDC.TextOutW(15,11,(CString)num);
CPen black(PS_SOLID,1,RGB(0,0,0));
windowDC.SelectObject(&black);
CBrush block_color;
for(int x=0;x<blocks.x;x++){
for(int y=0;y<blocks.y;y++){
if(data[x][y]<0){
block_color.CreateSolidBrush(RGB(180,180,180));
}
else if(data[x][y]==9){
block_color.CreateSolidBrush(RGB(255,0,0));
}
else{
block_color.CreateSolidBrush(RGB(210,210,210));
}
windowDC.SelectObject(&block_color);
windowDC.Rectangle(block[x][y]);
if(data[x][y]==-2){
block_color.DeleteObject();
block_color.CreateSolidBrush(RGB(0,255,0));
windowDC.SelectObject(&block_color);
windowDC.Ellipse(block[x][y]);
}
else if(data[x][y]==9){
windowDC.Ellipse(block[x][y]);
}
else if(data[x][y]==10){
block_color.DeleteObject();
block_color.CreateSolidBrush(RGB(0,0,255));
windowDC.SelectObject(&block_color);
windowDC.Ellipse(block[x][y]);
}
else if(data[x][y]==11){
block_color.DeleteObject();
block_color.CreateSolidBrush(RGB(255,255,0));
windowDC.SelectObject(&block_color);
windowDC.Ellipse(block[x][y]);
}
else if(data[x][y]>0){
switch(data[x][y]){
case 8:
windowDC.SetTextColor(RGB(255,0,0));
break;
case 7:
windowDC.SetTextColor(RGB(255,85,0));
break;
case 6:
windowDC.SetTextColor(RGB(255,255,0));
break;
case 5:
windowDC.SetTextColor(RGB(0,255,0));
break;
case 4:
windowDC.SetTextColor(RGB(0,86,0));
break;
case 3:
windowDC.SetTextColor(RGB(0,255,255));
break;
case 2:
windowDC.SetTextColor(RGB(0,0,255));
break;
case 1:
windowDC.SetTextColor(RGB(255,0,255));
break;
}
sprintf(num,"%d",data[x][y]);
windowDC.SetBkMode(TRANSPARENT);
windowDC.TextOutW(x*20+15,y*20+41,(CString)num);
}
block_color.DeleteObject();
}
}
pDC->BitBlt(0,0,width,height,&windowDC,0,0,SRCCOPY);
}
// CマインスイーパーView 印刷
BOOL CマインスイーパーView::OnPreparePrinting(CPrintInfo* pInfo)
{
// 既定の印刷準備
return DoPreparePrinting(pInfo);
}
void CマインスイーパーView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 印刷前の特別な初期化処理を追加してください。
}
void CマインスイーパーView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 印刷後の後処理を追加してください。
}
// CマインスイーパーView 診断
#ifdef _DEBUG
void CマインスイーパーView::AssertValid() const
{
CView::AssertValid();
}
void CマインスイーパーView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CマインスイーパーDoc* CマインスイーパーView::GetDocument() const // デバッグ以外のバージョンはインラインです。
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CマインスイーパーDoc)));
return (CマインスイーパーDoc*)m_pDocument;
}
#endif //_DEBUG
// CマインスイーパーView メッセージ ハンドラ
void CマインスイーパーView::LoadSetting(){
FILE *fp;
fp=fopen("game.setting","r");
if(fp==NULL){
fp=fopen("game.setting","w");
fprintf(fp,"1 9 9 10\n1 1 0");
fclose(fp);
fp=fopen("game.setting","r");
}
fscanf(fp,"%d %d %d %d",&mode,&height,&width,&bomsr);
fscanf(fp,"%d %d %d",&record,&date,&same);
fclose(fp);
blocks.SetPoint(width,height);
width=blocks.x*20+20;
height=blocks.y*20+50;
if(mode==0){
;
}
else{
;
}
}
void CマインスイーパーView::NewGame(){
KillTimer(1);
GameSetting();
Invalidate(false);
}
void CマインスイーパーView::GameSetting(){
map=(int **)malloc(sizeof(int *)*blocks.x);
data=(int **)malloc(sizeof(int *)*blocks.x);
block=(CRect **)malloc(sizeof(CRect *)*blocks.x);
for(int x=0;x<blocks.x;x++){
map[x]=(int *)malloc(sizeof(int)*blocks.y);
data[x]=(int *)malloc(sizeof(int)*blocks.y);
block[x]=(CRect *)malloc(sizeof(CRect)*blocks.y);
}
for(int x=0;x<blocks.x;x++){
for(int y=0;y<blocks.y;y++){
block[x][y].SetRect(x*20+10,y*20+40,x*20+30,y*20+60);
map[x][y]=0;
data[x][y]=-1;
}
}
int bom=0;
boms=bomsr;
while(bom<boms){
int x=rand()%blocks.x;
int y=rand()%blocks.y;
while(map[x][y]!=0){
x=rand()%blocks.x;
y=rand()%blocks.y;
}
map[x][y]=9;
for(int x2=x-1;x2<=x+1;x2++){
for(int y2=y-1;y2<=y+1;y2++){
if((x2>-1 && x2<blocks.x) && (y2>-1 && y2<blocks.y) && map[x2][y2]!=9){
map[x2][y2]++;
}
}
}
bom++;
}
marks=0;
game=-1;
timer=0;
}
void CマインスイーパーView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。
CView::OnLButtonDown(nFlags, point);
if(game==-1){
SetTimer(1,1000,NULL);
timer=1;
game=0;
}
if(game==0){
for(int x=0;x<blocks.x;x++){
for(int y=0;y<blocks.y;y++){
if(PtInRect(block[x][y],point)==1){
if(data[x][y]!=-2){
data[x][y]=map[x][y];
bool check=true;
for(int x0=0;x0<blocks.x;x0++){
for(int y0=0;y0<blocks.y;y0++){
if(data[x0][y0]<0 && map[x0][y0]!=9){
check=false;
break;
}
}
if(check==false){
break;
}
}
if(check==true && data[x][y]!=9){
GameClear();
return;
}
else{
if(data[x][y]==0){
open(x,y);
}
else if(data[x][y]==9){
bom.x=x;
bom.y=y;
GameOver();
}
}
}
}
}
}
Invalidate(false);
}
}
void CマインスイーパーView::open(int x,int y){
if(data[x][y]==0){
for(int x2=x-1;x2<=x+1;x2++){
for(int y2=y-1;y2<=y+1;y2++){
if((x2>-1 && x2<blocks.x) && (y2>-1 && y2<blocks.y) && !(x2==x && y2==y) && data[x2][y2]==-1){
data[x2][y2]=map[x2][y2];
bool check=true;
for(int x0=0;x0<blocks.x;x0++){
for(int y0=0;y0<blocks.y;y0++){
if(data[x0][y0]<0 && map[x0][y0]!=9){
check=false;
break;
}
}
if(check==false){
break;
}
}
if(check==true){
GameClear();
return;
}
else{
open(x2,y2);
}
}
}
}
}
else{
return;
}
}
void CマインスイーパーView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。
CView::OnLButtonDown(nFlags, point);
if(game==0){
for(int x=0;x<blocks.x;x++){
for(int y=0;y<blocks.y;y++){
if(PtInRect(block[x][y],point)==1){
if(data[x][y]>0){
int count=0;
for(int x2=x-1;x2<=x+1;x2++){
for(int y2=y-1;y2<=y+1;y2++){
if((x2>-1 && x2<9) && (y2>-1 && y2<9) && data[x2][y2]==-2){
count++;
}
}
}
if(count==data[x][y]){
for(int x2=x-1;x2<=x+1;x2++){
for(int y2=y-1;y2<=y+1;y2++){
if((x2>-1 && x2<9) && (y2>-1 && y2<9) && data[x2][y2]!=-2){
data[x2][y2]=map[x2][y2];
if(data[x2][y2]==0){
open(x2,y2);
bool check=true;
for(int x0=0;x0<blocks.x;x0++){
for(int y0=0;y0<blocks.y;y0++){
if(data[x0][y0]<0 && map[x0][y0]!=9){
check=false;
break;
}
}
if(check==false){
break;
}
}
if(check==true && data[x][y]!=9){
bom.x=x;
bom.y=y;
GameClear();
return;
}
}
else if(data[x2][y2]==9){
GameOver();
}
}
}
}
}
}
}
}
}
Invalidate(false);
}
}
void CマインスイーパーView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。
if(game==-1){
SetTimer(1,1000,NULL);
timer=1;
game=0;
}
if(game==0){
CView::OnRButtonDown(nFlags, point);
for(int x=0;x<blocks.x;x++){
for(int y=0;y<blocks.y;y++){
if(PtInRect(block[x][y],point)==1){
if(data[x][y]==-1){
data[x][y]=-2;
marks++;
}
else if(data[x][y]==-2){
data[x][y]=-1;
marks--;
}
}
}
}
Invalidate(false);
}
}
void CマインスイーパーView::OnTimer(UINT_PTR nIDEvent){
switch(game){
case 0:
if(timer<999){
timer++;
Invalidate(false);
}
break;
case 1:
for(int x=0;x<blocks.x;x++){
for(int y=0;y<blocks.y;y++){
if(map[x][y]==9){
data[x][y]=10;
}
}
}
Invalidate(false);
KillTimer(1);
if(record==true){
SaveRecord();
}
break;
case 2:
if(boms>0 || marks>0){
int n=1;
int bomc=0;
while(bom.x-n>-1 || bom.x+n<9 || bom.y-n>-1 || bom.y+n<9){
for(int x=bom.x-n;x<=bom.x+n;x++){
for(int y=bom.y-n;y<=bom.y+n;y++){
if((x>-1 && x<9) && (y>-1 && y<9) && (y==bom.y-n || x==bom.x-n || y==bom.y+n || x==bom.x+n)){
if(map[x][y]==9){
bomc++;
if(bomc>=boms){
if(data[x][y]==-2){
data[x][y]=10;
marks--;
}
else{
data[x][y]=map[x][y];
}
boms--;
Invalidate(false);
return;
}
}
else if(data[x][y]==-2){
data[x][y]=11;
marks--;
Invalidate(false);
return;
}
}
}
}
n++;
}
}
else{
KillTimer(1);
if(record==true){
SaveRecord();
}
}
break;
}
}
void CマインスイーパーView::GameOver(){
boms--;
game=2;
KillTimer(1);
SetTimer(1,1000,NULL);
}
void CマインスイーパーView::GameClear(){
game=1;
KillTimer(1);
SetTimer(1,1000,NULL);
}
void CマインスイーパーView::SaveRecord(){
CTime ctime;
ctime=CTime::GetCurrentTime();
FILE *fp;
fp=fopen("time.score","r");
if(fp==NULL){
fp=fopen("time.score","w");
int grade=1;
while(grade<4){
if(grade==1){
fprintf(fp,"初級\n");
}
else if(grade==2){
fprintf(fp,"中級\n");
}
else if(grade==3){
fprintf(fp,"上級\n");
}
fprintf(fp,"プレイ回数0 クリア回数0 クリア率0% 連勝数0 連敗数0 現在0\n");
for(int n=0;n<10;n++){
fprintf(fp,"999 名無し 0000/00/00 00:00:00\n");
}
grade++;
}
fclose(fp);
fp=fopen("time.score","r");
}
char grade[3][5],numbers[3][100],record[3][10][50];
for(int n=0;n<3;n++){
fscanf(fp,"%s",grade[n]);
fscanf(fp,"%s",numbers[n]);
for(int m=0;m<10;m++){
fscanf(fp,"%s",record[n][m]);
}
}
fclose(fp);
int play,clear,late,renwin,renrose,now;
sscanf(numbers[mode+1],"プレイ回数%d クリア回数%d クリア率%d% 連勝数%d 連敗数%d 現在%d",&play,&clear,&late,&renwin,&renrose,&now);
play++;
if(game==1){
clear++;
if(now>0){
now++;
if(renwin<now){
renwin=now;
}
}
else{
now=1;
}
}
else{
if(now<0){
now--;
if(renrose<abs(now)){
renrose=abs(now);
}
}
else{
now=-1;
}
}
late=(int)(((float)clear/(float)play)*100.0);
sprintf(numbers[mode+1],"プレイ回数%d クリア回数%d クリア率%d% 連勝数%d 連敗数%d 現在%d\n",play,clear,late,renwin,renrose,now);
if(game==1){
int rank,time[11];
char data[50];
for(int n=0;n<10;n++){
sscanf(record[mode+1][n],"%d. %d %s",&rank,&time[n],data);
}
time[10]=timer;
rank=9;
while(rank>=0){
if(time[rank+1]<time[rank]){
time[rank]=time[rank+1];
rank--;
}
else{
break;
}
}
if(rank<9){
char name[20];
sprintf(record[mode+1][10],"%d %s %d/%d/%d %d:%d:%d",timer,name,ctime.GetYear(),ctime.GetMonth(),ctime.GetDay(),ctime.GetHour(),ctime.GetMinute(),ctime.GetSecond());
int n=9;
while(n>rank){
strcpy(data,record[mode+1][n]);
strcpy(record[mode+1][n],record[mode+1][n+1]);
strcpy(record[mode+1][n+1],data);
}
}
}
fp=fopen("time.score","w");
for(int n=0;n<3;n++){
fprintf(fp,"%s\n",grade[n]);
fprintf(fp,"%s\n",numbers[n]);
for(int m=0;m<10;m++){
fprintf(fp,"%s\n",record[n][m]);
}
}
fclose(fp);
}