用C語言實現(xiàn)三子棋小游戲
本文實例為大家分享了C語言實現(xiàn)三子棋小游戲的具體代碼,供大家參考,具體內(nèi)容如下
1. 規(guī)則介紹
三子棋是一種民間傳統(tǒng)游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等。將正方形對角線連起來,相對兩邊依次擺上三個雙方棋子,只要將自己的三個棋子走成一條線,對方就算輸了。但是,有很多時候會出現(xiàn)和棋的情況。
2. 編寫思路
2.1 選擇界面的編寫
提供選擇界面(設計者可根據(jù)自己的喜好設定棋盤的大??;輸入何種數(shù)字或者符號開始或者退出游戲也可由設計者自己確定數(shù)字)
static void Menu()
{
printf("---------------------\n");
printf("| 1: Play 2: Exit |\n");
printf("---------------------\n");
printf("Please Select# ");
}
2.2 棋盤的編寫
首先我們應該實現(xiàn)三行三列的棋盤,為后續(xù)使用方便,所以我們在前面宏定義行(ROW 3)列(COL 3)都為3;設計者也可以根據(jù)自己的喜歡設置不同樣式的棋盤;
static void Showboard(char board[][COL], int row, int col)
{
printf(" | 1 | 2 | 3 |\n");
printf("---------------------\n");
for (int i = 0; i < row; i++){
printf("%d |", i + 1);
for (int j = 0; j < col; j++){
printf(" %c |", board[i][j]);
}
printf("\n---------------------\n");
}
}
2.3 玩家落子
設定讓玩家以(x,y)坐標的方式?jīng)Q定落子方位,在玩家輸入后,我們要設定判斷程序,判斷玩家輸入的坐標是否合法(在我們設定的坐標范圍內(nèi))、輸入的位置是否已經(jīng)落子;如果合法,且位置沒被占用,則在輸入的位置用符號代替玩家的棋子,這里用 ‘ X ' 表示玩家的棋子,為后續(xù)容易修改,在前面宏定義。
static void PlayerMove(char board[][COL], int row, int col)
{
int x = 0;
int y = 0;
int quit = 0;
while (!quit){
printf("請輸入你的位置# ");
scanf("%d %d", &x, &y);
if (x<1 || x>3 || y<1 || y>3){
printf("你輸入的坐標有誤!\n");
continue;
}
else if (board[x - 1][y - 1] != ' '){
printf("該坐標已被占用!\n");
continue;
}
else {
board[x - 1][y - 1] = P_COLOR;
break;
}
}
}
2.4 三子連珠判定
設定三子連珠所有可能的情況,然后判定是否可以繼續(xù)進行游戲(返回NEXT),或者和棋(返回DRAW);
static char Judge(char board[][COL], int row, int col)
{
for (int i = 0; i < row; i++){
if (board[i][0] == board[i][1] && \
board[i][1] == board[i][2] && \
board[i][0] != ' '){
return board[i][0];
}
}
for (int j = 0; j < col; j++){
if (board[0][j] == board[1][j] && \
board[1][j] == board[2][j] && \
board[0][j] != ' '){
return board[0][j];
}
}
if (board[0][0] == board[1][1] && \
board[1][1] == board[2][2] && \
board[0][0] != ' '){
return board[1][1];
}
if (board[0][2] == board[1][1] && \
board[1][1] == board[2][0] && \
board[1][1] != ' '){
return board[1][1];
}
for (int i = 0; i < row; i++){
for (int j = 0; j < col; j++){
if (board[i][j] == ' '){
return NEXT;
}
}
}
return DRAW;
}
2.5 電腦落子方式
電腦落子方式我們采用生成隨機數(shù)
static void ComputerMove(char board[][COL], int row, int col)
{
while (1){
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' '){
board[x][y] = C_COLOR;
break;
}
}
}
2.6 游戲邏輯
生成隨機數(shù),以便電腦落子使用;
生成二維數(shù)組作為棋盤,傳入行和列,然后用memset初始化;
展示棋盤;
玩家落子;
判定落子是否合法;如果合法則輪到計算機落子;
判斷計算機落子是否合法;如果合法則繼續(xù)循環(huán);
設定判斷循環(huán)出口;
static void Game()
{
srand((unsigned long)time(NULL));
char board[ROW][COL];
memset(board, ' ', sizeof(board));
char result = 'x';
do{
Showboard(board, ROW, COL);
PlayerMove(board, ROW, COL);
result = Judge(board, ROW, COL);
if (result != NEXT){
break;
}
ComputerMove(board, ROW, COL);
result = Judge(board, ROW, COL);
if (result != NEXT){
break;
}
} while (1);
Showboard(board, ROW, COL);
if (P_COLOR == result){
printf("you win!\n");
}
else if (C_COLOR == result){
printf("you loss!\n");
}
else{
printf("draw!\n");
}
}
2.7 設定游戲開始or退出
首先展示菜單;輸入1開始游戲;輸入2則退出;將上述代碼整合后如下。
3. 整體代碼
#include<stdivo.h>
#include<time.h>
#include<Windows.h>
#pragma warning(disable:4996)
#define ROW 3
#define COL 3
#define P_COLOR 'X'
#define C_COLOR 'O'
#define NEXT 'N'
#define DRAW 'D'
static void Menu()
{
printf("---------------------\n");
printf("| 1: Play 2: Exit |\n");
printf("---------------------\n");
printf("Please Select# ");
}
static void Showboard(char board[][COL], int row, int col)
{
printf(" | 1 | 2 | 3 |\n");
printf("---------------------\n");
for (int i = 0; i < row; i++){
printf("%d |", i + 1);
for (int j = 0; j < col; j++){
printf(" %c |", board[i][j]);
}
printf("\n---------------------\n");
}
}
static void PlayerMove(char board[][COL], int row, int col)
{
int x = 0;
int y = 0;
int quit = 0;
while (!quit){
printf("請輸入你的位置# ");
scanf("%d %d", &x, &y);
if (x<1 || x>3 || y<1 || y>3){
printf("你輸入的坐標有誤!\n");
continue;
}
else if (board[x - 1][y - 1] != ' '){
printf("該坐標已被占用!\n");
continue;
}
else {
board[x - 1][y - 1] = P_COLOR;
break;
}
}
}
static char Judge(char board[][COL], int row, int col)
{
for (int i = 0; i < row; i++){
if (board[i][0] == board[i][1] && \
board[i][1] == board[i][2] && \
board[i][0] != ' '){
return board[i][0];
}
}
for (int j = 0; j < col; j++){
if (board[0][j] == board[1][j] && \
board[1][j] == board[2][j] && \
board[0][j] != ' '){
return board[0][j];
}
}
if (board[0][0] == board[1][1] && \
board[1][1] == board[2][2] && \
board[0][0] != ' '){
return board[1][1];
}
if (board[0][2] == board[1][1] && \
board[1][1] == board[2][0] && \
board[1][1] != ' '){
return board[1][1];
}
for (int i = 0; i < row; i++){
for (int j = 0; j < col; j++){
if (board[i][j] == ' '){
return NEXT;
}
}
}
return DRAW;
}
static void ComputerMove(char board[][COL], int row, int col)
{
while (1){
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' '){
board[x][y] = C_COLOR;
break;
}
}
}
static void Game()
{
srand((unsigned long)time(NULL));
char board[ROW][COL];
memset(board, ' ', sizeof(board));
char result = 'x';
do{
Showboard(board, ROW, COL);
PlayerMove(board, ROW, COL);
result = Judge(board, ROW, COL);
if (result != NEXT){
break;
}
ComputerMove(board, ROW, COL);
result = Judge(board, ROW, COL);
if (result != NEXT){
break;
}
} while (1);
Showboard(board, ROW, COL);
if (P_COLOR == result){
printf("you win!\n");
}
else if (C_COLOR == result){
printf("you loss!\n");
}
else{
printf("draw!\n");
}
}
int main()
{
int quit = 0;
int select = 0;
while (!quit){
Menu();
scanf("%d", &select);
switch (select){
case 1:
Game();
printf("Play Again?\n");
break;
case 2:
quit = 1;
break;
default:
printf("\n");
break;
}
}
printf("ByeBye!\n");
system("pause");
return 0;
}
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
VS2022+libtorch+Cuda11.3安裝測試教程詳解(調(diào)用cuda)
這篇文章主要介紹了VS2022+libtorch+Cuda11.3安裝測試(調(diào)用cuda),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05
使用?Visual?Studio?2022?開發(fā)?Linux?C++?應用程序的過程詳解
Visual?Studio?2022?引入了用于?Linux?C++?開發(fā)的本機?WSL2?工具集,可以構建和調(diào)試?Linux?C++?代碼,并提供了非常好的?Linux?文件系統(tǒng)性能、GUI?支持和完整的系統(tǒng)調(diào)用兼容性,這篇文章主要介紹了使用Visual?Studio?2022?開發(fā)?Linux?C++?應用程序,需要的朋友可以參考下2021-11-11
VC++ loadlibrary()加載三方dll失敗, 返回錯誤碼:126的解決方法
今天在編寫VC++ loadlibrary()加載三方dll是總是失敗,并且返回錯誤碼:126,這里就為大家分享一下具體的解決方法2021-03-03

