扫雷 三子棋的实现
2017-10-29 21:56
197 查看
三子棋
game.h
#ifndef __GAME_H__
#define __GAME_H__
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#define ROWS 3
#define COLS 3
void init_board(char board[ROWS][COLS],int row,int col);
void display_board(char board[ROWS][COLS],int row,int col);
void player_move(char board[ROWS][COLS],int row,int col);
void computer_move(char board[ROWS][COLS],int row,int col);
char check_win(char board[ROWS][COLS],int row,int col);
#endif //__GAME_H__
头文件,定义函数名称
game.c
#include"game.h"
#define _CRT_SECURE_NO_WARNINGS 1
void init_board(char board[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
for (i = 0;i < row;i++)
{
for (j = 0; j < col; j++)
board[i][j] = ' ';
}
}
void display_board(char board[ROWS][COLS],int row,int col)
{
int i = 0;
for (i = 0; i < row;i++)
{
printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]);
if (i < 2)
printf("---|---|---\n");
}
}
void player_move(char board[ROWS][COLS],int row,int col)
{
int x = 0;
int y = 0;
while(1)
{
printf ("玩家走:> ");
scanf_s ("%d%d",&x,&y);
x--;
y--;
if (x >= 0 && x <= 2 && y >= 0 && y <= 2)
{
if (board[x][y] == ' ')
{
board[x][y] = '$';
break;
}
else
{
printf("输入错误,请重新输入:>\n");
}
}
else
printf ("输入错误,请重新输入:>\n");
}
}
void computer_move(char board[ROWS][COLS],int row,int col)
{
while(1)
{
int x = rand()%3;
int y = rand()%3;
if (board[x][y] == ' ')
{
board[x][y] = '*';
break;
}
}
}
static int is_full(char board[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
for (i = 0;i < row;i++)
{
for (j = 0;j < col;j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
char check_win(char board[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
for (i = 0;i < row;i++)
{
if((board[i][0] == board[i][1])&&(board[i][1] == board[i][2])&&(board[i][1] != ' '))
return board[i][1];
}
for (j = 0;j < col;j++)
{
if((board[0][j] == board[1][j])&&(board[1][j] == board[2][j])&&(board[1][j] != ' '))
return board[1][j];
}
if((board[0][0] == board[1][1])&&(board[1][1] == board[2][2])&&(board[1][1] != ' '))
{
return board[1][1];
}
if((board[0][2] == board[1][1])&&(board[1][1] == board[2][0])&&(board[1][1] != ' '))
{
return board[1][1];
}
if(is_full(board,row,col) == 1)
{
return 'q';
}
return ' ';
}
game.c 文件实现对棋盘的初始化,打印,还有输入坐标后的输出,以及 对于 输赢的判断
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include"game.h"
void game()
{
char board[ROWS][COLS] = {0};
char ret = 0;
init_board(board,ROWS,COLS);
display_board(board,ROWS,COLS);
srand((unsigned int)time(NULL));
while(1)
{
player_move(board,ROWS,COLS);
if ((ret = check_win(board,ROWS,COLS))!=' ')
break;
display_board(board,ROWS,COLS);
computer_move(board,ROWS,COLS);
if ((ret = check_win(board,ROWS,COLS))!=' ')
break;
printf ("电脑走:> \n");
display_board(board,ROWS,COLS);
}
printf ("\n");
display_board(board,ROWS,COLS);
if (ret == '$')
{
printf ("\n恭喜你!玩家赢!!!!!\n\n");
}
else if (ret == '*')
{
printf ("\n很遗憾,电脑赢。\n\n");
}
else if (ret == 'q')
{
printf ("\n平局\n\n");
}
}
void menu()
{
printf("****************************\n");
printf("*** 1.play 0.exit ***\n");
printf("****************************\n");
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 0:
printf ("退出游戏!\n");
break;
default:
printf ("选择错误!\n");
break;
}
}while(input);
return 0;
}
test.c文件主要是对于整个函数的应用,
扫雷游戏
game.h
#ifndef __GAME_H__
#define __GAME_H__
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
enum Option
{
EXIT,
PLAY
};
#define ROW 10
#define COL 10
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNTS 10
void InitBoard(char arr[ROWS][COLS],int row,int col,char set);
void DisplayBoard(char arr[ROWS][COLS],int row,int col);
void SetMine(char arr[ROWS][COLS],int row,int col,char count);
int GetMineCount(char arr[ROWS][COLS],int x,int y);
int check_set(char arr[ROWS][COLS],int x,int y);
void First_Input(char arr[ROWS][COLS],int x, int y);
//void Test_set(char arr[ROWS][COLS],int x, int y);
//int showAroundBlock(char arr[ROWS][COLS],int x,int y);//这里就是打印该点周围八个格子的数字;
#endif //__GAME_H__
头文件,对于函数名称的定义,以及在库函数的引用
game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
#include<string.h>
void InitBoard(char arr[ROWS][COLS],int row,int col,char set)
{
int i = 0;
int j = 0;
for (i = 0;i < row; i++)
{
for(j = 0;j < col; j++)
{
arr[i][j] = set;
}
}
}
void DisplayBoard(char arr[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
printf (" ");
for (i = 1; i <= row;i++)
{
printf ("%2d ",i);
}
printf ("\n");
for (i = 1;i <= row;i++)
{
printf ("%2d ",i);
for (j = 1;j <=col;j++)
{
printf("%2c ",arr[i][j]);
}
printf ("\n");
}
}
void SetMine(char arr[ROWS][COLS],int row,int col,char count)
{
int x = 0;
int y = 0;
char mine[ROWS][COLS] = {0};
while(count)
{
x = rand()%10+1;
y = rand()%10+1;
if (arr[x][y] == '0')
{
arr[x][y] = 'a';
count --;
}
}
}
int GetMineCount(char arr[ROWS][COLS],int x,int y)
{
int count = 0;
if (arr[x - 1][y - 1] == 'a')
{
count ++;
}
if (arr[x - 1][y] == 'a')
{
count ++;
}
if (arr[x - 1][y + 1] == 'a')
{
count ++;
}
if (arr[x][y + 1] == 'a')
{
count ++;
}
if (arr[x + 1][y + 1] == 'a')
{
count ++;
}
if (arr[x + 1][y] == 'a')
{
count ++;
}
else if (arr[x + 1][y - 1] == 'a')
{
count ++;
}
if (arr[x][y - 1] == 'a')
{
count ++;
}
return count;
}
int check_set(char arr[ROWS][COLS],int x,int y)
{
if ( arr[x][y] == 'a')
{
printf ("\n WHAT A PITY ! GAME OVER ! \n\n\n");
return 0;
}
}
void First_Input(char arr[ROWS][COLS],int x, int y)
{
if (arr[x][y] == 'a')
{
x = rand()%10+1;
y = rand()%10+1;
if (arr[x][y] == '0')
{
arr[x][y] = 'a';
}
}
}
初始化定义扫雷盘,然后打印两个棋盘,随机输入雷,之后,保证第一次点击,不结束游戏,然后判断是否踩到雷,是否结束游戏
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
#include<time.h>
void menu()
{
printf ("*************************\n");
printf ("*** 1.play 0.exit ***\n");
printf ("*************************\n");
}
int game()
{
int x = 0;
int y = 0;
int count = 0;
char show[ROWS][COLS] = {0};
char mine[ROWS][COLS] = {0};
srand((unsigned int) time (NULL));
InitBoard(show,ROWS,COLS,'*');
InitBoard(mine,ROWS,COLS,'0');
DisplayBoard(show,ROW,COL);
SetMine(mine,ROWS,COLS,EASY_COUNTS);
//DisplayBoard(mine,ROW,COL);
printf ("请输入坐标:>");
scanf ("%d%d",
a013
&x,&y);
First_Input(show,x, y);
show[x][y] = '0'+count;
DisplayBoard(show,ROW,COL);
while(1)
{
//DisplayBoard(show,ROW,COL);
printf ("请输入坐标:>");
scanf ("%d%d",&x,&y);
count = GetMineCount(mine,x,y);
show[x][y] = '0'+count;
//Test_set(x,y);
DisplayBoard(show,ROW,COL);
if ((check_set(mine,x,y)) == 0)
return 0;
}
return 0;
}
int main ()
{
int input = 0;
do
{
menu();
printf ("请选择:>");
scanf ("%d",&input);
switch(input)
{
case 1:
{
game();
break;
}
case 0:
{
printf ("游戏结束\n");
break;
}
default:
{
printf ("选择错误\n");
break;
}
}
}
while (input);
return 0;
}
对于函数的引用,以及整个游戏的正常运作
三子棋
game.h
#ifndef __GAME_H__
#define __GAME_H__
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#define ROWS 3
#define COLS 3
void init_board(char board[ROWS][COLS],int row,int col);
void display_board(char board[ROWS][COLS],int row,int col);
void player_move(char board[ROWS][COLS],int row,int col);
void computer_move(char board[ROWS][COLS],int row,int col);
char check_win(char board[ROWS][COLS],int row,int col);
#endif //__GAME_H__
头文件,定义函数名称
game.c
#include"game.h"
#define _CRT_SECURE_NO_WARNINGS 1
void init_board(char board[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
for (i = 0;i < row;i++)
{
for (j = 0; j < col; j++)
board[i][j] = ' ';
}
}
void display_board(char board[ROWS][COLS],int row,int col)
{
int i = 0;
for (i = 0; i < row;i++)
{
printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]);
if (i < 2)
printf("---|---|---\n");
}
}
void player_move(char board[ROWS][COLS],int row,int col)
{
int x = 0;
int y = 0;
while(1)
{
printf ("玩家走:> ");
scanf_s ("%d%d",&x,&y);
x--;
y--;
if (x >= 0 && x <= 2 && y >= 0 && y <= 2)
{
if (board[x][y] == ' ')
{
board[x][y] = '$';
break;
}
else
{
printf("输入错误,请重新输入:>\n");
}
}
else
printf ("输入错误,请重新输入:>\n");
}
}
void computer_move(char board[ROWS][COLS],int row,int col)
{
while(1)
{
int x = rand()%3;
int y = rand()%3;
if (board[x][y] == ' ')
{
board[x][y] = '*';
break;
}
}
}
static int is_full(char board[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
for (i = 0;i < row;i++)
{
for (j = 0;j < col;j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
char check_win(char board[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
for (i = 0;i < row;i++)
{
if((board[i][0] == board[i][1])&&(board[i][1] == board[i][2])&&(board[i][1] != ' '))
return board[i][1];
}
for (j = 0;j < col;j++)
{
if((board[0][j] == board[1][j])&&(board[1][j] == board[2][j])&&(board[1][j] != ' '))
return board[1][j];
}
if((board[0][0] == board[1][1])&&(board[1][1] == board[2][2])&&(board[1][1] != ' '))
{
return board[1][1];
}
if((board[0][2] == board[1][1])&&(board[1][1] == board[2][0])&&(board[1][1] != ' '))
{
return board[1][1];
}
if(is_full(board,row,col) == 1)
{
return 'q';
}
return ' ';
}
game.c 文件实现对棋盘的初始化,打印,还有输入坐标后的输出,以及 对于 输赢的判断
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include"game.h"
void game()
{
char board[ROWS][COLS] = {0};
char ret = 0;
init_board(board,ROWS,COLS);
display_board(board,ROWS,COLS);
srand((unsigned int)time(NULL));
while(1)
{
player_move(board,ROWS,COLS);
if ((ret = check_win(board,ROWS,COLS))!=' ')
break;
display_board(board,ROWS,COLS);
computer_move(board,ROWS,COLS);
if ((ret = check_win(board,ROWS,COLS))!=' ')
break;
printf ("电脑走:> \n");
display_board(board,ROWS,COLS);
}
printf ("\n");
display_board(board,ROWS,COLS);
if (ret == '$')
{
printf ("\n恭喜你!玩家赢!!!!!\n\n");
}
else if (ret == '*')
{
printf ("\n很遗憾,电脑赢。\n\n");
}
else if (ret == 'q')
{
printf ("\n平局\n\n");
}
}
void menu()
{
printf("****************************\n");
printf("*** 1.play 0.exit ***\n");
printf("****************************\n");
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 0:
printf ("退出游戏!\n");
break;
default:
printf ("选择错误!\n");
break;
}
}while(input);
return 0;
}
test.c文件主要是对于整个函数的应用,
扫雷游戏
game.h
#ifndef __GAME_H__
#define __GAME_H__
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
enum Option
{
EXIT,
PLAY
};
#define ROW 10
#define COL 10
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNTS 10
void InitBoard(char arr[ROWS][COLS],int row,int col,char set);
void DisplayBoard(char arr[ROWS][COLS],int row,int col);
void SetMine(char arr[ROWS][COLS],int row,int col,char count);
int GetMineCount(char arr[ROWS][COLS],int x,int y);
int check_set(char arr[ROWS][COLS],int x,int y);
void First_Input(char arr[ROWS][COLS],int x, int y);
//void Test_set(char arr[ROWS][COLS],int x, int y);
//int showAroundBlock(char arr[ROWS][COLS],int x,int y);//这里就是打印该点周围八个格子的数字;
#endif //__GAME_H__
头文件,对于函数名称的定义,以及在库函数的引用
game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
#include<string.h>
void InitBoard(char arr[ROWS][COLS],int row,int col,char set)
{
int i = 0;
int j = 0;
for (i = 0;i < row; i++)
{
for(j = 0;j < col; j++)
{
arr[i][j] = set;
}
}
}
void DisplayBoard(char arr[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
printf (" ");
for (i = 1; i <= row;i++)
{
printf ("%2d ",i);
}
printf ("\n");
for (i = 1;i <= row;i++)
{
printf ("%2d ",i);
for (j = 1;j <=col;j++)
{
printf("%2c ",arr[i][j]);
}
printf ("\n");
}
}
void SetMine(char arr[ROWS][COLS],int row,int col,char count)
{
int x = 0;
int y = 0;
char mine[ROWS][COLS] = {0};
while(count)
{
x = rand()%10+1;
y = rand()%10+1;
if (arr[x][y] == '0')
{
arr[x][y] = 'a';
count --;
}
}
}
int GetMineCount(char arr[ROWS][COLS],int x,int y)
{
int count = 0;
if (arr[x - 1][y - 1] == 'a')
{
count ++;
}
if (arr[x - 1][y] == 'a')
{
count ++;
}
if (arr[x - 1][y + 1] == 'a')
{
count ++;
}
if (arr[x][y + 1] == 'a')
{
count ++;
}
if (arr[x + 1][y + 1] == 'a')
{
count ++;
}
if (arr[x + 1][y] == 'a')
{
count ++;
}
else if (arr[x + 1][y - 1] == 'a')
{
count ++;
}
if (arr[x][y - 1] == 'a')
{
count ++;
}
return count;
}
int check_set(char arr[ROWS][COLS],int x,int y)
{
if ( arr[x][y] == 'a')
{
printf ("\n WHAT A PITY ! GAME OVER ! \n\n\n");
return 0;
}
}
void First_Input(char arr[ROWS][COLS],int x, int y)
{
if (arr[x][y] == 'a')
{
x = rand()%10+1;
y = rand()%10+1;
if (arr[x][y] == '0')
{
arr[x][y] = 'a';
}
}
}
初始化定义扫雷盘,然后打印两个棋盘,随机输入雷,之后,保证第一次点击,不结束游戏,然后判断是否踩到雷,是否结束游戏
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
#include<time.h>
void menu()
{
printf ("*************************\n");
printf ("*** 1.play 0.exit ***\n");
printf ("*************************\n");
}
int game()
{
int x = 0;
int y = 0;
int count = 0;
char show[ROWS][COLS] = {0};
char mine[ROWS][COLS] = {0};
srand((unsigned int) time (NULL));
InitBoard(show,ROWS,COLS,'*');
InitBoard(mine,ROWS,COLS,'0');
DisplayBoard(show,ROW,COL);
SetMine(mine,ROWS,COLS,EASY_COUNTS);
//DisplayBoard(mine,ROW,COL);
printf ("请输入坐标:>");
scanf ("%d%d",
a013
&x,&y);
First_Input(show,x, y);
show[x][y] = '0'+count;
DisplayBoard(show,ROW,COL);
while(1)
{
//DisplayBoard(show,ROW,COL);
printf ("请输入坐标:>");
scanf ("%d%d",&x,&y);
count = GetMineCount(mine,x,y);
show[x][y] = '0'+count;
//Test_set(x,y);
DisplayBoard(show,ROW,COL);
if ((check_set(mine,x,y)) == 0)
return 0;
}
return 0;
}
int main ()
{
int input = 0;
do
{
menu();
printf ("请选择:>");
scanf ("%d",&input);
switch(input)
{
case 1:
{
game();
break;
}
case 0:
{
printf ("游戏结束\n");
break;
}
default:
{
printf ("选择错误\n");
break;
}
}
}
while (input);
return 0;
}
对于函数的引用,以及整个游戏的正常运作