1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
| #include "tou.h"
//战绩显示 s16 winnum[3] = { 0 };// 三个数字,分别代表 win,lose, tie TCHAR winbuffer[256]; RECT win_p = { 106, 432, 144, 453 }; RECT tie_p = { 235, 432, 273, 453 }; RECT lose_p = { 368, 432, 406, 453 };
COLORREF bar_color = WHITE; //鼠标是否在矩形内 s16 t_mouseIfIn(s16 x0, s16 y0, s16 x1, s16 y1) { if (mouse.x > x0 && mouse.y > y0 && mouse.x < x1 && mouse.y < y1) { return 1; } else return 0; }
//内边显示标记 void t_markBar(s16 x0, s16 y0, s16 x1, s16 y1) { if (t_mouseIfIn(x0, y0, x1, y1) == 1) { bar_color = getpixel(x0+2, y0+2);//注意,这里因为要防止重复调用而覆盖(即RGB被搞成了0,255 setlinestyle(PS_DASH,1); setlinecolor(RGB(0,255,0)); rectangle(x0+1, y0+1, x1-1, y1-1); } else if (t_mouseIfIn(x0, y0, x1, y1) != 1) { setlinestyle(PS_SOLID,1); setlinecolor(bar_color); rectangle(x0+1, y0+1, x1-1, y1-1); } }
//判断鼠标所处格子数,集成于jug_light s16 jug_inbox(ExMessage mouse) { s16 i; for (i = 0; i < 9; i++) { if (mouse.x > box[i][0] && mouse.x<box[i][2] && mouse.y>box[i][1] && mouse.y < box[i][3]) { break; } } //这里的 i 便是格子的位置 return i; }//确定鼠标在格子i,i max为8,9为在格子外。 //区域i高亮显示,并附带i s16 jug_light(ExMessage mouse, s16* ii) { //重要 s16 i = *ii;// 读取i0 i = jug_inbox(mouse);//i1 if (i != *ii) {//i1不等于i0,表示i发生变化,此时保存格子i1贴图 if (*ii != 9) { putimage(box[*ii][0], box[*ii][1], &Temp2);//还原i0 } if (i != 9) { getimage(&Temp2, box[i][0], box[i][1], box[i][2] - box[i][0], box[i][3] - box[i][1]); } }//储存i1的贴图。 if (i != 9) { setfillstyle(BS_SOLID);//绘图 setfillcolor(RGB(224, 224, 224)); setrop2(R2_MASKPEN);//二元光栅,设定AND,实现背景底色。 solidrectangle(box[i][0] + 7, box[i][1] + 7, box[i][2] - 7, box[i][3] - 7);//格子 i RGB提示 } *ii = i;//保存新的i1,使其在下一个循环变成i0 return i;//返回鼠标所在格子i }
//返回游戏结束状态,0,1,2,3分别代表:游戏中,⭕胜,×胜,平局 s16 judge_win() { s16 i, j; s16 ifno0 = 1; for (i = 0; i < 3; i++) { if (tip[i][0] == 1 && tip[i][1] == 1 && tip[i][2] == 1) {//三行胜利 return 1; } } for (j = 0; j < 3; j++) { if (tip[0][j] == 1 && tip[1][j] == 1 && tip[2][j] == 1) {//三列胜利 return 1; } } if (tip[0][0] == 1 && tip[1][1] == 1 && tip[2][2] == 1) return 1; if (tip[0][2] == 1 && tip[1][1] == 1 && tip[2][0] == 1) return 1; //======================================== for (i = 0; i < 3; i++) { if (tip[i][0] == 2 && tip[i][1] == 2 && tip[i][2] == 2) {//三行胜利 return 2; } } for (j = 0; j < 3; j++) { if (tip[0][j] == 2 && tip[1][j] == 2 && tip[2][j] == 2) {//三列胜利 return 2; } } if (tip[0][0] == 2 && tip[1][1] == 2 && tip[2][2] == 2) return 2; if (tip[0][2] == 2 && tip[1][1] == 2 && tip[2][0] == 2) return 2; //======================================== for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { if (tip[i][j] == 0) { ifno0 = 0; } } } if (ifno0 == 1) { return 3; }
return 0; } //绘制战绩和结束语 void game_win(s16 mode) { if (judge_win() == 1) { setbkmode(TRANSPARENT); settextcolor(MAGENTA); settextstyle(64, 40, _T("宋体")); RECT r = { 0, 0, 574, 468 }; if (mode == 1) { drawtext(_T("You Win!"), &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE); winnum[0]++; } else { drawtext(_T("You Lose..."), &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE); winnum[1]++; } }// you win or fails else if (judge_win() == 2) { setbkmode(TRANSPARENT); settextcolor(MAGENTA); settextstyle(64, 40, _T("宋体")); RECT r = { 0, 0, 574, 468 }; if (mode == 2) { drawtext(_T("You Win!"), &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE); winnum[0]++; } else { drawtext(_T("You Lose..."), &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE); winnum[1]++; } } else if (judge_win() == 3) { setbkmode(TRANSPARENT); settextcolor(MAGENTA); settextstyle(64, 40, _T("宋体")); RECT r = { 0, 0, 574, 468 }; drawtext(_T("Tie"), &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
winnum[2]++; }
//以下为绘制战绩 BeginBatchDraw();
setfillcolor(WHITE); solidrectangle(106, 432, 144, 453);// 清除上一次的 solidrectangle(235, 432, 273, 453);// 清除上一次的 solidrectangle(368, 432, 406, 453);// 清除上一次的
settextcolor(BLACK); settextstyle(20, 10, _T("宋体")); setbkmode(TRANSPARENT); _itot_s(winnum[0], winbuffer, 10); drawtext(winbuffer, &win_p, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
_itot_s(winnum[1], winbuffer, 10); drawtext(winbuffer, &lose_p, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
_itot_s(winnum[2], winbuffer, 10); drawtext(winbuffer, &tie_p, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
EndBatchDraw();
}//show game win
|