这几天看了有关数组的一些知识后,便尝试用数组做了个三子棋小游戏,并扩展到了多子棋:
文章目录
#游戏的菜单选择及程序主体部分(test.c):
#include "game.h"
int n = 0; //n为输入数,玩家输入几,便可以玩几子棋。
//游戏菜单
void menu()
{
printf("**************************\n");
printf("***** 1.play 0.exit *****\n");
printf("**************************\n");
}
//棋盘的创建初始化及玩游戏过程
void game()
{
char board[ROW][COL] = { 0 };
Init_board(board, ROW, COL);
Display_board(board, ROW, COL);
Play_game(board, ROW, COL);
}
//菜单选择部分
void test()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("您想玩哪种游戏?(三子棋到n字棋)输入数字即可:>");
scanf("%d", &n);
game();
break;
case 0:
printf("退出成功!\n");
break;
default:
printf("选择错误!\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
#头文件包含,宏的创建及所用函数的声明(game.h):
#ifndef __GAME_H__
#define __GAME_H__
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define ROW 10 //棋盘的行数
#define COL 10 //棋盘的列数
void Init_board(char board[ROW][COL], int row, int col);
void Display_board(char board[ROW][COL], int row, int col);
void Play_game(char board[ROW][COL], int row, int col);
char Iswin(char board[ROW][COL], int row, int col);
#endif //__GAME_H__
#所用函数的实现(game.c):
#include "game.h"
extern int n;
//初始化棋盘
void Init_board(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
memset(board, ' ', row * col * sizeof(board[0][0]));
}
//打印当前棋盘
void Display_board(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (j < col - 1)
{
printf(" %c |", board[i][j]);
}
else
{
printf(" %c \n", board[i][j]);
}
}
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
if (j < col - 1)
{
printf("---|");
}
else
{
printf("---\n");
}
}
}
}
}
//判断输赢
char Iswin(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
char tmp = 0;
int num = 0;
int m = 0;
//判断行
for (i = 0; i < row; i++)
{
num = 1;
tmp = board[i][0];
for (j = 1; j < col; j++)
{
if (tmp == board[i][j] && tmp != ' ')
{
num++;
}
else
{
tmp = board[i][j];
num = 1;
}
if (num == n)
{
return tmp;
}
}
}
//判断列
for (j = 0; j < col; j++)
{
num = 1;
tmp = board[0][j];
for (i = 1; i < row; i++)
{
if (tmp == board[i][j] && tmp != ' ')
{
num++;
}
else
{
tmp = board[i][j];
num = 1;
}
if (num == n)
{
return tmp;
}
}
}
//判断下半部分\对角线
m = 0;
while (m <= row - n)
{
tmp = board[m][0];
num = 1;
for (i = m + 1; i < row; i++)
{
if (tmp == board[i][i - m] && tmp != ' ')
{
num++;
}
else
{
tmp = board[i][i - m];
num = 1;
}
if (num == n)
{
return tmp;
}
}
m++;
}
//判断上半部分\对角线
m = 1;
while (m <= col - n)
{
tmp = board[0][m];
num = 1;
for (j = m + 1; j < col; j++)
{
if (tmp == board[j - m][j] && tmp != ' ')
{
num++;
}
else
{
tmp = board[j - m][j];
num = 1;
}
if (num == n)
{
return tmp;
}
}
m++;
}
//判断下半部分/对角线
m = 0;
while (m <= row - n)
{
tmp = board[m][row - 1];
num = 1;
for (i = m + 1; i < row; i++)
{
if (tmp == board[i][col - 1 - i + m] && tmp != ' ')
{
num++;
}
else
{
tmp = board[i][col - 1 - i + m];
num = 1;
}
if (num == n)
{
return tmp;
}
}
m++;
}
//判断上半部分/对角线
m = col - 2;
while (m >= n - 1)
{
tmp = board[0][m];
num = 1;
for (j = m - 1; j >= 0; j--)
{
if (tmp == board[m - j][j] && tmp != ' ')
{
num++;
}
else
{
tmp = board[m - j][j];
num = 1;
}
if (num == n)
{
return tmp;
}
}
m--;
}
return -1;
}
void Play_game(char board[ROW][COL], int row, int col)
{
int r1 = 0;
int c1 = 0;
int r2 = 0;
int c2 = 0;
int count = 0;
char ret = 0;
while (1)
{
if (n == 3)
{
printf("玩家1下:>(1-%d)", n);
scanf("%d%d", &r1, &c1);
if (r1 > n || c1 > n || board[r1 - 1][c1 - 1] != ' ')
{
printf("输入错误!\n");
continue;
}
if (board[r1 - 1][c1 - 1] == ' ')
{
board[r1 - 1][c1 - 1] = 'X';
}
}
else
{
printf("玩家1下:>(1-%d)", row);
scanf("%d%d", &r1, &c1);
if (r1 > row || c1 > col || board[r1 - 1][c1 - 1] != ' ')
{
printf("输入错误!\n");
continue;
}
if (board[r1 - 1][c1 - 1] == ' ')
{
board[r1 - 1][c1 - 1] = 'X';
}
}
Display_board(board, ROW, COL);
count++;
ret = Iswin(board, ROW, COL);
if (ret == 'X')
{
printf("玩家1赢!\n");
break;
}
if (count == ((row * col + 1) / 2))
{
printf("平局!\n");
break;
}
if (n == 3)
{
I:
printf("玩家2下:>(1-%d)", n);
scanf("%d%d", &r2, &c2);
if (r2 > n || c2 > n || board[r2 - 1][c2 - 1] != ' ')
{
printf("输入错误!\n");
goto I;
}
if (board[r2 - 1][c2 - 1] == ' ')
{
board[r2 - 1][c2 - 1] = 'O';
}
}
else
{
L:
printf("玩家2下:>(1-%d)", row);
scanf("%d%d", &r2, &c2);
if (r2 > row || c2 > col || board[r2 - 1][c2 - 1] != ' ')
{
printf("输入错误!\n");
goto L;
}
if (board[r2 - 1][c2 - 1] == ' ')
{
board[r2 - 1][c2 - 1] = 'O';
}
}
Display_board(board, ROW, COL);
ret = Iswin(board, ROW, COL);
if (ret == 'O')
{
printf("玩家2赢!\n");
break;
}
}
}
这个小程序,虽然是实现了三子棋以及n子棋,但是我只是完成了两个玩家可以正常对弈,玩家和电脑玩时,电脑的下棋步骤太过随机,导致结果就是电脑特别的菜,并不会阻挡玩家。希望各位在看过之后,有任何可以改进电脑下棋算法的想法,可以教教我,我也会再想想好的办法,互相讨论。