如何寫出代碼讓女朋友陪你玩游戲
- 三子棋
- 1.展示棋盤
- 2. 玩家落子
- 3.女朋友落子
- 4.判斷游戲輸贏
- 5.最終效果
- 猜數字
- 1.設立選單
- 2.生成亂數
- 3.進行數字判斷
- 4.最終效果
- 掃雷
- 1.初始化棋盤
- 2.展示棋盤
- 3.布置雷
- 4.排除雷
- 5.優化展示效果
- 6.最終展示結果
想在七夕這天有一個可以陪你玩游戲的甜甜的物件嗎?
學會以下三個代碼,超甜女友陪你過七夕啦!
> 博主水平有限,如果發現錯誤,一定要及時告知作者哦 o( ̄︶ ̄)o!感謝感謝!
> 博主的碼云 gitee,平常博主寫的程式代碼都在里面,
三子棋
七夕到了,沒有女朋友怎么辦?沒事~ 寫一個小游戲,讓女朋友陪你玩三子棋~
1.展示棋盤
這部分我折騰了很久,因為展示出來的效果是實作能通過更改ROW和COL的值來展示不同大小的棋盤
只能不斷的調整–觀察發現最后一行不列印橫線,最后一列不列印豎杠
void Displayboard(char board[ROW][COL], int row, int col)
{
int i, j,k;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if(j<col-1)
printf(" %c |", board[i][j]);
if (j == col-1 )
{
printf(" %c \n", board[i][j]);
}
}
for (j = 0;j<col; j++)
{
if (j <col-1 && i!=row-1)
{
printf("---|");
}
}
if (i != row - 1)
{
printf("---");
printf("\n");
}
}
}
效果如下:

通過更改ROW和COL的值來展示不同大小的棋盤:
三子棋:

五子棋:

七子棋:

2. 玩家落子
注意:每次落子完要重新列印一次棋盤
當輸入坐標錯誤或者已經有棋子的時候要進行相應的提示
void PlayerMove(char board[ROW][COL], int row, int col)//玩家落子
{
int x, y;
while (1)
{
printf("請玩家落子>");
printf("請輸入棋子行列坐標:\n");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')//陣列的真實下標從0開始
{
board[x - 1][y - 1] = '*';
}
else
{
printf("坐標被占用,請重新輸入");
}
}
else
printf("輸入坐標非法,請重新輸入\n");
Displayboard(board, ROW, COL);
}
}

3.女朋友落子
注意:這里需要生成亂數,并且參考相應的頭檔案
void ComputerMove(char board[ROW][COL], int row, int col)
{
int x, y;
printf("\n");
printf("女朋友下棋:\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
Displayboard(board, ROW, COL);
}
生成亂數:

頭檔案:

效果如下

4.判斷游戲輸贏
結局共有三個:女朋友贏,你贏,平局
根據四種回傳值來判段
你贏-- ‘*’
女朋友贏–’#’
平局–‘Q’
繼續–‘C’
char isWin(char board[ROW][COL], int row, int col)
{
//1.判斷輸贏
int i;
for (i = 0; i < row; i++)//判斷行是否相等
{
if (board[i][0] == board[i][1] && board[i][0] == board[i][2] && board[i][0] != ' ')
{
return board[i][0];
}
}
for (i = 0; i < row; i++)//判斷列是否相等
{
if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
if (board[2][0] == board[1][1] && board[0][2] == board[2][0] && board[2][0]!=' ')//判斷對角線
{
return board[2][0];
}
if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ')
{
return board[0][0];
}
//2.判斷平局
if (isFull(board, row, col) == 1)
{
return 'Q';
}
else return 'C';
}
5.最終效果
平局:

女朋友贏:

玩家贏:

最終的所有的代碼如下:
我的gitee–和女朋友玩的三子棋小游戲
猜數字
七夕到了,沒有女朋友怎么辦?沒事~ 寫一個小游戲,讓女朋友陪你玩猜數字~
在一定數值范圍內,游戲隨機生成一個數字,玩家輸入比亂數大的數字時,程式會提醒,數值大于目標數,反之亦然,通過不斷試錯,最終找出目標數字,此游戲可以重復玩,
1.設立選單
設立一個menu(),選單函式
void menu()
{
printf("***********");
printf("**1.play***");
printf("**0.exit***");
printf("***********");
}
因為游戲可以重復玩,所以需要執行一次,再進行回圈,因此選擇do…while()陳述句
#include<stdio.h>
#include<math.h>
void menu()
{
printf("***********");
printf("**1.play***");
printf("**0.exit***");
printf("***********");
}
int main()
{
int t;
do
{
menu();
printf("請選擇:》");
scanf("%d", &t);
switch (t)
{
case 1:
game();
break;
case 0:
printf("退出游戲");
break;
default:
printf("選擇錯誤");
break;
}
}while(input);
return 0;
}
選單如圖:

2.生成亂數
💡int rand(void) :回傳一個范圍在 0 到 RAND_MAX 之間的偽亂數,
💡RAND_MAX :是一個常量,它的默認值在不同的實作中會有所不同,但是值 ≥ 32767,
使用該函式,需要引頭檔案 #include<stdib.h>
💡 srand 函式是亂數發生器的初始化函式,
它初始化隨機種子,會提供一個種子,這個種子會對應一個亂數,如果使用相同的種子后面的 rand() 函式會出現一樣的亂數,如: srand(1); 直接使用 1 來初始化種子,不過為了防止亂數每次重復,常常使用系統時間來初始化,即使用 time函式來獲得系統時間,它的回傳值為從 00:00:00 GMT, January 1, 1970 到現在所持續的秒數,然后將time_t型資料轉化為(unsigned)型再傳給srand函式,即: srand((unsigned) time(&t)); 還有一個經常用法,不需要定義time_t型t變數,即: srand((unsigned) time(NULL)); 直接傳入一個空指標,因為程式中往往并不需要經過引數獲得的資料,
💡需要參考頭檔案 #include<time.h>

💡此時生成了亂數,但是如果輸入數字的時間過快,可能會輸出相同的數字,而且是遞增的,
所以srand((unsigned int)time(NULL))位置需要調整到主函式內,即:
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
.....

💡解決了生成亂數的問題,但是rand()函式生成的數字是0到32767,對于猜數字游戲來說,范圍太大,將范圍調整成1~100,
想要輸出給定范圍之內的亂數,需要使用 rand() % (b - a + 1)+ a,顯然,rand()% (b - a + 1)的范圍是[0,b - a],再加上a之后的范圍就是[a,b]下面的代碼是生成[0,100]]范圍內的亂數,

3.進行數字判斷
void game()
{
int ret = 0;
ret = rand()%100+1;
int guess = 0;
printf("%d\n", ret);
printf("猜數字游戲\n");
while (1)
{
scanf("%d", &guess);
if (guess > ret)
{
printf("女朋友:猜測過大,請重新猜");
}
else if (guess < ret)
{
printf("女朋友:猜測過小,請重新猜");
}
else
{
printf("恭喜你,猜對啦!╰(*°▽°*)╯"):
}
}
}
4.最終效果
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("***********\n");
printf("**1.play***\n");
printf("**0.exit***\n");
printf("***********\n");
}
void game()
{
int ret = 0;
ret = rand()%100+1;
int guess = 0;
printf("猜數字游戲\n");
while (1)
{
printf("女朋友:請猜數字>");
scanf("%d", &guess);
if (guess > ret)
{
printf("女朋友:猜測過大,請重新猜\n");
}
else if (guess < ret)
{
printf("女朋友:猜測過小,請重新猜\n");
}
else
{
printf("女朋友:恭喜你,猜對啦!╰(*°▽°*)╯\n"); break;
}
}
}
int main()
{
int input;
srand((unsigned int)time(NULL));
do
{
menu();
printf("請選擇:》\n");
printf("\n");
scanf("%d", &input);
switch (input)
{
case 1:
printf("女朋友:準備開始游戲拉!\n");
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("選擇錯誤\n");
break;
}
} while (input);
return 0;
}

最終的所有的代碼如下:
我的gitee–和女朋友玩的猜數字小游戲
是不是感覺超級甜的鴨!!!!!

掃雷
七夕到了,沒有女朋友怎么辦?沒事~ 寫一個小游戲,讓女朋友陪你玩掃雷~

首先創建:
game.c的源檔案–>游戲函式的實作
test.c的源檔案–>測驗使用
game.h的頭檔案–>游戲函式的宣告

一共需要創建兩個二維陣列:

如果要實作9*9的陣列雷區,則實際要創建11 *11的陣列雷區,為了防止陣列越界,

1.初始化棋盤
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{
int i, j;
for (i = 0; i < ROWS; i++)
{
for (j = 0; j < COLS; j++)
{
board[i][j] = set;
}
}
}
void game()
{
char mine[ROWS][COLS] = { 0 };//存放雷的資訊
char show[ROWS][COLS] = { 0 };//存放排查雷的資訊
//初始化棋盤
InitBoard(mine, ROWS, COLS ,'0');
InitBoard(show, ROWS, COLS,'*');
//展示棋盤
DisplayBoard(mine, ROWS, COLS);
DisplayBoard(show, ROWS, COLS);
}
2.展示棋盤
void DisplayBoard(char board[ROWS][COLS], int rows, int cols)
{
int i, j;
for (i = 0; i < 10; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i < ROWS-1; i++)
{
printf("%d ", i);
for (j = 1; j < COLS-1; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("\n");
}

最外層的行列可以讓玩家容易分清楚是在第幾行第幾列
3.布置雷
void SetMine(char board[ROWS][COLS], int row, int col)
{
int count = EAST_COUNT;
while (count)
{ //1.生成隨機下標
int x = rand() % row + 1;
int y = rand() % col + 1;
if (board[x][y] != '1')
{
board[x][y] = '1';
count--;
}
}
}

0 1 2 3 4 5 6 7 8 9
1 1 0 0 0 0 0 0 1 0
2 0 0 0 0 0 0 0 0 0
3 0 0 0 1 0 0 0 0 0
4 1 0 0 0 1 1 0 0 0
5 0 0 0 0 0 1 0 0 0
6 0 0 0 0 0 0 0 0 0
7 0 0 0 0 0 0 0 0 0
8 0 0 0 0 0 0 0 0 0
9 0 1 0 1 0 0 0 0 0
4.排除雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)//排查雷
{
int x, y;
printf("輸入要排查雷的坐標:>");
scanf("%d%d", &x, &y);
while (1)
{
if (x >= 1 && x <= 9 && y >= 1 && y <= 9)
{
if (mine[x][y] == '1')
{
printf("很遺憾,你被炸死了,女朋友很傷心?·°(???﹏???)°·?");
DisplayBoard(show, ROWS, COLS);
break;
}
else
{
int count = GetMineCount(mine, x, y);
show[x][y] = count+'0';
DisplayBoard(show, ROWS, COLS);
break;
}
}
else
printf("輸入坐標非法,請重新輸入");
}
下圖說明在2 5坐標的周圍8個格子中一共有一個雷

5.優化展示效果
(1)展開一片
如何實作這種可以展開一大片的效果呢?
規則:滿足該坐標不是雷,并且周圍8個位置也不是雷,就會展開一片

宣告:以下代碼來自點擊到空白格子時自動展開
//連續展開
void blankOpen(int r,int c)
{
//打開格子
map[r][c] -= 20;
count++;
//點開后遍歷九宮格
for (int m=r-1;m<=r+1;m++)
{
for (int n=c-1;n<=c+1;n++)
{
if (m >= 1 && m <= ROW && n >= 1 && n <= COL) //保證是游戲區
{
if (map[m][n] >= 19 && map[m][n] <= 28) //必須為空白格
{
if (map[m][n]!=20)
{
map[m][n] -= 20;
count++;
}
else
{
blankOpen(m,n);
}
}
}
}
}
}
此時就需要用到遞回了
(2)顯示剩余的雷數

宣告:以下代碼來自關于顯示剩余的雷數
int print()
{
char num[MINE_NUM];
int n = 0;
for (int r = 1; r <= ROW; r++)
{
for (int c = 1; c <= COL; c++)
{
if (map[r][c] == 19 || map[r][c] == -1)
{
n++;
}
}
}
outtextxy(770, 200, "剩余的雷:");
sprintf(num, "%02d", n);
outtextxy(790, 230, num);
printf("\n\n\n");
printf("%02d",n);
}
6.最終展示結果
1.排雷失敗:(1代表雷,0代表非雷)

2.排雷成功

最終的所有的代碼如下:
我的gitee–和女朋友玩的掃雷小游戲

當然啦!祝愿所有點贊的小朋友在七夕這天都能識訓幸福與快樂!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/294058.html
標籤:其他
上一篇:【Golang】??走進 Go 語言?? 第十五課 遞回 & 介面
下一篇:C語言實作三子棋(井字棋)
