简单思路及实现步骤:
1、对于一个游戏来说,首先向用户显示的应该是游戏菜单,我们可以用一个函数ShowMenu来实现。该游戏菜单有两个选项,玩或者退出,我们直接让用户从键盘上输入选择,选择为1时,进入游戏,选择为2时,退出该游戏。作为开发者,我们当然希望用户多玩几次,所以使用了死循环。
2、如果选择玩游戏,我们用Game函数实现它的玩法。既然是玩游戏,就该有一定的顺序,我们调用函数PlayerMove为实现人的玩法,用ComputerMove实现电脑的玩法,我们遵循顾客至上的原则,所以先选择人走。
3、进入游戏后,我们应该将棋盘展现给用户,无论是人走还是电脑走,走前还是走后,我们都应该更新最新的棋盘,用函数ShowBoard,以使比赛顺利进行。
4、关于下棋的过程,对于用户来说,键盘输入即可,而对于及其而言,我们让他随机生成一个数填写进去,即实现了输入过程。
5、判断结果,如果棋盘被铺满,且用户和电脑都没赢,则为平局;如果棋盘有空余,要么是用户赢了,要么是电脑赢了
主函数
#include"chess.h"
int main()
{
int select = 0;
int quit = 0;
while (!quit)
{
ShowMenu();//显示菜单,让用户进行选择
scanf("%d", &select);
switch (select)
{
case 1:
Game();//select=1,调用Game函数,实现游戏的玩法
break;
case 2:
printf("byebye!\n");
quit = 1;//quit=1,跳出该循环
break;
default:
printf("select error,try again!\n");
break;
}
}
system("pause");
return 0;
}
头文件
#ifndef _CHESS_H_
#define _CHESS_H_
#include<stdio.h>
#include<windows.h>
#include<string.h>
#include<time.h>
#define ROW 3
#define COL 3
#define PLAYER_COLOR 'X'//人走的棋用X表示
#define COMPUTER_COLOR 'O'//电脑走用O表示
#pragma warning(disable:4996)
void Game();
void InitBoard(char board[][COL], int row, int col);//初始化数组
void ShowBoard(char board[][COL], int row, int col);//显示键盘
void PlayerMove(char board[][COL], int row, int col);//用户走
char Judge(char board[][COL], int row, int col);//判断游戏是否终止
void ComputerMove(char board[][COL], int row, int col);//电脑走
#endif
分别实现每个函数的功能
ShowMenu()函数打印菜单
void ShowMenu()
{
printf("###############################\n");
printf("########### 1.Play ############\n");
printf("########### 2.Exit ############\n");
printf("###############################\n");
printf("please select:");
}
PlayerMove()函数实现用户走
void PlayerMove(char board[][COL], int row, int col)
{
while (1)
{
int x = 0;
int y = 0;
printf("please enter pos<x,y>:");
scanf("%d%d", &x, &y);
//判断用户输入的坐标是否合法
if (x >= 1 && x <= 3 && y >= 1 && y <= 3)
{
//用户输入从1开始,数组下标从0开始,所以减1
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = PLAYER_COLOR;
break;
}
else
{
printf("enter error,try again!\n");
}
}
}
}
ComputerMove()实现电脑走
void ComputerMove(char board[][COL], int row, int col)
{
while (1)
{
int x = rand() % row;//调用rand函数生成随机数,使行范围在[0,2]
int y = rand() % col;//调用rand函数生成随机数,使列范围在[0,2]
if (board[x][y] == ' ')//判断该位置是否为空,电脑是否可继续落子
{
board[x][y] = COMPUTER_COLOR;
break;
}
}
}
Judge()函数判断
char Judge(char board[][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
//判断落子是否合法,每一行是否三子连珠
if (board[i][0] != ' ' && board[i][0] == board[i][1] && board[i][1] == board[i][2])
{
return board[i][0];
}
}
for (j = 0; j < col; j++)
{
//判断落子是否合法,每一列是否三子连珠
if (board[0][j] != ' ' && board[0][j] == board[1][j] && board[1][j] == board[2][j])
{
return board[0][j];
}
}
//判断落子是否合法,主对角线是否能三子连珠
if (board[1][1] != ' ' && board[0][0] == board[1][1] && board[1][1] == board[2][2])
{
return board[1][1];
}
//判断落子是否合法,次对角线是否能三子连珠
if (board[1][1] != ' ' && board[0][2] == board[1][1] && board[1][1] == board[2][0])
{
return board[1][1];
}
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
//说明没有实现三子连珠,棋盘未被铺满,继续执行
if (board[i][j] == ' ')
{
return 'N';
}
}
}
return 'E';//说明没有实现三子连珠,且棋盘已满,则为平局
}
ShowBoard()函数显示棋盘
void ShowBoard(char board[][COL], int row, int col)
{
system("cls");//清屏
int i = 0;
int j = 0;
printf(" | 1 | 2 | 3 |\n");
printf("---------------\n");
for (i=0; i < row; i++)
{
printf("%d |", i + 1);
for (j=0; j < col; j++)
{
printf(" %c |", board[i][j]);
}
printf("\n---------------\n");
}
printf("\n");
}
Game()函数为游戏的实现
void Game()
{
char result = '\0';
char board[ROW][COL];//定义数组棋盘
InitBoard(board, ROW, COL);
ShowBoard(board, ROW, COL);
srand((unsigned int)time(NULL));
while (1)
{
PlayerMove(board, ROW, COL);
ShowBoard(board, ROW, COL);
result = Judge(board, ROW, COL);
if (result != 'N')//每次走完都需判断
{
break;
}
ComputerMove(board, ROW, COL);
ShowBoard(board, ROW, COL);
result = Judge(board, ROW, COL);
if (result != 'N')
{
break;
}
}
switch (result)
{
case 'X':
printf("congratulations!you win!\n");
break;
case 'O':
printf("sorry,you lose\n");
break;
case 'E':
printf("equal!\n");
break;
default:
printf("bug?\n");
break;
}
运行结果
选择页面
输入页面
用户赢
电脑赢
平局
扫描二维码关注公众号,回复:
9499731 查看本文章