三子棋的犯错合集->函数数组的那些坑
首先是vs2013上的那些秘密
- 关于最近使用的vs2013的这件事大概已经平常了,我就说说最近发生的几起重大事件:
- debug 的问题
我以前是用的c语言编译器是GCC,那么也就是说这种的debug应该是比较原始的,但是说实话,我觉的一点都不原始,因为,GCC编译后的提示是全面的,包括, 数组访问越界 和指针的问题都会有十分全面的解释,但是VS就不一样了,她的表达方式就有所改变
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define row_max 3
#define col_max 3
char chess_board[row_max][col_max];
void Start_page(){
printf("--------------------------------\n");
printf("-------三子棋游戏----------------\n");
printf("[1]开始游戏\n");
printf("[2]结束游戏\n");
printf("请输入你的选择:\n");
printf("--------------------------------\n");
printf("--------------------------------\n");
}
int User_write(){
int flag;
while(1){
scanf("%d", &flag);
if (flag == 1){
return 1;
}
if (flag == 2){
return 2;
}
else{
printf("输入有误,请重新输入...\n");
}
}
}
void Init(){
for (int row = 0; row < row_max; row++){
for (int col = 0; col < col_max; col++){
chess_board[row][col] = ' ';
}
}
srand((unsigned int)time(0)); //time(0) 获取当前的时间戳 从1970年开始到现在时间的秒数 sand()函数的注解 The function srand() is used to seed the random sequence generated by rand(). For any given seed, rand() will generate a specific "random" sequence over and over again srand 函数的运用就是给rand 函数专用的设置序列的函数
}
void Print(){
printf("----棋盘-----\n");
for (int row = 0; row < row_max; row++){
printf("| %c | %c | %c |\n", chess_board[row][0], chess_board[row][1], chess_board[row][2]);
printf("-------------\n");
}
}
void PlayerMove(){
printf("玩家落子.....\n");
while (1){
printf("请输入落子的位置...(row,col)\n");
int row, col;
scanf("%d,%d",&row,&col);
if (row < 0 || row >= row_max || col < 0 || col >= col_max){
printf("输入有问题,请重行输入....\n");
continue;
}
if (chess_board[row][col] != ' '){
printf("该位置已被占用,请重行输入....\n");
continue;
}
chess_board[row][col] = 'X';
break;
}
printf("玩家落子完毕.....\n");
}
void ComputerMove(){
printf("电脑落子.....\n");
while (1){
int row = rand() % 3; // rand函数是能够返回一个在最大值和0之间的一个随机整数
int col = rand() % 3; // ()中就是传入的最大值,但是只是传入最大值就会是伪随机数
if (chess_board[row][col] != ' '){
continue;
}
chess_board[row][col] = 'O';
break;
}
printf("电脑落子完毕.....\n");
}
char Checkwiner(){
for (int row = 0; row < row_max; row++){
if (chess_board[row][0] == chess_board[row][1] && chess_board[row][0] == chess_board[row][2]){
return chess_board[row][0];
}
}
for (int col = 0; col < col_max; col++){
if (chess_board[0][col] == chess_board[1][col] && chess_board[0][col] == chess_board[2][col]){
return chess_board[0][col];
}
}
if (chess_board[0][0] == chess_board[1][1] && chess_board[1][1] == chess_board[2][2]){
return chess_board[1][1];
}
if (chess_board[0][2] == chess_board[1][1] && chess_board[1][1] == chess_board[2][0]){
return chess_board[1][1];
}
if (Isfull()){
return 'q';//和局
}
else return ' ';//可以继续下
}
int Isfull(){
for (int row = 0; row < row_max; row++){
for (int col = 0; col < col_max; col++){
if (chess_board[col][col] = ' '){
return 0;
}
}
}
return 1;
}
void Game() {
Init();
char winner = ' ';
//初始化一个棋盘
while (1){
// 1 打印棋盘
Print();
// 2 玩家落子
PlayerMove();
// 3 判断胜利
winner = Checkwiner();
if (winner != ' '){
break;
}
// 4 电脑落子
ComputerMove();
// 5 检测胜利
winner = Checkwiner();
if (winner != ' '){
break;
}
}
Print();
if (winner == 'X'){
printf("还行吧,居然把电脑下赢了...\n");
}
if (winner == 'O'){
printf("电脑把你给秒杀了...真的菜...\n");
}
if (winner == 'q'){
printf("和棋,你和电脑五五开....\n");
}
else{
printf("咋回事,好像出错了...\n");
}
}
int main(void){
while (1){
Start_page();
if (User_write() == 1){
Game();
}
else
{
printf("再也不见,不玩算了......\n");
break;
}
}
system("pause");
return 0;
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190329180404725.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDAwNzcxMw==,size_16,color_FFFFFF,t_70)
-
比如这里的符号调试,这里的符号调试可以是从本地库里选择
-
也可以是从微软选择
-
但是不管是从哪里选择都是对于我们初学者很不友好的
直接上三子棋的代码
不咋会用这个markdawn,这个代码缩进没了
但是肯定能运行的,有问题估计是暂时没发现
- 被电脑草笑了,哈哈…