main与**_tmain**
main函数的原型改变后,argv【0】的输出方式不同了
int main(int argc, char* argv[])
{
printf("%s", argv[0]);
return 0;
}
输出的是绝对地址
int _tmain(int argc, _TCHAR* argv[])
{
printf("%s", argv[0]);
return 0;
}
_tchar是宽字节是以2字节为一个单位的,如果强行当作char类型解释,则会过早的截断。
调试入门
内存
内存窗口代表最左边的代表的是内存地址,它们相当于门牌号;
右边的内容代表的是数据(以16进制表示)
内存地址的最少单位 是 1个字节
改源码不可以 改内存可以 因为为内存为即时的
拥有了上帝之手随便改
监视窗口
监视窗口中可以监控任意的C语言合法的变量,直接显示它的值,并且该值,会随着 程序的运行,自动更新。
堆栈窗口
被调用的函数会出现 调用函数的上方
void myfun()
{
printf("hello world!\r\n");
}
void myfun2()
{
printf("nihaolmj\r\n");
}
int _tmain(int argc, char* argv[])
{
myfun2();
myfun();
return 0;
}
断点 单步步入 单步步过
断点 是中断的意思,拦路虎,即,程序执行的过程中会被断下来
堆栈窗口 记录了函数的调用关系,通过双击堆栈的各个函数,可以确定函数调用的位置
调试是分水岭
如果不懂 就统统F11 总有一天会顿悟的
小游戏互动
贪吃蛇
我们要考虑的游戏只是雏形阶段
- 围栏
- 蛇本身
- 移动
围栏用二维数组
移动用getchar()获得用户输入
蛇本身 存储坐标信息
#include "stdafx.h"
#include<stdlib.h>
#include<time.h>
#include"setdisplay.h"
#include"conio.h"
#define GAME_ROW 16
#define GAME_COL 16
char g_BackGround[GAME_ROW][GAME_COL] = { 0 };
int g_nRow = 7;
int g_nCol = 7;
void Show_Over()
{
char* str = \
"□□□□■■■■■■□□□□□□□□□□■□□□□□□□□□□□□□□□□□■□□□□□□□□□■□□□□□□□□□■■■■■■■■■■■□\n"
"□□□■□□□□□□□□□□□□□□□■□■□□□□□□□□□□□□□□□■□■□□□□□□□■□■□□□□□□□□■□□□□□□□□□□□\n"
"□□■□□□□□□□□□□□□□□□■□□□■□□□□□□□□□□□□□■□□□■□□□□□■□□□■□□□□□□□■□□□□□□□□□□□\n"
"□■□□□□□□□□□□□□□□□■□□□□□■□□□□□□□□□□□■□□□□□■□□□■□□□□□■□□□□□□■□□□□□□□□□□□\n"
"□■□□□□□□□□□□□□□□■■■■■■■■■□□□□□□□□□■□□□□□□□■□■□□□□□□□■□□□□□■■■■■■■■■■■□\n"
"□■□□□□□■■■■□□□□■□□□□□□□□□■□□□□□□□■□□□□□□□□□■□□□□□□□□□■□□□□■□□□□□□□□□□□\n"
"□■□□□□□■□□■□□□■□□□□□□□□□□□■□□□□□■□□□□□□□□□□□□□□□□□□□□□■□□□■□□□□□□□□□□□\n"
"□□■□□□□□□□■□□■□□□□□□□□□□□□□■□□□■□□□□□□□□□□□□□□□□□□□□□□□■□□■□□□□□□□□□□□\n"
"□□□■■■■■■■■□■□□□□□□□□□□□□□□□■□■□□□□□□□□□□□□□□□□□□□□□□□□□■□■■■■■■■■■■■□\n"
"□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□\n"
"□□□□■■■■□□□□■□□□□□□□□□□□□□□□■□□□□□□■■■■■■■■■■■■■■■□□□□□□□□■□□□□■■■■□□□\n"
"□□□■□□□□■□□□□■□□□□□□□□□□□□□■□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□■□□□■□□□□■□□\n"
"□□■□□□□□□■□□□□■□□□□□□□□□□□■□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□■□□■□□□□□□■□\n"
"□■□□□□□□□□■□□□□■□□□□□□□□□■□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□■□■□□□□□□□□□\n"
"□■□□□□□□□□■□□□□□■□□□□□□□■□□□□□□□□□□■■■■■■■■■■■■■■■□□□□□□□□■■□□□□□□□□□□\n"
"□■□□□□□□□□■□□□□□□■□□□□□■□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□\n"
"□□■□□□□□□■□□□□□□□□■□□□■□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□\n"
"□□□■□□□□■□□□□□□□□□□■□■□□□□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□□\n"
"□□□□■■■■□□□□□□□□□□□□■□□□□□□□□□□□□□□■■■■■■■■■■■■■■■□□□□□□□□■□□□□□□□□□□□\n";
WriteChar(18, 0,
str,
SetConsoleColor(COLOR_YELLOW, COLOR_WHITE));
}
void BackGround()
{
for (size_t nRow= 0; nRow<GAME_ROW; nRow++)
{
for (size_t nCol = 0; nCol < GAME_COL; nCol++)
{
if (nRow == 0 ||
nCol == 0 ||
nCol == GAME_COL - 1 ||
nRow == GAME_ROW - 1)
{
g_BackGround[nRow][nCol] = 1;
}
else
{
g_BackGround[nRow][nCol] = 0;
}
}
}
}
void ShowBackGround()
{
for (size_t nRow = 0; nRow < GAME_ROW; nRow++)
{
for (size_t nCol = 0; nCol < GAME_COL; nCol++)
{
if (g_BackGround[nRow][nCol]==1)
{
WriteChar(nRow, nCol, "■", SetConsoleColor(COLOR_YELLOW, COLOR_WHITE));
}
else
{
WriteChar(nRow, nCol, "□", SetConsoleColor(COLOR_YELLOW, COLOR_WHITE));
}
}
}
}
int IsCanMove(int nRows, int nCols)
{
if (g_BackGround[nRows][nCols] == 1)
{
Show_Over();
return 0;
}
else
{
return 1;
}
}
void Show_Snake()
{
WriteChar(g_nRow, g_nCol, "蛇", SetConsoleColor(COLOR_RED, COLOR_WHITE));
}
void Show_All()
{
system("cls");
ShowBackGround();
Show_Snake();
}
void Snake_Run()
{
char cInput = 0;
while (1)
{
cInput = _getch();
switch (cInput)
{
case'a':
if (IsCanMove(g_nRow, g_nCol - 1))
{
g_nCol--;
Show_All();
}
break;
case'w':
if (IsCanMove(g_nRow + 1, g_nCol))
{
g_nRow++;
Show_All();
}
break;
case'd':
if (IsCanMove(g_nRow, g_nCol + 1))
{
g_nCol++;
Show_All();
}
break;
case's':
if (IsCanMove(g_nRow + 1, g_nCol))
{
g_nRow++;
Show_All();
}
break;
default:
break;
}
}
}
int main(int argc, char * argv[])
{
BackGround();
ShowBackGround();
Show_Snake();
Snake_Run();
}