- 一、问题描述
- 二、基本思路
- 三、操作步骤
- 1.打印菜单
- 2.初始化棋盘
- 3.打印棋盘
- 4.玩家下棋
- 5.电脑下棋
- 5.判断胜负
- 四、全部代码
- 1.game.h
- 2.game.c
- 3.test.c
二、基本思路本次三子棋小游戏代码全部由C语言实现,运用了C语言的二维数组,循环,函数等基本知识来完成的。
三、操作步骤 1.打印菜单1.菜单界面 2.初始化棋盘 3.打印棋盘 4.玩家下棋 5.电脑下棋 6.判断胜负
void menu()
{
printf("****************n");
printf("**1.play 0.exit**n");
printf("****************n");
}
2.初始化棋盘
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0, j = 0;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
board[i][j] = ' ';
}
}
}
3.打印棋盘
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++) {
int j = 0;
for (j = 0; j < col; j++) {
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|");
}
printf("n");
if (i < row - 1) {
int j = 0;
for (j = 0; j < col; j++) {
printf("---");
if (j < col -1)
printf("|");
}
}
printf("n");
}
}
4.玩家下棋
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0, y = 0;
printf("玩家下棋->n");
while (1)
{
printf("请输入坐标—>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐标被占用,请重新选择n");
}
}
printf("坐标非法,请重新输入n");
}
}
5.电脑下棋
//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("电脑下棋->n");
int x = 0, y = 0;
while (1)
{
x = rand() % row;//0~2
y = rand() % col;//0~2
if (board[x][y] == ' ') {
board[x][y] = '#';
break;
}
}
}
5.判断胜负
//判断输赢
//满了返回1,不满返回0
int IsFull(char board[ROW][COL], int row, int col)
{
int i = 0, 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, j = 0;
for(i = 0;i
int count = 0;
for (j = 0; j < col-1; j++)
{
if (board[i][j] == board[i][j + 1] && board[i][j] != ' ')
count++;
}
if(count == col - 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 (IsFull(board, row, col))
{
return 'Q';
}
//游戏继续
return 'C';
}
四、全部代码
1.game.h
#pragma once #include2.game.c#include #include #define ROW 3 #define COL 3 //初始化棋盘 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); //判断输赢 char IsWin(char board[ROW][COL], int row, int col); //判断棋盘是否满了 int IsFull(char board[ROW][COL], int row, int col);
#define _CRT_SECURE_NO_WARNINGS #include3.test.c#include"game.h" //初始化棋盘 void InitBoard(char board[ROW][COL], int row, int col) { int i = 0, 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; for (i = 0; i < row; i++) { int j = 0; for (j = 0; j < col; j++) { printf(" %c ", board[i][j]); if (j < col - 1) printf("|"); } printf("n"); if (i < row - 1) { int j = 0; for (j = 0; j < col; j++) { printf("---"); if (j < col -1) printf("|"); } } printf("n"); } } //玩家下棋 void PlayerMove(char board[ROW][COL], int row, int col) { int x = 0, y = 0; printf("玩家下棋->n"); while (1) { printf("请输入坐标—>"); scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else { printf("坐标被占用,请重新选择n"); } } printf("坐标非法,请重新输入n"); } } //电脑下棋 void ComputerMove(char board[ROW][COL], int row, int col) { printf("电脑下棋->n"); int x = 0, y = 0; while (1) { x = rand() % row;//0~2 y = rand() % col;//0~2 if (board[x][y] == ' ') { board[x][y] = '#'; break; } } } //判断输赢 //满了返回1,不满返回0 int IsFull(char board[ROW][COL], int row, int col) { int i = 0, 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, j = 0; for(i = 0;i int count = 0; for (j = 0; j < col-1; j++) { if (board[i][j] == board[i][j + 1] && board[i][j] != ' ') count++; } if(count == col - 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 (IsFull(board, row, col)) { return 'Q'; } //游戏继续 return 'C'; }
#define _CRT_SECURE_NO_WARNINGS #include#include #include #include"game.h" void menu() { printf("****************n"); printf("**1.play 0.exit**n"); printf("****************n"); } void game() { char ret = 0; char board[ROW][COL] = { 0 };//初始化棋盘 InitBoard(board, ROW, COL); DisplayBoard(board, ROW, COL); while (1) { PlayerMove(board, ROW, COL); //判断输赢 ret = IsWin(board, ROW, COL); if (ret != 'C') { break; } DisplayBoard(board, ROW, COL); ComputerMove(board, ROW, COL); // 判断输赢 if (ret != 'C') { break; } DisplayBoard(board, ROW, COL); } if (ret == '*') { printf("玩家赢!n"); } else if (ret == '#') { printf("电脑赢!n"); } else printf("平局n"); DisplayBoard(board, ROW, COL); } int main() { srand((unsigned int)time(NULL));//设置随机数 int input = 0; do { menu();//打印菜单 printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 2: printf("退出游戏n"); default: printf("选择错误!n"); break; } } while (input); return 0; }



