史上最简单三子棋游戏,至今未发现更容易的三子棋*
和傻子电脑玩三子棋游戏玩法介绍:首先,电脑会先在棋盘上放置一个X,然后玩家开始走,在没有X的放置O,
在九个精美的格子上(假的,丑爆了,手动精美)展开激烈的厮杀(假的,一点都不好玩),最后有三个相同的棋子,无论是横竖撇捺的直线上连成一线。棋子的所有者获胜,如果在九个格子都被占用后未出现一方获胜,即为平局。
实现原理:建立一个3*3二维数组,为了让游戏玩一把之后还能继续玩,使用do-while循环控制,输入坐标控制子落在何处,电脑的子用随机坐标控制,在九个位置上如果有一方落子,另一方就不能落在此处,所以要判断输入坐标的位置是否是空的。用遍历的方法初始化数组,先放入九个空格,落子就将棋子放入数组中。玩家落子时输入的坐标需要先判断是否合法,再判断坐标是否被占用。判断输赢时,需要将可能的情况的坐标全部列举出来判断。
实现功能的函数:
初始化棋盘时遍历数组全部赋为’ '(空格),定义两个全局变量ROW,COL,方便改变棋盘的大小。
//初始化棋盘
void InitBoard(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++)
{
board[i][j] = ' ';
}
}
}
打印一个贼丑的棋盘:
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j<row; j++)
{
printf("%c ",board[i][j]);
if (j != 2)
{
printf("|");
}
}
printf("\n");
if (i != 2)
{
for (j = 0; j <= col; j++)
{
if (j <= col)
printf("--");
}
}
printf("\n");
}
}
电脑走的方法:
电脑用随机数生成坐标,rand() % 3表示生成0~2之间的随机数,while循环的作用:在判断出坐标被占用时能够循环继续随机生成可使用的坐标,而不是被占用后停止在这里。
void ComputerMove(char board[ROW][COL], int row, int col)
{
while (1)
{
int x = rand() % 3;
int y = rand() % 3;
if (' ' == board[x][y])
{
board[x][y] = 'X';
break;
}
}
}
玩家走的方法:
玩家从键盘上输入坐标,总有人不按规矩来想挑战一下,所以第一步判断应该判断玩家输入的坐标是否合法,如果输入的坐标合法,则进行第二步判断输入坐标是否被占用,如果被占用,则进行while循环,直到输入的坐标合法且未被占用。
//玩家走
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("请输入坐标:");
scanf("%d%d", &x, &y);
if (x>0 && x <= row && y>0 && y <= col)
{
if (' ' == board[x - 1][y - 1])
{
board[x - 1][y - 1] = '0';
break;
}
else
printf("坐标已被占用,请重新输入\n");
}
else
printf("输入不合法,请重新输入\n");
}
}
判断棋盘是否已满的方法:
遍历整个数组,如果一遇到空格就返回0,说明还没有满,如果遍历完整个数组,没有空格就返回1,说明棋盘已满。
//判断棋盘是否已满
int IsFull(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 (board[i][j] == ' ')
return 0;
}
}
return 1;
}
判断输赢的方法:
在棋盘满的时候,返回了1,用i接收它,返回~,到主函数中判断,board[i][0]、board[i][1]、board[i][2]用for循环判断行中是否满足条件,如满足条件则返回board[i][0]中包含的字符。board[0][i]、board[1][i]、board[2][i]用for循环判断列中是否满足条件,如满足条件则返回board[0][i]。再判断board[0][0]、board[1][1]、board[2][2]中的字符是否相同,如果相同则返回board[0][0]中的字符,最后判断board[0][2]、board[1][1]、board[2][0],如果相同则返回board[0][2]中的字符。
//判断输赢
char IsWin(char board[ROW][COL], int row, int col)
{
int i = 0;
if (i = IsFull(board, row, col) == 1)
{
return '~';
}
for (i = 0; i<row; i++)
{
if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]))
{
return board[i][0];
}
}
for (i = 0; i<col; i++)
{
if ((board[0][i] == board[1][i]) && (board[1][i] == board[2][i]))
{
return board[1][i];
}
}
if ((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]))
{
return board[0][0];
}
if ((board[0][2] == board[1][1]) && (board[1][1] == board[2][0]))
{
return board[0][2];
}
return ' ';
}
主函数:
根据IsWin的返回值不同,确定胜利方,IsWin为~,输出平局;O玩家胜利;X电脑胜利
void game()
{
char board[ROW][COL] = { 0 };
char ret = '0';
InitBoard(board, ROW, COL);
DisplayBoard(board, ROW, COL);
do
{
printf("电脑走:\n");
ComputerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
if (IsWin(board, ROW, COL) != ' ')
{
break;
}
printf("玩家走:\n");
PlayerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = IsWin(board, ROW, COL);
} while (ret == ' ');
if (IsWin(board, ROW, COL) == '~')
{
printf("平局!\n");
}
else if (IsWin(board, ROW, COL) == '0')
{
printf("恭喜你! 玩家胜利!\n");
}
else if (IsWin(board, ROW, COL) == 'X')
{
printf("很遗憾! 电脑胜利!\n");
}
}
代码如下:
game.h
//game.h
#ifndef __GAME_H__
#define __GAME_H__
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 3
#define COL 3
void game();
void InitBoard(char board[ROW][COL], int row, int col);
void DisplayBoard(char board[ROW][COL], int row, int col);
void PlayerMove(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);
int IsFull(char board[ROW][COL], int row, int col);
char IsWin(char aboard[ROW][COL], int row, int col);
#endif
test.c
//test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
printf("************************\n");
printf("****** 1.play ******\n");
printf("****** 0.exit ******\n");
printf("************************\n");
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));//确保每次生成随机数
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏!");
break;
default:
printf("选择错误,请重新输入\n");
break;
}
} while (input);
return 0;
}
game.c
//game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j<row; j++)
{
printf("%c ",board[i][j]);
if (j != 2)
{
printf("|");
}
}
printf("\n");
if (i != 2)
{
for (j = 0; j <= col; j++)
{
if (j <= col)
printf("--");
}
}
printf("\n");
}
}
//初始化棋盘
void InitBoard(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++)
{
board[i][j] = ' ';
}
}
}
//玩家走
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("请输入坐标:");
scanf("%d%d", &x, &y);
if (x>0 && x <= row && y>0 && y <= col)
{
if (' ' == board[x - 1][y - 1])
{
board[x - 1][y - 1] = '0';
break;
}
else
printf("坐标已被占用,请重新输入\n");
}
else
printf("输入不合法,请重新输入\n");
}
}
//电脑走
void ComputerMove(char board[ROW][COL], int row, int col)
{
while (1)
{
int x = rand() % 3;
int y = rand() % 3;
if (' ' == board[x][y])
{
board[x][y] = 'X';
break;
}
}
}
//判断棋盘是否已满
int IsFull(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 (board[i][j] == ' ')
return 0;
}
}
return 1;
}
//判断输赢
char IsWin(char board[ROW][COL], int row, int col)
{
int i = 0;
if (i = IsFull(board, row, col) == 1)
{
return '~';
}
for (i = 0; i<row; i++)
{
if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]))
{
return board[i][0];
}
}
for (i = 0; i<col; i++)
{
if ((board[0][i] == board[1][i]) && (board[1][i] == board[2][i]))
{
return board[1][i];
}
}
if ((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]))
{
return board[0][0];
}
if ((board[0][2] == board[1][1]) && (board[1][1] == board[2][0]))
{
return board[0][2];
}
return ' ';
}
void game()
{
char board[ROW][COL] = { 0 };
char ret = '0';
InitBoard(board, ROW, COL);
DisplayBoard(board, ROW, COL);
do
{
printf("电脑走:\n");
ComputerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
if (IsWin(board, ROW, COL) != ' ')
{
break;
}
printf("玩家走:\n");
PlayerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = IsWin(board, ROW, COL);
} while (ret == ' ');
if (IsWin(board, ROW, COL) == '~')
{
printf("平局!\n");
}
else if (IsWin(board, ROW, COL) == '0')
{
printf("恭喜你! 玩家胜利!\n");
}
else if (IsWin(board, ROW, COL) == 'X')
{
printf("很遗憾! 电脑胜利!\n");
}
}
运行结果: